基于安卓蓝牙控制的智能车设计报告(编辑修改稿)内容摘要:

reak。 case 0xB0: Run_Mode_Flag = 0x10。 break。 case 0xC0: 11 Run_Mode_Flag = 0x11。 break。 } } // 中间省略若干代码,详细参考源代码 // 全能车运行模式判断 if(0x01 == Run_Mode_Flag) // 蓝牙模式,通过串口与蓝牙模块通信,获得相应的执行指令 { Run_Mode_Bluetooth()。 } else if(0x10 == Run_Mode_Flag) // 循迹模式 { Run_Mode_Track()。 } else if(0x11 == Run_Mode_Flag) // 自动模式 { Run_Mode_Auto()。 } } } 注释: Run_Mode_Flag 为智能车运动模式标识符; Run_Mode_Bluetooth()为蓝牙手动模式; Run_Mode_Track()为循迹模式。 Run_Mode_Auto()为避障模式。 智能车基础运动设计与实现 智能车基础运动包括前进、倒车、左转、右转和停车,其对应的功能函数名分别如下:前进 Car_Go_Forward()、倒车 Car_Go_Back()、左转 Car_Turn_Left()、右转Car_Turn_Right()以及停车 Car_Stop()。 智能车是通过 PWM 技术来实现调整其运动的速度。 前进 Car_Go_Forward()和左转 Car_Turn_Left()部分代码如表 33 所示,而倒车和右转以及停车与前者相似。 表 33 智能车基础运动源代 码 12 () amp。 Car_Turn_Left() /* 小车前进 */ void Car_Go_Forward(void) { L_LAMP = R_LAMP = 1。 // 关闭左侧和右侧车灯 if( COUNT = DUTY ) // 高电平 { // 左边车轮正转 , LIN1=1, LIN2=0 // 右边车轮正转, RIN1=1, RIN2=0 Motor_RIN1 = Motor_LIN1 = 1。 Motor_RIN2 = Motor_LIN2 = 0。 } else // 低电平 { // 左右都停止 Motor_LIN1 = Motor_RIN1 = 1。 Motor_LIN2 = Motor_RIN2 = 1。 } } /* 小车左转 */ void Car_Turn_Left(void) { L_LAMP = 0。 // 打开左侧车灯 R_LAMP = 1。 // 关闭右侧车灯 if(COUNT = DUTY) { // 左边车轮停止转动 , LIN1=1, LIN2=1 Motor_LIN1 = 1。 Motor_LIN2 = 1。 // 右边车轮正转, RIN1=1,RIN2=0 Motor_RIN1 = 1。 13 Motor_RIN2 = 0。 } else { // 左右都停止 Motor_LIN1 = Motor_RIN1 = 1。 Motor_LIN2 = Motor_RIN2 = 1。 } Delayms(1)。 L_LAMP = 1。 // 关闭左侧 车灯 } 注释: Delayms()为延时函数,具体实现方法参考附录源代码; Motor_XINX 对应着 L298 四个输入端,分别控制左右电机正反转以及停止。 串口通讯接口部分 蓝牙接收电路与单片机之间是通过 UART 串口方式通讯的。 STC89C52 主要接收并处理来自蓝牙接收电路的数据。 首先是对 UART 接口的初始化工作,再通过串口中断接收数据。 UART 初始化部分代码如表 34 所示。 表 34 UART 初始化部分源代码 () /* 串口通讯初始化 */ void UART_Init(void) { // 串口工作模式 1 SCON =0x50。 // 等效于 SM1=1, SM0=0, REN=1 // Timer2 初始化,作为波特率发生器 TL2=RCAP2L = (65536(FOSC/32/BAUD))。 TH2=RCAP2H = (65536(FOSC/32/BAUD))8。 // 波特率 9600 T2CON = 0x34。 // 等效于 RCLK=TCLK=TR2= 1 // 清除 RI,串口接 收中断标志 14 RI = 0。 // 串口中断使能 ES = 1。 // 记得主程序中要打开 EA=1。 } 注释: FOSC 为系统时钟晶振,已经宏定义 define FOSC 11059200L BAUD 为串口通讯波特率,已经宏定义 define BAUD 9600 初始化 UART 后,在打开串口中断,用于接收来自蓝牙模块的数据。 其实现代码如表35 所示。 表 35 串口中断处理函数 () /* 串口通讯中断服务函数 */ void UART_Handler()interrupt 4 using 1 // 串口中断号 4 { // 判断 RI if(RI) { RI = 0。 // 软件方式清除 RI 标志 R_Buffer = SBUF。 // 获得蓝牙数据 } } 注释: 串口接收中断标志 RI 必须软件清零。 智能车蓝牙手动模式设计与实现 在 UART 接口的基础上获得来自控制端的指令。 通过全局变量 R_Buffer 来存储当前来自 APP 客户端的数据,并根据 R_Buffer 的值来执行相应的功能。 蓝牙指令有 0x1F 前进指令、 0x2F 倒车指令、 0x3F 左转指令、 0x4F 右转指令、 0x5F 加速指令、 0x6F 减速指令、0x7F 前车灯、 0x8F 喇叭。 手动模式部分源代码如表 36 所示。 表 36 蓝牙手动模式部分源代码 15 () /* 全能车模式之蓝牙遥控 */ void Run_Mode_Bluetooth(void) { // 再次打开串口中断使能 ES = 1。 // 根据收到的 R_Buffer 执行该任务 switch(R_Buffer) { case 0x1F: // 前进指令 DUTY = 7。 Car_Go_Forward()。 break。 case 0x2F: // 后退指令 DUTY = 7。 Car_Go_Back()。 break。 case 0x3F: // 左转指令 DUTY = 7。 Car_Turn_Left()。 break。 case 0x4F: // 右转指令 DUTY = 7。 Car_Turn_Right()。 break。 case 0x00: // 停止指令 Car_Stop()。 break。 case 0xD0: // 关闭前车灯 Car_Beep()。 break。 16 } } 注释: DUTY 为占空比,用于调整电机转动速度。 智能车自主循迹模式设计与实现 通过红外对管的工作原理 来判断全能车相对位置,以及做出相应的决策。 其部分源代码如表 37 所示。 表 37 智能车循迹模式源代码 () /* 全能车模式之循迹 */ void Run_Mode_Track(void) { static U8 temp。 // 零时存放 P1 低 6 位数据,一定要写成 static,保存上次的结果。 temp = P1。 temp amp。 =0x3f。 switch(temp) { case 0x07: // 左 左 2 和左 3 同时 DUTY = 5。 Car_Turn_Left()。 break。 case 0x1F: // 左 1 DUTY = 5。 Car_Turn_Left()。 break。 // 中间省略若干行,详细参照源代码 case 0x3E: // 右 1 DUTY = 5。 Car_Turn_Right()。 break。 17 case 0x38: // 右 右 2 和右 3 同时 DUTY = 5。 Car_Turn_Right()。 break。 case 0x00: Car_Stop()。 break。 default: // 前行 DUTY = 4。 Car_Go_Forward()。 } } 注释: 红外对管低电平表示遇到黑色线,即没有收到返回光。 智能车自动避障模式设计与实现 通过超声波电路间接测量距离的原理,计算出障碍物距离全能车的距离。 部分代码如表 38 所示。 表 38 智能车避障模式源代码 /* 超声波初始化 */ void Timer0_Init(void) { Trig = 0。 TMOD amp。 =0xF0。 TMOD |= 0x01。 TH0 = 0。 TL0 = 0。 // 定时器 0 寄存器清零 TF0 = 0。 // 清除定时器 0 溢出标志 TR0 = 0。 // 暂时不启动定时器 0 18 } /* 启动触发 */ void Trig_Start(void) { Trig = 1。 // 产生触发信号 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。