在网上看到的一个PWM控制双舵机的程序,为什么主函数里的循环是空的?程序是对的吗?求解
sbit SEV_PWM = P0^0; //上下舵机信号位 sbit SEH_PWM = P0^1; //左右舵机信号位 unsigned char count = 0; unsigned char SEV_count = 15; unsigned char SEH_count = 15; /* 串口初始化、定时器T0、T1初始化 */ void Com_Init() { IP = 0x08; PCON &= 0x7F; TMOD &= 0x00; TMOD |= 0x21; //定时器0设置为16为定时器方式1,定时器1配置波特率为自动重载方式2 SCON= 0x50; //串口工作在方式1,8位异步通信 TH1 = 0xfd; //定时器1设置为在11.0592下波特率为9600 TL1 = 0xfd; ES = 1; //打开串口中断 ET1 = 0; //关闭定时器1中断 TR1 = 1; //打开定时器1 TH0 = 0xff; //配置定时器0初值,溢出时间为0.1ms TL0 = 0xa4; ET0 = 1; //打开定时器0中断 TR0 = 1; //开启定时器0 } /* 定时器0中断服务程序 */ void Time0_Int() interrupt 1 { TR0 = 0; //关闭定时器0 TH0 = 0xff; //重装初值0.1ms TL0 = 0xa4; //舵机1 if(count <= SEH_count) //控制占空比左右 { //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波 SEH_PWM = 1; } else { SEH_PWM = 0; } //舵机2 if(count <= SEV_count) //控制占空比上下 { SEV_PWM = 1; } else { SEV_PWM = 0; } count++; if (count >= 200) //T = 20ms则定时器计数变量清0 { count = 0; } TR0 = 1; //开启定时器0 } void main() { Com_Init(); while(1) { ; } } /* 串口中断函数 */ void uart_ser() interrupt 4 { if (RI == 0) { return; } ES = 0; RI = 0; command = SBUF; //将接收到的数据传给command switch(command) { case 'f': //舵机向上转 { SEV_count++; if(SEV_count >= 25) { SEV_count = 25; } count = 0; //占空比参数t改变,让定时器重新计数 break; } case 'g': { SEV_count--; if(SEV_count <= 5) { SEV_count = 5; } count = 0; break; } case 'h': { SEH_count++; if(SEH_count >= 25) { SEH_count = 25; //保持角度180度。 } count = 0; break; } case 'i': { SEH_count--; if(SEH_count <= 5) //保持角度0度 { SEH_count = 5; } count = 0; break; } case 'k': //舵机复位 { SEH_count = 15; SEV_count = 15; count = 0; break; } default: { break; } } ES = 1; //打开串口 }
|