基于无线控制的智能小车系统的设计毕业设计(编辑修改稿)内容摘要:

基于无线控制的智能小车系统的设计 18 前面板中有丰富的输入控件(如图 20),和显示控件(如图 21),能模仿实际仪器,非常方便地对数据信号进行显示和控制。 输入控件(如图 20) 显示控件(如图 21) 程序框图中,通过 G 语言,实现对数据信息的处理和控制,并能对串口工作方式进行设置,如图 22。 图 22 串口设置图 上位机 G 语言总程序框图如图 23 基于无线控制的智能小车系统的设计 19 图 23 上位机 G 语言总程序框图 上位机主要功能 1) 发送小车运行模式的控制命令。 2) 在远程控制模式下,发送小车运动指令,控制小车运动方向。 3) 无线发送数据。 4) 无线接收温度信息。 5) 实时显示温度信息。 上位机进入运行状态后,等待控制命令。 当发出控制命令后,首先判断运动模式,若为自动模式,则小车自行运动,并发出温 度信息到上位机处,上位机接受到温度信息后,进行实时显示;若为远程控制模式,则小车按照接受到的运动命令进行行驶,并发出温度信息到上位机处,上位机接受到温度信息后,进行实时显示。 上位机主程序流程框图如图 24 基于无线控制的智能小车系统的设计 20 开 始 运 行小 车 控制 命 令远 程模 式Y行 驶信 号小 车行 驶显 示温 度结 束NNYYN小 车 自动 行 驶 图 24 上位机主程序流程框图 下位机主程序 单片机控制 下位机用单片机 STC89C52 为核心控制系统,以 C 语言为开发环境。 下位机结构如图25。 基于无线控制的智能小车系统的设计 21 M C U小 车 行 驶温 度 传 采 集红 外 避 障L E D 温 度 显 示发 送 温度 信 息接 受 P C 命 令 图 25 下位机程序结构图 温度采集子程序 本系统 使用 DS18B20 温度传感器,温度数据关系如表 9 所示。 表 9 DS18b20 温度数据关系 温度℃ 数据输出(二进制) 数据输出(十六进制) +125 00000000 11111010 +25 00000000 00110010 +1/2 00000000 00000001 0 00000000 00000000 1/2 11111111 11111111 FFFF 25 11111111 11001110 FFCE 55 11111111 10010010 FF92 温度采集子程序包括:初始化,读一个字节,写一个字节,读取温度。 当需要读取温度信息时,首先向温度传感器写入数据信息,完成初始化命令,再次写入数据,使其开始转换温度信息,最后再发出命令,完成温度读取。 子程序如下: void Init_DS18B20(void)//初始化 ds1820 基于无线控制的智能小车系统的设计 22 { unsigned char x=0。 DQ = 1。 //DQ 复位 Delay(8)。 //稍做延时 DQ = 0。 Delay(80)。 //精确延时 大于 480us DQ = 1。 //拉高总线 Delay(14)。 x=DQ。 Delay(20)。 } unsigned char ReadOneChar(void) //读取一个字节数据 { unsigned char i=0。 unsigned char dat = 0。 for (i=8。 i0。 i) { DQ = 0。 dat=1。 DQ = 1。 if(DQ) dat|=0x80。 Delay(4)。 } return(dat)。 } void WriteOneChar(unsigned char dat)//写一个字节 { unsigned char i=0。 for (i=8。 i0。 i) 基于无线控制的智能小车系统的设计 23 { DQ = 0。 DQ = datamp。 0x01。 Delay(5)。 DQ = 1。 dat=1。 } } unsigned int ReadTemperature(void)//读取温度 { unsigned char a=0。 unsigned char b=0。 unsigned int t=0。 float tt=0。 Init_DS18B20()。 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 Init_DS18B20()。 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器 a=ReadOneChar()。 //读低 8 位 b=ReadOneChar()。 //读高 8 位 t=b。 t=8。 t=t|a。 tt=t*。 t= tt*10+。 //放大 10 倍输出并四舍五入 return(t)。 } 基于无线控制的智能小车系统的设计 24 电机子程序 小车采用四轮驱动,使小车驱动力增强,并可以原地 360 度转弯。 电机驱动模块接口连接在单片机 P1 口。 通过改变 P1 口的管脚的电平信号,来改变电机转动方向,从而改变小车运动。 部分子程序如下: define Left_moto_go {P1_0=0,P1_1=1,P1_2=0,P1_3=1。 } //左边两个电机向前走 define Left_moto_back {P1_0=1,P1_1=0,P1_2=1,P1_3=0。 } //左边两个电机向后转 define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0。 } //左边两个电机停转 define Right_moto_go {P1_4=0,P1_5=1,P1_6=0,P1_7=1。 } //右边两个电机向前走 define Right_moto_back {P1_4=1,P1_5=0,P1_6=1,P1_7=0。 } //右边两个电机向前走 define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0。 } //右边两个电机停转 void run(void) //前进 { Left_moto_go。 //左电机往前走 Right_moto_go。 //右电机往前走 } void backrun(void) //后退 { Left_moto_back。 //左电机往前走 Right_moto_back。 //右电机往前走 } void leftrun(void) //左转 { Left_moto_go。 //左电机往前走 Right_moto_back。 //右电机往前走 } void rightrun(void) //右转 { Left_moto_back。 //左电机往前走 Right_moto_go。 //右电机往前走 } 基于无线控制的智能小车系统的设计 25 void stoprun(void) //停止 { Left_moto_Stop。 //左电机停止 Right_moto_Stop。 //右电机停止 } 避障子程序 小车避障通过红外传感器来实现,小车的右、前、左三个方向分别安装了三个红外传感器,检测到障碍物时,就返回低电平到 , ,通过单片机进行判断,改变小车运动方向,从而达到避障效果。 void fun() { if(P3_5==0amp。 amp。 P3_7==0) // 左 (中 )右测 后退 { backrun()。 } else if(P3_5==0) // 右中测 左转 { leftrun()。 } else if(P3_7==0) // 左中测 右转 { rightrun()。 } else if(P3_6==0) // 中测 左转 { if(flag==1) { rightrun()。 flag=0。 } 基于无线控制的智能小车系统的设计 26 if(flag==0) { leftrun()。 flag=1。 } } else run()。 } 串口通信子程序 [22] 通过串口方式 [23],实现数据的发送与接收。 下位机处,单片机通过串口通信,与无线模块交互数据信息,上位机处, PC 终端通过串口通信,与无线模块交互数据信息。 /************************串口中断接受一个字符 *************************/ void INT_Uart_Transmit() interrupt 4 //全双工 uart 接收 { uchar receive_temp。 if (RI==1) //处理接收中断 { RI=0。 //清除中断标志位 receive_temp=SBUF。 //接收串口数据 if (point==0) { if(receive_temp==39。 @39。 ) //判断是否起始位 point++。 else point=0。 } else if (point0 amp。 amp。 point=3) //判断是否接收够 4bit receive_buffer[point++]=receive_temp。 else if (point==4) //判断是否接收够 4bit { 基于无线控制的智能小车系统的设计 27 if(receive_temp==39。 39。 ) { receive_data[0]=receive_buffer[3]。 if(receive_buffer[1]==39。 y39。 amp。 amp。 receive_buffer[2]==39。 c39。 ) { Car_mode=39。 139。 //远程控制模式 } if(receive_buffer[1]==39。 z39。 amp。 amp。 receive_buffer[2]==39。 d39。 ) { Car_mode=39。 239。 //自动灭火模式 } point=0。 } else point=0。 } else point=0。 //缓冲区已满 ,清除缓冲区内数据 ,重新接收 } } /****************************串口发送一个数字 **************************/ void send_int(int txd) { SBUF = txd。 while(!TI)。 // 等特数据传送 TI = 0。 // 清除数据传送标志 } /****************************串口发送一个字符 *****。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。