|
想做个小车
是用舵机转向
在网上查了不少舵机的资料
可以改变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;
- }
- }
复制代码
|
|