蓝牙遥控是依靠单片机的串口通讯来实现的功能。这周我主要学习的内容是串口通讯。在完成学习后我用之前买避障小车时顺便买的蓝牙模块做了一个升级版智能小车,它可以通过蓝牙模块实现避障模式与蓝牙遥控模式的切换以及速度的调整。 蓝牙模块的接线:将vcc与gnd接在单片机最小系统的5v供电口上,将txd和rxd分别接在单片机的rxd与txd上 下面是程序(头文件之前的笔记中有,在此不做赘述了)
#include <REGX52.H> #include "direction.h" #include "cd.h" #define u8 unsigned char #define u16 unsigned int sbit BZL=P2^0 ; sbit BZR=P2^1 ; u8 iw=0; u8 mod=0; u16 time_cnt=0; u16 freq=100; //PWM输出频率 u16 duty_cycle=20; //占空比 void Timer0Init(void) { TMOD &= 0xF0; TMOD |= 0x01; TL0 = 0xA4; TH0 = 0xFF; TF0 = 0; TR0 = 1; ET0 = 1; EA = 1; } void UsartConfiguration() { SCON=0X50; TMOD&=0X0f; TMOD|=0X20; PCON=0X00; TH1=0Xfd; TL1=0Xfd; TR1= 1; ES = 1; EA = 1; } void main() { UsartConfiguration(); Timer0Init(); while(1) { if(mod) { if(BZR==0) { Timer0Init(); back(); iw=dd(); Delay(100); Timer0Init(); left(); iw=dd(); Delay(160); Timer0Init(); forward(); iw=dd(); } if(BZL==0) { Timer0Init(); back(); iw=dd(); Delay(100); Timer0Init(); right(); iw=dd(); Delay(160); Timer0Init(); forward(); iw=dd(); } } } } void timer0 () interrupt 1 { TR0=0; TL0 = 0xA4; TH0 = 0xFF; time_cnt++; if(time_cnt>=(10000/freq)) time_cnt=0; else if(time_cnt<=(duty_cycle/((10000/freq)/100))) { cd(iw); } else { stop(); } TR0=1; } void Com_Int(void) interrupt 4 { u8 receive_data; Timer0Init(); EA = 0; if(RI == 1) { RI=0; receive_data = SBUF; switch(receive_data) { case ('0'): stop();iw=dd();break; case ('1'): forward();iw=dd();break; case ('2'): back();iw=dd();break; case ('3'): left();iw=dd();break; case ('4'): right();iw=dd();break; case ('5'): mod=~mod;stop();iw=dd();break; case ('6'): duty_cycle+=10; if(duty_cycle>100)duty_cycle=10; break; case ('7'): break; case ('8'): duty_cycle=10; } } EA = 1; }
在将程序烧录进小车里以后,我们就可以用手机操控小车了。
首先在应用商店下载蓝牙串口 打开app后点击连接 然后切换到键盘,点击编辑模式
然后按照下图编辑每个按键
注:模式按钮用来开关避障功能;在切换为避障模式之后需再按避障开始按钮小车才会前进;速度复原按钮可以随时将小车速度降至最低。
由于我之前买的所有模块都已学习完成,这是我近期最后一篇关于智能小车的学习笔记了。之后准备开始Linux的学习。