当前位置:文档之家› 智能小车论文单片机循迹测速避障液晶显示

智能小车论文单片机循迹测速避障液晶显示

“好帮手”电子设计竞赛题目:智能小车参赛者:指导老师:摘要近年来,随着我国经济建设的高速发展,机动车辆拥有量也在急剧增长,交通事故也日益增多,车辆超速成为了越来越严重的问题。

而我国生产的汽车、摩托车电机转速测量系统大多使用动圈式模拟测速。

这种测量系统存在精度差、过载能力弱等缺点。

本次的智能仪表综合训练的主要任务是设计一个智能小车,要求实现小车能够直走、通过光电传感器进行测速、通过PWM电路模块进行调速以及通过LCD12864液晶模块进行小车速度、路程、距离的显示。

控制板的设计以8位的STC89C52单片机为控制核心,驱动板则以L289N驱动芯片为核心,应用光电传感器和LCD液晶模块,成功的实现了小车的测速、显示功能、超声波测距、无线电控制等功能。

关键词:智能小车;光电传感器;驱动芯片;LCD液晶模块;无线电控制目录第一章绪论 (4)1.1 问题的提出 (4)第二章智能小车原理 (5)2.1设计思路 (5)2.2 STC89C52RC单片机简介 (6)2.3 小车驱动板简介 (7)2.4 小车驱动方式选择 (8)2.5 光电测速原理 (9)2.6 LCD12864显示模块 (9)2.7 无线电原理 (10)第三章系统硬件设计 (11)3.1车体结构及其驱动电路 (11)3.2循迹功能 (11)3.3 测速模块的设计 (12)3.3 PWM调速模块的设计 (13)3.4 无线电模块 (13)3.5 超声波测距 (14)3.6 LCD12864显示 (15)第四章系统软件的设计 (15)4.1 循迹与无线电接收功能单片机程序 (15)4.2 LCD12864液晶显示程序 (27)总结 (42)附录1 PCB原理图 (43)附录1-1 电机原理图 (43)附录1-5 LCD12864显示PCB图 (46)附录2 实物图 (47)第一章绪论1.1 问题的提出当今世界,科学技术日新月异。

传感器技术和自动控制正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。

作为机械行业的代表产品——汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整体(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很可能成为依托整车制造业和用车提升配置而快速成为新的增长点:二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时具有交通、娱乐、办公和通讯等多种功能。

勿容置疑,机电一体化人才的培养不论是在国外还是在国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对机电一体化的兴趣与强化机电一体化的相关知识。

所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。

这项设计是以采购的小车为基础,采用8位STC89C52RC单片机作为控制核心,逐步实现测速、调速、显示这三大功能。

第二章智能小车原理2.1设计思路本次小车设计的硬件框图如2-1图所示;利用两块STC89C52单片机在小车上进行智能控制。

我们的智能小车是基于51单片机的智能小车系统。

功能如下: 1、通过光电传感器小车循迹。

2、测速传感器为光电测速传感器,在单位时间内计算脉冲的次数,然后再进行转换和处理即得到所测量的速度。

3、通过PWM 调速模块结合软件进行调速。

4、通过LCD12864液晶屏显示速度、路程、距离。

5、通过超声波测距测量小车前面障碍物距离。

6、通过无线电控制小车行驶方向。

2.2 STC89C52RC 单片机简介单片机STC89C52如下2-2图所示2-2图单片机STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、非常有效的解决方案。

具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。

另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

2.3 小车驱动板简介小车驱动板如2-4图所示2-4图小车驱动板L289N模块输入输出关系如下表所示ENA IN1 IN2 电机运转情况H H L 正转H L H 反转H IN1 IN2 快速停止L X X 停止2-1表2.4 小车驱动方式选择采用由集成了双极性管组成的H桥电路芯片L298N。

用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。

这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。

2.5 光电测速原理小车速度检测方案的设计是个不可忽视的问题。

只有选择好测速方案,才能省时、省力、省线地去做设计。

原理是传感器开孔圆盘的转轴与减速电机转轴相连,光源的光通过开孔盘的孔和缝隙反射到光敏元件上,开孔盘旋转体转一周,光敏元件上照到光的次数等于盘上的开孔数,从而测出旋转体旋转速度。

灵敏度较高,但容易受外界光源的影响。

虽然光电传感器受外界光源影响很大,但是它使用方便、安装简单,还有本设计要求的准确度不是很高,因此就选择了光电测速传感器。

光电测速传感器的原理图如下图所示光电测速模块如2-5图所示2.6 LCD12864显示模块系统采用12864液晶显示,它不仅节省了单片机的资源,相比较数码管液晶显示更加直观、节能,同时可以直接显示中文汉字、字符等,具有灵活易操作的特性。

故采用LCD显示。

2.7 无线电原理XL24L01P-D01是采用挪威NORDIC公司的nrf24L01p 2.4G无线收发IC设计的一款高性能2.4G无线收发模块,采用GFSK调制,工作在2400-2483M的国际通用ISM频段,最高调制速率可达2MBPS。

XL24L01P-D01集成了所有与RF协议相关的高速信号处理部分,如:自动重发丢失数据包和自动产生应答信号等,模块的SPI接口可以利用单片机的硬件SPI口连接或用单片机的I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机第三章系统硬件设计3.1车体结构及其驱动电路硬件部分则在采购的小车基础上进行,小车的实物图如图3-1所示。

3-1图3.2循迹功能智能小车利用的光电传感器进行循迹功能。

如图3-2所示。

光电循迹3.3 测速模块的设计光电传感器是通过把光强度的变化转换成电信号的变化来实现控制的。

光电传感器在一般情况下,有三部分构成,它们分为:发送器、接收器和检测电路。

其安装在小车上如图所示。

光电测速3-3图安装图3.3 PWM调速模块的设计调速模块决定了小车的调速功能,本次设计使用PWM进行调速。

脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。

它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。

一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定。

脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。

通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。

电压或电流源是以一种通(ON) 或断(OFF)的重复脉序列被加到模拟负载上去的。

通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。

只要带宽足够,任何模拟值都可以使用PWM进行编码。

3.4 无线电模块利用无线电XL24L01P-D01进行控制小车在非循迹状态的前走、后退、左转、右转、暂停的功能。

并控制小车进入循迹状态。

3.5 超声波测距超声波测距采用IO口TRIG触发测距,给至少10us高电平信号;模块自动发送8个40KHZ的方波,自动检测是否有信号返回;有信号返回,通过IO口ECHO输出以后高电平,高电平持续时间就是方波从发射到返回的时间。

如图所示:3.6 LCD12864显示用LCD12864显示“小车路程、小车左轮速度、小车右伦速度、小车前方障碍物距离”的具体信息。

如图所示:第四章系统软件的设计4.1 循迹与无线电接收功能单片机程序#include <reg52.h>#include <intrins.h>//#include<12864cusu.c>#include <XUNJIG.c>typedef unsigned char uchar;typedef unsigned char uint;//****************************************IO端口定义***************************************sbit CE =P1^5; //工作模式控制,在CSN为低的情况下,CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态sbit CSN =P1^0; //SPI片选使能,低电平使能sbit SCK =P1^4; //SPI时钟sbit MOSI=P1^1; //SPI串行输入sbit MISO=P1^3; //SPI串行输出sbit IRQ =P1^2; //中断,低电平使能*///***********************************数码管0-9编码*******************************************uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码////************************************按键**********************************************sbit KEY1=P3^2;sbit KEY2=P3^3;sbit KEY3=P3^4;sbit KEY4=P3^5;//***********************************数码管位选**************************************************sbit led1=P0^7;sbit led0=P0^6;//*********************************************NRF24L01******************************* ******#define TX_ADR_WIDTH 5 // 5字节发射地址宽度#define RX_ADR_WIDTH 5 // 5字节接收地址宽度#define TX_PLOAD_WIDTH 32 // 20 uints TX payload#define RX_PLOAD_WIDTH 32 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令,读操作的寄存器的地址,设置地址AAAAA = 00000,以后要变更地址只需在该数值上加即可#define WRITE_REG 0x20 // 写寄存器指令,写操作的寄存器的地址,设置地址AAAAA = 00000,以后要变更地址只需在该数值上加即可#define RD_RX_PLOAD 0x61 // 读取接收数据指令(即读RX有效数据)#define WR_TX_PLOAD 0xA0 // 写待发数据指令(即写TX有效数据)#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令,(清除TX FIFO 寄存器)#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令,(清除RX FIFO 寄存器)#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留(空操作)//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//************************************************************************************* *void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);//*****************************************长延时*****************************************void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}//************************************************************************************* *****uint bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/************************************************************************************** ****/*延时函数/************************************************************************************** ****/void inerDelay_us(unsigned char n){for(;n>0;n--)_nop_();}//************************************************************************************* ***/*NRF24L01初始化//************************************************************************************* **/void init_NRF24L01(void){inerDelay_us(100);CE=0; // CE 为低,处于待机模式ICSN=1; // 不使能SPI片选信号SCK=0; // Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送}/************************************************************************************** **************/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/************************************************************************************** **************/uint SPI_RW(uint uchar){uint bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (uchar & 0x80); // 将数据uchar 的最高位赋值给SPI数据输出脚uchar = (uchar << 1); // 数据uchar 左移一位SCK = 1; /* MOSI上的数据在时钟上升沿发送,注意:时钟上升沿到来时,将数据uchar的最高位移入MOSI,同时,从设备的寄存器也将其当前存放的数据的最高位移入MISO,紧接着在SCK的下降沿的时候从设备的MOSI 接收到了主机发送过来的数据,同时主机也接收到了从设备发送过来的数据.*/uchar |= MISO; // 将MISO中的数据保存到数据uchar 的最低位SCK = 0; // 时钟下降沿的时候将MISO 上的电平存放到数据uchar 的最低位}return(uchar); // 将从机寄存器中的数据返回}/************************************************************************************** **************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI读时序/************************************************************************************** **************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // SPI片选信号,低电平使能,开启SPI数据传输 SPI_RW(reg); // 通过地址reg 选择所要读的寄存器reg_val = SPI_RW(0); // 读取所选寄存器当前存储的数据,将读到的值赋值给变量reg_val 。

相关主题