在运行程序时经常出现蓝牙模块断线及舵机只出声不动的问题,怀疑和中断以及电压有关。代码如下:
#include <REGX52.H>
#include "timer0.h"
#include "Uart.h"
//模拟舵机控制原理:0~180°;0.5ms-----0度;1.0ms-----45度;1.5ms-----90度;2.0ms-----135度;2.5ms-----180度
//电机控制原理:1ms占空比最小速度 2ms占空比最大速度 区间内模拟调速
sbit SG_PWM = P1^1; //信号控制引脚
unsigned char count = 0; //计次 赋初值为0
unsigned char PWM_count = 0; //0--0度,2--45度,4--90度,6--135度,8--180度
void main()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
ET0 = 1; //打开定时器0的中断
TF0 = 0; //清除溢出中断标志位
TR0 = 1; //定时器0开始计时
EA = 1; //开总中断
PCON |= 0x80; //使能波特率加倍
SCON = 0x50; //接收8位数据
TMOD &= 0x0F; //清除定时器1模式
//00
TMOD |= 0x20; //设定定时器8为自动
TL1 = 0xFA; //设定初始值
TH1 = 0xFA; //设定初始值
ET1 = 0;
TR1 = 1;
EA = 1;
ES =1 ;
while(1)
{
}
}
void Timer0() interrupt 1 //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
TL0 = 0x33;
TH0 = 0xFE; //重新赋计数初值为0.5ms
count++; //计次,每500us count+1
count%=40; //周期为20ms
if(count<PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
void UART_Routine() interrupt 4 //串口中断服务函数
{
if(RI==1) //如果接收中断标志位为1
{
P1=SBUF; //发送的数据SBUF,赋给P1
if(P1==0X01) //0x01这个值可以通过蓝牙调试器编辑模式设置
{
PWM_count=1;
}
if(P1==0X02)
{
PWM_count=2;
}
if(P1==0X03)
{
PWM_count=3;
}
if(P1==0X04)
{
PWM_count=4;
}
if(P1==0X05)
{
PWM_count=5;
}
RI=0; //接收中断标志位软件清零
}
}