|
這是自己之前練習(xí)51單片機(jī)代碼整合時(shí)寫的簡(jiǎn)單程序。
本程序通過設(shè)置定時(shí)器0設(shè)置小車PWM來調(diào)速,通過藍(lán)牙串口和手機(jī)APP通信,遙控小車或者避障
下面直接貼出自己的代碼
- /*本程序通過設(shè)置定時(shí)器0設(shè)置小車PWM來調(diào)速
- 通過藍(lán)牙串口和手機(jī)APP通信,遙控小車或者避障
- */
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include <intrins.h>
- #define LED P0 //顯示速度等級(jí)
- #define Output P2 //2^0~2^4為電機(jī)輸出腳
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- 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; //設(shè)置為工作方式1
- TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
- PCON=0X00; //波特率不加倍
- TH1=0XFD; //計(jì)數(shù)器初始值設(shè)置,注意波特率是9600
- TL1=0XFD; //晶振11.0592M
- RI=0;
- ES=1; //打開接收中斷
- TR1=1; //打開計(jì)數(shù)器
- PS=1; //設(shè)置串口優(yōu)先級(jí)第一
-
- TH0 = 0xff; //調(diào)速部分
- TL0 = 0xc8;
- ET0=1;//定時(shí)器0中斷允許
- TR0=1;//打開定時(shí)器0
- TMOD|=0X01;//定時(shí)器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 //藍(lán)牙串口中斷
- {
- u8 receiveData;
- receiveData=SBUF;//出去接收到的數(shù)據(jù)
- RI = 0;//清除接收中斷標(biāo)志位
- switch(receiveData) //通過紅外接收值決定下一步動(dòng)作
- {
- case '2': Obuf=0xA0; break; //前進(jìn) //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;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0; //清除發(fā)送完成標(biāo)志位
- }
- void Time0(void) interrupt 1
- {
- TH0 = 0xff; //定時(shí)周期太小會(huì)影響到藍(lán)牙工作,可以把藍(lán)牙串口優(yōu)先級(jí)設(shè)置到最高解決
- 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;
- }
復(fù)制代碼
|
|