這是自己之前練習51單片機代碼整合時寫的簡單程序。
本程序通過設置定時器0設置小車PWM來調速,通過藍牙串口和手機APP通信,遙控小車或者避障
下面直接貼出自己的代碼
- /*本程序通過設置定時器0設置小車PWM來調速
- 通過藍牙串口和手機APP通信,遙控小車或者避障
- */
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include <intrins.h>
- #define LED P0 //顯示速度等級
- #define Output P2 //2^0~2^4為電機輸出腳
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- bit switch_track=0;
- sbit track_L=P3^7; //紅外避障——左邊
- sbit track_R=P3^6; //右邊
- u8 count,buf,Obuf,PWM;
- u16 speed=30;
- u8 code smgduan[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
- void BluetoothInit()
- {
- SCON=0X50; //設置為工作方式1
- TMOD=0X20; //設置計數器工作方式2
- PCON=0X00; //波特率不加倍
- TH1=0XFD; //計數器初始值設置,注意波特率是9600
- TL1=0XFD; //晶振11.0592M
- RI=0;
- ES=1; //打開接收中斷
- TR1=1; //打開計數器
- PS=1; //設置串口優先級第一
-
- TH0 = 0xff; //調速部分
- TL0 = 0xc8;
- ET0=1;//定時器0中斷允許
- TR0=1;//打開定時器0
- TMOD|=0X01;//定時器0,工作方式1
- EA=1; //打開總中斷
- }
- void Bizhang()
- {
- if(track_L==0&&track_R==0) Obuf=0xa0;//有障礙 //紅外避障部分
- if(track_L==1&&track_R==0) Obuf=0x60;//TurnLeft();
- if(track_L==0&&track_R==1) Obuf=0x90;//TurnRight();
- if(track_L==1&&track_R==1) Obuf=0xa0;//直走
- }
- void main()
- {
- BluetoothInit();
- while(1)
- {
- P0=~smgduan[speed/10];
- if(switch_track==1) //通過switch_track的值選擇是否避障
- {
- Bizhang();
- }
- }
- }
- void Usart() interrupt 4 //藍牙串口中斷
- {
- u8 receiveData;
- receiveData=SBUF;//出去接收到的數據
- RI = 0;//清除接收中斷標志位
- switch(receiveData) //通過紅外接收值決定下一步動作
- {
- case '2': Obuf=0xA0; break; //前進 //Obuf 指令
- case '5': Obuf=0x00; break; //停
- case '8': Obuf=0x50; break; //后退
- case '4': Obuf=0x60; break; //左
- case '6': Obuf=0x90; break; //右
- case '1': if(speed>=10)speed-=10; break; //減速
- case '3': if(speed<=90)speed+=10; break; //加速
- case '7': switch_track=~switch_track; break;
- }
- SBUF=receiveData;//將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- }
- void Time0(void) interrupt 1
- {
- TH0 = 0xff; //定時周期太小會影響到藍牙工作,可以把藍牙串口優先級設置到最高解決
- TL0 = 0xc8;
- count++;
- if(count<=speed) PWM=1; //控速
- else if(count<=100) PWM=0;
- else count=0;
- if(PWM==0)buf=0x00;
- else buf=0xf0;
- Output=Obuf&buf;
- }
復制代碼
|