蓝牙串口通信遥控小车————————————————————————————————作者:————————————————————————————————日期:蓝牙串口通信遥控小车目录1系统方案论证及方案选择2本系统软硬件设计2.1单元硬件电路设计2.2软件部分设计参考文献附录1原器件清单附录2电路原理图及印制板图附录3程序1. 系统方案论证及方案选择1.总体设计方案题目要求设计一个蓝牙串口遥控小车,通过对电机转速的控制,调节速度的大小,改变小车角度,并能实现转弯和旋转。
设计主要由主控单片机STC 12C5A60S2驱动直流电机,使车轮工作,带动小车的转动。
2.基本工作原理3.STC89C52RC有定时器T0 T1 T2,在自动控制领域经常把T1作为串口通信了T0作PWM调速用因此有必要把T2定时器拿出来作定时器作为声音频谱程序。
下面介绍T2的用法STC89C52RC有定时器T2•void main(void)•{•/* T2定时器赋预装载值,溢出16次就是1秒。
*/•RCAP2H=(65536-5000)/256;•RCAP2L=(65536-5000)%256;•ET2=1;//允许T2定时器中断•EA=1;//打开总中断•TR2=1;//启动T2定时器•while(1);// 死循环,等待T2定时器的溢出中断•}•void Timer2_Server(void) interrupt5•{•staticuint Timer2_Server_Count;•// 定义静态变量,用来计数T2定时器的溢出次数(进入本函数的次数)•TF2=0;•// T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的•Timer2_Server_Count++;•if(Timer2_Server_Count==16)// T2定时器的预装载值为0x0BDC,溢出16次就是1秒钟。
•{•Timer2_Server_Count=0;•P1_7=~P1_7;// LED11反转显示。
•}•}•voidTimer2_Server(void)interrupt5•{•staticuint Timer2_Server_Count;•//定义静态变量,用来计数T2定时器的溢出次数(进入本函数的次数)•TF2=0;•// T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的•Timer2_Server_Count++;•if(Timer2_Server_Count==16) // T2定时器的预装载值为0x0BDC,溢出16次就是1秒钟。
•{•Timer2_Server_Count=0;•P1_7=~P1_7;// LED11反转显示。
•}•}二.本系统软硬件设计系统主要由单片机产生PWM信号,通过电机驱动轮胎的旋转,对其的转速进行控制,使车子行驶前进。
根据题目要求,我们的设计分硬件、软件两部分。
2.1 单元硬件电路设计2.1.151单片机最小系统的制作方案设计2.1.2小车51系统+驱动(马达)+电池的接线2.1.3蓝牙与单片机和马达的接线附录1主要元器件清单序号名称规格数量1 锂电池+配套充电器186507.4V 2200mAh锂电池+锂电充电器 12 L298N直流电机驱动板带5V 3A输出L298N驱动芯片双H桥直流电机驱动芯片ﻫ驱动部分峰值电流2A,带5V 3A输出13 ZK-1小车底盘1个5mm加厚底盘+2个直流减速电机+2个优质橡胶轮胎+万向轮+电机导线+螺丝螺母+铜柱+码盘等14 51蓝牙串口模块蓝牙串口模块带电源转换电路支持5V供电 15 2.54mm杜邦线40P彩色杜邦线双头1P对1P长20CM 一排40根 16 瓷片电容22P 插件27 单排针40P 1根 18 轻触开关6*6*6 19 电解电容10uf 35V 110 电阻470欧 5色环直插 111 电阻10K 5色环直插 112 电路板PCB覆铜板板或者5x7万用版 113 超声波测距模块HC-SR04 114 超声波测距模块支架支架需要配套的螺丝螺母 115 晶振11.0592M 116 40P IC座插件DIP40 117 单片机学习板 1 附录2电路原理图及印制电路板图1.2.3.4.5.超声波串口模块附录3程序1.主程序#include<reg52.h>#define uchar unsignedchar#define uint unsigned intuint ma,mb,mc,PWM=6000;sbitout1=P1^2 ; //motoA1sbitout2 = P1^3 ;ﻩ//motoA2sbit out3 = P1^4 ;ﻩ//motoB1sbit out4 = P1^5 ; //motoB2bit PWMIO;void delay(uint t) //延时程序1{uchar j;while(t--)ﻩ{for(j=1;j>0;j--);}}voidinit(){TMOD=0x21;//设置定时器1为工作方式2设置定时器0为工作方式1TH1=0xfd;ﻩTL1=0xfd;ﻩTH0=(65536-20000)/256; //20ms定时器T0中断一次TL0=(65536-20000)%256;SCON=0x50;ﻩTR1=1;ﻩEA=1;ﻩES=1;ﻩET0=1;TR0=1;}void you () //右急弯{out1=1;out2=0;out3=0;out4=1;delay(100);}void zuo()ﻩ//左急弯{out1=0;//右轮正转out2=1;out3=1; //左轮反转out4=0;delay(100);}void qian() //前进{out1=0;ﻩ out2=1;out3=0;out4=1;ﻩdelay(100);}void hou()//后退{out1=1;ﻩout2=0;ﻩﻩ out3=1;out4=0;delay(200);}void leftup()//左前{ﻩout1=0;//右轮正转ﻩout2=1;out3=0;//左轮PWMIO输出调慢out4=PWMIO;}void rightup() //右前{ﻩout1=0;//右轮PWMIO输出调慢out2=PWMIO;out3=0;//左轮正转out4=1;}void leftdown()ﻩ//左后{out1=1;//右轮后退out2=0;out3=PWMIO;;out4=0;}void rightdown()ﻩ//右后{ﻩout1=PWMIO;out2=0;out3=1;//左轮后退out4=0;}voidting() //停止{out2=0;ﻩout4=0;ﻩout3=0;ﻩout1=0;}void main(){init();ﻩwhile(1){if(RI)ﻩ{RI=0;ﻩma=SBUF;ﻩ}ﻩswitch(ma)ﻩ{ﻩcase 'a':qian();break;//前ﻩcase 'b':hou();break;//后退case 'c':zuo();break; //左急弯case 'd':you();break; //右急弯case 'e':leftup();break;//左前ﻩcase 'f':rightup();break;//右前case'g':leftdown();break;//左后case 'h':rightdown();break; //右后case's':ting();break; //停ﻩ }}}voidTT0() interrupt1{TH0=(65536-(20000-PWM))/256;//20ms定时器T0中断一次,进行PWM切换实现5ms高电平15ms低电平的PWM脉冲TL0=(65536-(20000-PWM))%256;PWM=20000-PWM;PWMIO=~PWMIO;}void ser() interrupt4{}2.子程序#include<reg52.h>#defineuchar unsignedchar#define uint unsigned intuint ma,mb,mc,PWM=6000;sbit out1=P1^2 ;ﻩ//motoA1sbit out2 = P1^3; //motoA2sbit out3 =P1^4;//motoB1sbitout4=P1^5 ;ﻩ//motoB2bit PWMIO;PWMA[3]={10,30,50};PWMB[3]={10,30,50};void delay(uint t) //延时程序1{ﻩucharj;while(t--){for(j=1;j>0;j--);}}voidinit(){TMOD=0x21;//设置定时器1为工作方式2 设置定时器0为工作方式1TH1=0xfd;ﻩTL1=0xfd;TH0=(65536-20000)/256;//20ms定时器T0中断一次TL0=(65536-20000)%256;ﻩSCON=0x50;ﻩTR1=1;EA=1;ES=1;ﻩET0=1;TR0=1;}void you () //右急弯{out1=1;out2=0;out3=0;out4=1;delay(100);}void zuo() //左急弯{out1=0;//右轮正转out2=1;out3=1; //左轮反转out4=0;delay(100);}void qian()//前进{out1=0;out2=PWMIO1;out3=0;out4=PWMIO2;ﻩ delay(100);}void hou() //后退{ﻩout1=1;ﻩout2=0;out3=1;out4=0;delay(200);}void leftup()ﻩ//左前{ﻩPWM1=PWMA[1]; PWM2=PWMA[0];out1=0;//右轮正转out2=PWMIO1;out3=0;//左轮PWMIO输出调慢out4=PWMIO2;}void rightup()ﻩ//右前{out1=0;//右轮PWMIO输出调慢out2=PWMIO;out3=0;//左轮正转out4=1;}void leftdown()ﻩ//左后{out1=1;//右轮后退out2=0;out3=PWMIO;;out4=0;}void rightdown()//右后{out1=PWMIO;out2=0;out3=1;//左轮后退out4=0;}voidting() //停止{ﻩout2=0;ﻩ out4=0;ﻩout3=0;out1=0;}void3dang() //右后{i++;PWM1=PWMA[i];PMW2=PWMB[i];if(i==3){i=0;}}void main(){init();while(1)ﻩ{if(RI)ﻩ{RI=0;ma=SBUF;}ﻩ switch(ma)ﻩ{/*下面程序需要自行另外修改,添加前\后退\左转圈\右转圈\左前弯PWM\右前弯PWM\左自旋\右自旋\PWM换档位\双闪灯+鸣笛\播放音乐\显示运行时间\显示光强\超声波测距并避障等功能*/case 'a':qian();break;//前ﻩcase 'b':hou();break; //后退ﻩcase'c':zuo();break; //左急弯case 'd':you();break; //右急弯ﻩcase 'e':leftup();break;//左前ﻩcase'f':rightup();break;//右前ﻩcase 'g':leftdown();break;//左后ﻩcase 'h':rightdown();break;//右后case's':ting();break; //停case 'x':3dang();break; //停}ﻩ}}void TT0()interrupt 1{TH0=(65536-400)/256;TL0=(65536-400)%256;t++;if(t>=PWM1){PWMIO1=1;}if(t>=PWM2) {PWMIO2=1;}if(t==50){t=0;PWMIO1=0;PWMIO2=0}}void ser()interrupt 4{}3.串口通信的初始化4.利用PWMIO的变化改变转弯幅度5.PWMADJ()函数实现PWM值的加void PWMADD(){PWM+=1;if(PWM==4){PWM=1};}•case 'a':qian();break; //前•ﻩcase ‘b’:hou();break;//后退•ﻩcase‘c’:zuo();break;//左转圈•ﻩcase‘d’:you();break; //右转圈•case ‘g’:leftdown();break; //左自旋•case ‘h’:rightdown();break; //右自旋•2ledbeep(); //双闪灯黄灯+鸣笛•music(); //播放音乐•bizhang();//超声波测距并避障6.主函数串口接收程序。