|
想做個(gè)小車
是用舵機(jī)轉(zhuǎn)向
在網(wǎng)上查了不少舵機(jī)的資料
可以改變PWM固定的調(diào)整舵機(jī)轉(zhuǎn)向
但是這樣每次寫,燒錄,記錄角度的效率太低了
所以用Uart通信來(lái)改變PWM的值
但是遇到個(gè)問題
程序運(yùn)行
在電腦輸入一次數(shù)值可以有效調(diào)節(jié)一次舵機(jī)
然后在串口調(diào)試助手再次輸入數(shù)據(jù)就無(wú)效了
請(qǐng)大神們多多指導(dǎo),感激不盡!
- #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; /*設(shè)初值*/
- TMOD |= 0x01;
- Motor=1;
- a=1500; /*數(shù)值 1500 即對(duì)應(yīng) 1.5ms,為舵機(jī)的中間 90 度的位置*/
- c=a;
- TH0=-(a/256);
- TL0=-(a%256); /*設(shè)定定時(shí)器初始計(jì)數(shù)值*/
- buf = Rxddata;
- while(1)
- {
-
- if(cmdArrived)
- {
- cmdArrived = 0;
- a = StrToInt(Rxddata);
- }
- }
- }
- unsigned int StrToInt(unsigned char *str) //接收到的數(shù)據(jù)轉(zhuǎn)為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,為一個(gè)周期的時(shí)間*/
- TH0=-(c/256);
- TL0=-(c%256); /*重新定義計(jì)數(shù)初值*/
- if(c>=500&&c<=2500)
- c=a;
- else
- c = 20000-a; /*判斷脈寬是否在正常范圍之內(nèi)*/
- }
-
- void ConfigUART(unsigned int baud) //設(shè)置波特率
- {
- 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;
- }
- }
復(fù)制代碼
|
|