51单片机,蓝牙控制舵机程序 #include<AT89x52.H> #include <intrins.h> unsigned char count; //0.5ms次数标识 sbit pwm =P0^4; //PWM信号输出 #define uint unsigned int #define uchar unsigned char uchar count = 0; uchar scount = 15; void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void init() { SCON=0x50; TMOD|=0x20; TH1=0xfd; TL1=0xfd; TCON|=0x40; TR1=1; ES = 1; EA=1; } void Time0_Init() //定时器初始化 { TMOD|= 0x01; //定时器0工作在方式1 IE|= 0x82; TH0 = 0xff; TL0 = 0x9c; //11.0592MZ晶振 TR0=1; //定时器开始 } /* 定时器0中断服务程序 */ void Time0() interrupt 1 { TH0= 0xff; //重装初值0.1ms TL0= 0x9c; if(count <= scount) //控制占空比左右 { //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波 pwm = 1; } else { pwm = 0; } count=(count+1); //0.5ms次数加1 count=count%200; //次数始终保持为40 即保持周期为20ms } void main() { count=0; Time0_Init(); init(); } //串口中断 void time() interrupt 4 { unsigned char receiveData; receiveData=SBUF;//出去接收到的数据 RI = 0;//清除接收中断标志位 SBUF=receiveData;//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; switch(SBUF) { case '1':scount--; if(scount <= 5) { scount = 5; } count = 0; break; case '2':scount++; if(scount >= 25) { scount = 25; } count = 0; break; case '3':scount--; if(scount<= 10) { scount = 10; } count = 0;break; case '4':scount++; if(scount >= 20) { scount = 20; } count = 0; break; } }
|