标题:
利用Uart通信调试舵机转向遇到的问题
[打印本页]
作者:
DylanMingan
时间:
2017-12-14 19:08
标题:
利用Uart通信调试舵机转向遇到的问题
想做个小车
是用舵机转向
在网上查了不少舵机的资料
可以改变PWM固定的调整舵机转向
但是这样每次写,烧录,记录角度的效率太低了
所以用Uart通信来改变PWM的值
但是遇到个问题
程序运行
在电脑输入一次数值可以有效调节一次舵机
然后在串口调试助手再次输入数据就无效了
请大神们多多指导,感激不尽!
#include<reg52.h>
sbit Motor=P1^4;
unsigned char Rxddata[4];
unsigned int a,c;
bit cmdArrived = 0;
unsigned char *buf;
void ConfigUART(unsigned int baud);
unsigned int StrToInt(unsigned char *str);
void main()
{
EA = 1;
ConfigUART(9600);
ET0 = 1;
TF0 = 0;
TR0 = 1;
TMOD &= 0xF0; /*设初值*/
TMOD |= 0x01;
Motor=1;
a=1500; /*数值 1500 即对应 1.5ms,为舵机的中间 90 度的位置*/
c=a;
TH0=-(a/256);
TL0=-(a%256); /*设定定时器初始计数值*/
buf = Rxddata;
while(1)
{
if(cmdArrived)
{
cmdArrived = 0;
a = StrToInt(Rxddata);
}
}
}
unsigned int StrToInt(unsigned char *str) //接收到的数据转为int格式
{
unsigned int temp = 0;
while(*str!= 0)
{
if((*str < '0') || (*str > '9'))
{
break;
}
temp = temp *10 +(*str - '0');
str++;
}
return temp;
}
void InterrupPWM() interrupt 1
{
Motor=~Motor; /*输出取反*/
c=20000-c; /*20000 代表 20 ms,为一个周期的时间*/
TH0=-(c/256);
TL0=-(c%256); /*重新定义计数初值*/
if(c>=500&&c<=2500)
c=a;
else
c = 20000-a; /*判断脉宽是否在正常范围之内*/
}
void ConfigUART(unsigned int baud) //设置波特率
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 256 - (11059200/12/32)/baud;
TL1 = TH1;
ES = 1;
TR1 = 1;
ET1 = 0;
}
void InterruptUART() interrupt 4
{
if(RI)
{
RI = 0;
cmdArrived = 1;
*buf = SBUF;
SBUF = *buf++;
}
if(TI)
{
TI = 0;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1