disdata[7]=16; if(disdata[2]==0) {
disdata[2]=0x10;//如果十位为零则不显示 } display(); }
void int0() interrupt 0 using 0 {
count++;
if (dat_t>=1000) {
speed=(count-1)*10/12; dispflag=1; count=0;
dat_t=0; }
}
void timer0() interrupt 1 using 1 {
TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比 1ms (65536-1000=fc18) TL0=0x18; time++; dat_t++;
if(time>period) time=0;
if(time<=PWM_h) /*高电平持续时间结束,变低*/ PWM_out=1; /*经过反相器反相*/
else if((time>PWM_h)&&(time<=period)) /*周期时间到,变高*/ { // time=0;
PWM_out=0; /*经过反相器反相*/ }
// if(time==period) time=0; }
void main() {
uchar flag0=0; P1=0x00;
PWM_out=0; speed=0;
speed_disp();
TMOD=0x01; /*定时器0方式1*/
TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比 1ms (65536-1000=fc18) TL0=0x18; dat_t=0;
ET0=1; /*开定时器0中断*/ TR0=1; /*启动定时器0*/ IT0=1; EX0=1; EA=1; while(1) {
if(mRun==0) {
EA=1; /*开CPU中断*/ flag0=1; if (dispflag==1) {
dispflag=0;
speed_disp(); } }
if(mRun==1) {
EA=0; /*关CPU中断*/ PWM_out=0; if( flag0==1) { speed=0;
speed_disp(); flag0=0; } }
} }
附加题
修改程序,使电机从高速到低速再到高速,反复循环 程序
#include
typedef unsigned char uchar; typedef unsigned int uint; sbit PWM_out=P1^7; sbit mRun=P2^0; sbit Din=P1^0;// sbit CLK=P1^1;//
uint period=300; uint time=0; uint PWM_h=80; uint count=0; uint speed=0; uint dat_t=0; uint turn_flag=1; uchar dispflag=0;
uchar data disdata[8]; unsigned char code LED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40 };//0-F , ,-
void delay(int count) {
unsigned int i;
for(i=0;i uchar LED_code[8]; uchar i,j,chr,sel; /////////////// for(i=0;i<8;i++) LED_code[i]=LED_Map[disdata[i]]; // LED_code[i]=0x3f; for(i=0;i<8;i++) { chr= LED_code[i]; // if(i==1) chr= chr|0x80; sel=0x80; for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1; delay(1); } } } void speed_disp()//速度显示 { // speed=123; disdata[0]=speed/100;//取10位 disdata[1]=speed0/10;//取个位 disdata[2]=speed;//取个位 disdata[3]=16; disdata[4]=16; disdata[5]=16; disdata[6]=16; disdata[7]=16; if(disdata[2]==0) { disdata[2]=0x10;//如果十位为零则不显示 } display(); } void int0() interrupt 0 using 0 { count++; if (dat_t>=1000) { speed=(count-1)*10/12; dispflag=1; count=0; dat_t=0; } } void timer0() interrupt 1 using 1 { TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比(65536-1000=fc18) 1ms TL0=0x18; time++; dat_t++; if(time>period) time=0; if(time<=PWM_h) /*高电平持续时间结束,变低*/ PWM_out=1; /*经过反相器反相*/ else if((time>PWM_h)&&(time<=period)) /*周期时间到,变高*/ { // time=0; PWM_out=0; /*经过反相器反相*/ } // if(time==period) time=0; } void main() { uchar flag0=0; P1=0x00; PWM_out=0; speed=0; speed_disp(); TMOD=0x01; /*定时器0方式1*/ TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比(65536-1000=fc18) TL0=0x18; dat_t=0; ET0=1; /*开定时器0中断*/ TR0=1; /*启动定时器0*/ IT0=1; EX0=1; EA=1; while(1) { if(mRun==0) { EA=1; /*开CPU中断*/ flag0=1; if (dispflag==1) { dispflag=0; speed_disp(); PWM_h=200; turn_flag=0; 1ms