基于51单片机超声波蓝牙遥控器.doc_第1页
基于51单片机超声波蓝牙遥控器.doc_第2页
基于51单片机超声波蓝牙遥控器.doc_第3页
基于51单片机超声波蓝牙遥控器.doc_第4页
基于51单片机超声波蓝牙遥控器.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

*/ /#include /包含51单片机相关的头文件#include #include /修改(蓝牙遥控) #define Left_moto_go P0_0=1,P0_1=0; /左边电机向前走 #define Left_moto_back P0_0=0,P0_1=1; /左边电机向后转#define Left_moto_Stop P0_0=0,P0_1=0; /左边电机停转 #define Right_moto_go P0_2=1,P0_3=0;/右边电机向前走#define Right_moto_back P0_2=0,P0_3=1;/右边电机向后走#define Right_moto_Stop P0_2=0,P0_3=0;/右边电机停转 #define left C #define right D#define up A #define down B#define stop Fchar code str = 收到指令,向前!n;char code str1 = 收到指令,向后!n;char code str2 = 收到指令,向左!n;char code str3 = 收到指令,向右!n;char code str4 = 收到指令,停止!n;bit flag_REC=0; bit flag =0; unsigned char i=0;unsigned char dat=0; unsigned char buff5=0; /接收缓冲字节 void delay(unsigned int k) unsigned int x,y; for(x=0;xk;x+) for(y=0;y=2) i=0;flag=0;flag_REC=1 ; / 停止接收 /以上修改sbit LeftLed=P20; /定义前方左侧指示灯端口sbit RightLed=P07; /定义前方右侧指示灯端口sbit FontLled=P17;sbit LeftIR=P35; /定义前方左侧红外探头端口sbit RightIR=P36; /定义前方右侧红外探头端口sbit FontIR=P37; /定义前方正前方红外探头端口sbit M1A=P00; /定义左侧电机驱动A端sbit M1B=P01; /定义左侧电机驱动B端sbit M2A=P02; /定义右侧电机驱动A端sbit M2B=P03; /定义右侧电机驱动B端sbit B1=P04; /定义语音识识别传感器端口sbit SB1=P06; /定义蜂鸣器端口sbit IRIN=P33; /定义红外接收端口/修改(超声波)#define TX P1_3#define RX P1_2#define Forward_L_DATA 180/当前进不能走直线的时候,请调节这两个参数,理想的时候是100,100,最大256,最小0。0的时候最慢,256的时候最快#define Forward_R_DATA 180/例如小车前进的时候有点向左拐,说明右边马达转速过快,那可以取一个值大一点,另外一个值小一点,例如 200 190 /直流电机因为制造上的误差,同一个脉宽下也不一定速度一致的,需要自己手动调节sbit L293D_IN1=P00; sbit L293D_IN2=P01;sbit L293D_IN3=P02;sbit L293D_IN4=P03;sbit L293D_EN1=P04;sbit L293D_EN2=P05;sbit BUZZ=P06;void Delay400Ms(void);/延时400毫秒函数unsigned char disbuff4=0,0,0,0;/用于分别存放距离的值0.1mm、mm、cm和m的值void Count(void);/距离计算函数 unsigned int time=0;/用于存放定时器时间值unsigned long S=0;/用于存放距离的值/报错bit cflag =0; /量程溢出标志位bit turn_right_flag; /* /函数名称:Delay1ms(unsigned int i) /函数功能:延时i*1ms的子程序(对应于22.1184Mhz晶振) /形式参数:unsigned int i /行参说明:无 /返回参数:无 /使用说明:i为要延时的时间长度,单位是MS,最大可以延时65536 ms /* void Delay1ms(unsigned int i) unsigned char j,k; do j = 10; do k = 50; do _nop_(); while(-k); while(-j); while(-i); /* /函数名称:Delay10us(unsigned char i) /函数功能:延时i*10us的子程序(对应于22.1184Mhz晶振) /形式参数:无 /行参说明:无 /返回参数:无 /使用说明:i为要延时的时间长度,单位是US,最大可以延时250 ms /* void Delay10us(unsigned char i) unsigned char j; do j = 10; do _nop_(); while(-j); while(-i); /以上修改unsigned char code LedShowData=0x03,0x9F,0x25,0x0D,0x99, /定义数码管显示数据 0x49,0x41,0x1F,0x01,0x19;/0,1,2,3,4,5,6,7,8,9unsigned char code RecvData=0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F;unsigned char IRCOM7;static unsigned int LedFlash; /定义闪动频率计数变量bit EnableLight=0; /定义指示灯使能位#define ShowPort P2 /定义数码管显示端口unsigned char temp = 1;/修改(超声波)void Forward()/ 前进 L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0;/ PWM_Set(255-Speed_Right,255-Speed_Left);void Stop(void)/刹车 L293D_IN1=0; L293D_IN2=0; L293D_IN3=0; L293D_IN4=0;/ PWM_Set(0,0);void Turn_Retreat() /后 L293D_IN1=0; L293D_IN2=1;L293D_IN3=0;L293D_IN4=1;/PWM_Set(255-Speed_Right,255-Speed_Left);void Turn_left() /左 L293D_IN1=0; L293D_IN2=1;L293D_IN3=1;L293D_IN4=0;/PWM_Set(255-Speed_Right,255-Speed_Left);/=/*距离计算程序*/ void Conut(void) time=TH1*256+TL1; TH1=0; TL1=0; /此时time的时间单位决定于晶振的速度,外接晶振为11.0592MHZ时, /time的值为0.54us*time,单位为微秒/那么1us声波能走多远的距离呢?1s=1000ms=1000000us / 340/1000000=0.00034米/0.00034米/1000=0.34毫米 也就是1us能走0.34毫米/但是,我们现在计算的是从超声波发射到反射接收的双路程,/所以我们将计算的结果除以2才是实际的路程S=time*2;/先算出一共的时间是多少微秒。 S=S*0.17;/此时计算到的结果为毫米,并且是精确到毫米的后两位了,有两个小数点 if(S=5000)|cflag=1) /超出测量范围 cflag=0; /修改 /DisplayListChar(0, 1, table1); else disbuff0=S%10; disbuff1=S/10%10; disbuff2=S/100%10; disbuff3=S/1000; /*/ void zd0() interrupt 3 /T0中断用来计数器溢出,超过测距范围 cflag=1; /中断溢出标志RX=0; /*超声波高电平脉冲宽度计算程序*/void Timer_Count(void) TR1=1; /开启计数 while(RX);/当RX为1计数并等待 TR1=0;/关闭计数 Conut();/计算/*/ void StartModule() /启动模块 TX=1; /启动一次模块 Delay10us(2); TX=0; /以上修改void tingzhi() M1A=0; /将M1电机A端初始化为0 M1B=0; /将M1电机B端初始化为0 M2A=0; /将M2电机A端初始化为0 M2B=0;void qianjin() M1A=1; M1B=0; M2A=1; M2B=0;void houtui() M1A=0; M1B=1; M2A=0; M2B=1;void zuozhuan() M1A=0; M1B=1; M2A=1; M2B=0;void youzhuan() M1A=1; M1B=0; M2A=0; M2B=1;void delay_nus(unsigned int i) /延时:i=12 ,i的最小延时单12 us i=i/10; while(-i); void delay_nms(unsigned int n) /延时n ms n=n+1; while(-n) delay_nus(900); /延时 1ms,同时进行补偿 void delayms(unsigned char x) /0.14mS延时程序 unsigned char i; /定义临时变量 while(x-) /延时时间循环 for (i = 0; i13; i+) /14mS延时 void Delay() /定义延时子程序 unsigned int DelayTime=30000; /定义延时时间变量 while(DelayTime-); /开始进行延时循环 return; /子程序返回void ControlCar(unsigned char ConType) /定义电机控制子程序 tingzhi(); switch(ConType) /判断用户设定电机形式 case 1: /前进 /判断用户是否选择形式1 /tingzhi();/进入前进之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位/Delay1ms(50);LeftLed = 0 ;qianjin(); break; case 2: /后退 /判断用户是否选择形式2 / tingzhi(); /进入后退之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 / Delay1ms(50); LeftLed = 1 ; houtui(); /M2电机反转 break; case 3: /左转 /判断用户是否选择形式3 /tingzhi(); /进入左转之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位/ Delay1ms(50); zuozhuan(); /M2电机正转 break; case 4: /右转 /判断用户是否选择形式4 / tingzhi(); /进入右转之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位/Delay1ms(50);youzhuan(); /M1电机正转 /M2电机反转break; case 8: /停止 /判断用户是否选择形式8 tingzhi();break; /退出当前选择 void ControlCar_yaokong(unsigned char ConType) /定义电机控制子程序(红外遥控单独设置一个 switch case 语句 ) tingzhi(); switch(ConType) /判断用户设定电机形式 case 1: /前进 /判断用户是否选择形式1 tingzhi();/进入前进之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位Delay1ms(150);LeftLed = 0 ;qianjin(); break; case 2: /后退 /判断用户是否选择形式2 tingzhi(); /进入后退之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 Delay1ms(150); LeftLed = 1 ; houtui(); /M2电机反转 break; case 3: /左转 /判断用户是否选择形式3 tingzhi(); /进入左转之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 Delay1ms(150); zuozhuan(); /M2电机正转 break; case 4: /右转 /判断用户是否选择形式4 tingzhi();/进入右转之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 Delay1ms(150); youzhuan(); /M1电机正转 /M2电机反转 break; case 8: /停止 /判断用户是否选择形式8 tingzhi();break; /退出当前选择 /-红外遥控-void IR_IN() interrupt 2 using 0 /定义INT2外部中断函数 unsigned char j,k,N=0; /定义临时接收变量 EX1 = 0; /关闭外部中断,防止再有信号到达 delayms(15); /延时时间,进行红外消抖 if (IRIN=1) /判断红外信号是否消失 EX1 =1; /外部中断开 return; /返回 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平信号。 delayms(1); /延时等待 for (j=0;j4;j+) /采集红外遥控器数据 for (k=0;k=30) /判断计数器累加值 EX1=1; /打开外部中断功能 return; /返回 IRCOMj=IRCOMj 1; /进行数据位移操作并自动补零 if (N=8) /判断数据长度 IRCOMj = IRCOMj | 0x80; /数据最高位补1 N=0; /清零位数计录器 if (IRCOM2!=IRCOM3) /判断地址码是否相同 EX1=1; /打开外部中断 return; /返回 for(j=0;j10;j+) /循环进行键码解析 if(IRCOM2=RecvDataj) /进行键位对应 / ControlCar(j);ControlCar_yaokong(j); /数码管显示相应数码 EX1 = 1; /外部中断开 /- /修改(bluetooth)void Robot_Bluetooth() /蓝牙控制子程序TMOD=0x20; TH1=0xFd; /11.0592M晶振,9600波特率 TL1=0xFd; SCON=0x50; PCON=0x00; TR1=1;ES=1; EA=1; while(1)/*无限循环*/ if(flag_REC=1) / flag_REC=0;if(buff0=O&buff1=N)/第一个字节为O,第二个字节为N,第三个字节为控制码switch(buff2) case up : / 前进 send_str( ); run(); break; case down:/ 后退 send_str1( ); backrun(); break; case left:/ 左转 send_str3( ); leftrun(); break; case right:/ 右转 send_str2( ); rightrun(); break; case stop:/ 停止 send_str4( ); stoprun(); break; /修改 if(P3_2 = 0) delay_nms(10); if(P3_2 = 0) temp+; while(!P3_2); break;/以上修改 /修改(超声波)void Robot_Avoidance() /机器人避障子程序 unsigned char i;unsigned int a;/cmg88();/关数码管Delay1ms(400); /启动等待,等LCM讲入工作状态/LCMInit(); /LCM初始化Delay1ms(5);/延时片刻 TMOD=TMOD|0x10;/设T0为方式1,GATE=1; EA=1; TH1=0; TL1=0; ET1=1; /允许T0中断 /开启总中断/=/PWM_ini();/=turn_right_flag=0;/*B:for(i=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论