为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

多功能避障探测小车

2011-09-19 24页 doc 421KB 28阅读

用户头像

is_206173

暂无简介

举报
多功能避障探测小车多功能避障探测机器人 多功能避障探测小车 摘要:随着科学技术的不断发展,自动化技术已经开始在工业生产制造、现场救援、野外勘测以及人民生活当中开始广泛应用。尤其对人们的生命安全构成威胁的场所不适合人们亲自探测,这就需要自动装置去完成这种危险性的工作。基于使用方便、便于携带为其本原则考虑,我们设计了能够实现数据采集、图像发送接收以及自动避障避悬崖等多种功能的装置来完成一些特殊场合下的特种作业。本设计可以使一些复杂问题简单化,极具推广价值!1 系统设计方案 本系统是以89S52CPU为微处理器芯片,能收集和处理小车由超声波测距模块、...
多功能避障探测小车
多功能避障探测机器人 多功能避障探测小车 摘要:随着科学技术的不断发展,自动化技术已经开始在工业生产制造、现场救援、野外勘测以及人民生活当中开始广泛应用。尤其对人们的生命安全构成威胁的场所不适合人们亲自探测,这就需要自动装置去完成这种危险性的工作。基于使用方便、便于携带为其本原则考虑,我们设计了能够实现数据采集、图像发送接收以及自动避障避悬崖等多种功能的装置来完成一些特殊场合下的特种作业。本设计可以使一些复杂问题简单化,极具推广价值!1 系统设计 本系统是以89S52CPU为微处理器芯片,能收集和处理小车由超声波测距模块、红外蔽障模块、显示器传送的信息,通过电机驱动芯片L298N驱动步进电机运转,运动状态及距离前方障碍的距离通过5110液晶屏显示,采用无线摄像头,实现无线拍摄、时时显示,将信号传递到无线接收器及采集卡。再将信号传递到计算机,显示图像。使小车具有自动避障功能、到危险场所进行信息拍摄、危险建筑测量以及到未知环境下进行测量等功能。 2 系统芯片简介 2.1 系统核心芯片89S52 AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有 8K 的系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一 切工作停止,直到下一个中断或硬件复位为止。 AT89S52图2-1-1 AT89S52封装图 图 2-1-2 AT89S52结构图 多功能I/O口 AT89S52共有四个8位的并行I/O口:P0、P1、P2、P3端口,对应的引脚分别是P0.0 ~ P0.7,P1.0 ~ P1.7,P2.0 ~ P2.7,P3.0 ~ P3.7,共32根I/O线。每根线可以单独用作输入或输出。 ①P0端口,该口是一个8位漏极开路的双向I/O口。在作为输出口时,每根引脚可以带动8个TTL输入负载。当把“1”写入P0时,则它的引脚可用作高阻抗输入。当对外部程序或数据存储器进行存取时,P0可用作多路复用的低字节地址/数据总线,在该模式,P0口拥有内部上拉电阻。在对Flash存储器进行编程时,P0用于接收代码字节;在校验时,则输出代码字节;此时需要外加上拉电阻。 ②P1端口,该口是带有内部上拉电阻的8位双向I/O端口,P1口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。P1口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。在对Flash编程和程序校验时,P1口接收低8位地址。另外,P1.0与P1.1可以配置成定时/计数器2的外部计数输入端(P1.0/T2)与定时/计数器2的触发输入端(P1.0/T2EX),如1-1所示。   表2-1-1  P1口管脚复用功能 端口引脚 复用功能 P1.0 T2(定时器/计算器2的外部输入端) P1.1 T2EX(定时器/计算器2的外部触发端和双向控制) P1.5 MOSI(用于在线编程) P1.6 MISO(用于在线编程) P1.7 SCK(用于在线编程)   ③ P2端口,该口是带有内部上拉电阻的8位双向I/O端口,P2口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。P2口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。在访问外部程序存储器或16位的外部数据存储器(如执行MOVX  @DPTR指令)时,P2口送出高8位地址,在访问8位地址的外部数据存储器(如执行MOVX  @RI指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中P2寄存器的内容),在整个访问期间不会改变。在对Flash编程和程序校验期间,P2口也接收高位地址或一些控制信号。 ④ P3端口,该口是带有内部上拉电阻的8位双向I/O端口,P3口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。P3口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。在AT89S52中,同样P3口还用于一些复用功能,如表1-2所列。在对Flash编程和程序校验期间,P3口还接收一些控制信号。   表2-1-2  P3端口引脚与复用功能表 端口引脚 复用功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 INT0(外部中断0) P3.3 INT1(外部中断1) P3.4 T0(定时器0的外部输入) P3.5 T1(定时器1的外部输入) P3.6 WR(外部数据存储器写选通) P3.7 RD(外部数据存储器读选通) RST  复位输入端。在振荡器运行时,在此脚上出现两个机器周期的高电平将使其单片机复位。看门狗定时器(Watchdog)溢出后,该引脚会保持98个振荡周期的高电平。在SFR AUXR(地址8EH)寄存器中的DISRTO位可以用于屏蔽这种功能。DISRTO位的默认状态,是复位高电平输出功能使能。 ALE/PROG  地址锁存允许信号。在存取外部存储器时,这个输出信号用于锁存低字节地址。在对Flash存储器编程时,这条引脚用于输入编程脉冲PROG。一般情况下,ALE是振荡器频率的6分频信号,可用于外部定时或时钟。但是,在对外部数据存储器每次存取中,会跳过一个ALE脉冲。在需要时,可以把地址8EH中的SFR寄存器的0位置为“1”,从而屏蔽ALE的工作;而只有在MOVX或MOVC指令执行时ALE才被激活。在单片机处于外部执行方式时,对ALE屏蔽位置“1”并不起作用。 PSEN  程序存储器允许信号。它用于读外部程序存储器。当AT89S52在执行来自外部存储器的指令时,每一个机器周期PSEN被激活2次。在对外部数据存储器的每次存取中,PSEN的2次激活会被跳过。 EA/Vpp  外部存取允许信号。为了确保单片机从地址为0000H~FFFFH的外部程序存储器中读取代码,故要把EA接到GND端,即地端。但是,如果锁定位1被编程,则EA在复位时被锁存。当执行内部程序时,EA应接到Vcc。在对Flash存储器编程时,这条引脚接收12V编程电压Vpp。 XTAL1  振荡器的反相放大器输入,内部时钟工作电路的输入。 XTAL2  振荡器的反相放大器输出。 2.2 超声波测距 超声波探头又称超声波换能器,用来测量距离障碍物的距离,根据距离控制机器人的运动,来避开障碍物,实现自动蔽障。它是采用进口镀膜晶片,适用于空气介质中测距、物位检测的电声转换器件。 超声波测距就是利用超声波来测量机器人距离障碍物的距离。超声波发射头发出超声波,当发出的超声波被前方的障碍物返射回来,返射回来的超声波被接收探头接收到。在发出超声波的同时单片机开始计时,当超声波信号返回时,计时停止;利用计时的时间和“测量距离= (时间*声速( 340M/S ) ) / 2”就可以知道机器人距离障碍物的距离了。单片机把测得的距离信息处理后实现对机器人控制的前进或停止,同时也传递给5110液晶显示器显示出来。 表2-2-1 测距引脚说明 序号 定义 说明 1 保留 保留 2 电源地 GND 3 信号输出 OUT 4 信号输入 IN 5 电源VCC +5V  GND和VCC是电源供电引脚,模块正5V供电; 2、 IN脚是模块的信号输入脚,用户从此脚输入控制信号,驱动模块工作,控制信号可以从单片机的IO口输出方波信号; 3、 OUT脚是模块接收到超声波后的返回信号输出脚,此引脚步在模块上电后输出高电平,当用户从输入脚发出驱动信号后,如果模块接收到返回超声波,OUT引脚即被拉低,输出低电平; 4、 保留引脚用于功能扩展; 功能实现原理:通过从IN脚输入40KH的方波信号,即从单片机的IO口连续发出高低电平,产生方波,方波的个数一般为10个左右,发出后启动定时器,开始计时,此时,超声波发射头开始发出超声波,当发出的超声波被前方的障碍物返射回来,返射回来的超声波被接收探头接收到,此时,模块的OUT引脚会产生一个从高电平到低电平的跳变,此时,要停止计时,通过计时的时间,根据以下公式计算测量距离: 2.3 蔽障传感器 ST178H红外光电传感器是采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,输出信号经施密特电路整形,稳定可靠。 图2-3-1 红外避障模块电路原理 功能实现原理:在小车的左、右、后三个方向用红外线蔽障。传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管一直处于关断状态,此时模块的输出端为低电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,光敏三极管饱和,此时模块的输出端为高电平,指示二极管被点亮。然后把信号传递给单片机(CPU),然后单片机控制电机,机器人自动避开障碍物。 2.4无线摄像头及液晶显示器 功能实现原理:在本设计还采用无线摄像头和液晶显示器,实现无线拍摄、时时显示,将信号传递到无线接收器及采集卡。再将信号传递到计算机,显示图像。同时将机器人的运动状态及距离前方障碍的距离通过5110液晶屏显示出来,能够给远程控制的操作员提供操作依据。 2.5电机驱动电路 本设计才步进电机带动小车,步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。 步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下: (1)控制换相顺序 通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。 (2)控制步进电机的转向 如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。 控制步进电机的速度 功能实现原理: 如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。 电机的驱动采用专用的电机驱动芯片L298N,一片L298N可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机, 5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。下图是L298N功能逻辑图及电路原理图。 表2-5-1 图2-5-1 驱动电路原理图 3 硬件设计方案 本例的硬件电路设计主要是围绕着超声波测距传感器 、避障传感器以及无线摄像头技术的使用进行的。 3.1 结构框图 本例的硬件电路包括串行通信接口电路、单片机电路、超声波测距电路、自动避障电路、无线摄像及液晶显示输出电路和电机驱动电路。其结构框图如图3-1 图3-1 硬件总体设计图 4 软件设计 软件设计的重点在于单片机如何实现摄像头的多方位摄像、自动避障、超声波测距等功能。 程序框图如下: 主程序开始: #include #define uchar unsigned char #define uint unsigned int //第一个步进电机控制 uchar code F1_Rotation[]={0x01,0x02,0x04,0x08};//正转表格 uchar code B1_Rotation[]={0x08,0x04,0x02,0x01};//反转表格 //蔽障模块 sbit IR_obj_left=P1^6; //左边障碍扫描 sbit IR_obj_right=P1^7; //右边障碍扫描 sbit IR_obj_back=P3^1; //后边障碍扫描 //显示器和测距 sbit sce = P1^0; //片选 sbit res = P1^1; //复位,0复位 sbit dc = P1^2; //1写数据,0写指令 sbit sdin = P1^3; //数据 sbit sclk = P1^4; //时钟 sbit BACK_LED=P1^5;//背光 sbit Trig = P3^0; //产生脉冲引脚 sbit Echo = P3^2; //回波引脚 uint distance[4],distance_data,a,b,k; //测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i,p,q; //自定义寄存器 bit succeed_flag; //测量成功标志 //6*16字符 unsigned char code shuzi[]={ /*-- 文字: > --*/ /*-- 文字: 0 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 1 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00, /*-- 文字: 2 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00, /*-- 文字: 3 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 4 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00, /*-- 文字: 5 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 6 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 7 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, /*-- 文字: 8 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 9 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00, /*-- 文字: : --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, /*-- 文字: C --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: M --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xFC,0x3C,0xC0,0x3C,0xFC,0x00,0x03,0x00,0x03,0x00,0x03,0x00 }; unsigned char code hanzi[]= { /*-- 文字: 蔽 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0xF2,0x9A,0x52,0xFF,0x92,0xFA,0x22,0xFF,0x12,0xF2,0x12,0x00,0x07,0x00,0x00,0x07, 0x04,0x07,0x04,0x02,0x01,0x02,0x04,0x00, /*-- 文字: 障 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0xFF,0x81,0x9D,0xE3,0x0A,0xFA,0xAE,0xAB,0xAE,0xFA,0x0A,0x00,0x07,0x00,0x00,0x02, 0x02,0x02,0x02,0x07,0x02,0x02,0x02,0x00, /*-- 文字: 机 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x84,0x64,0xFF,0x24,0x44,0xFE,0x02,0x02,0xFF,0x02,0x00,0x00,0x01,0x00,0x07,0x04, 0x02,0x01,0x00,0x00,0x07,0x04,0x07,0x00, /*-- 文字: 器 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0xA0,0xAF,0xA9,0xE9,0xAF,0x30,0xAF,0xA9,0xF9,0xAF,0xA0,0x00,0x00,0x07,0x04,0x04, 0x07,0x00,0x07,0x04,0x04,0x07,0x00,0x00, /*-- 文字: 人 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0x00,0x80,0x60,0x1F,0x60,0x80,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01, 0x00,0x00,0x00,0x01,0x02,0x04,0x04,0x00, /*-- 文字: 调 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x10,0xF1,0x02,0x80,0xFF,0x11,0xD5,0x5F,0xD5,0x11,0xFF,0x00,0x00,0x03,0x01,0x04, 0x03,0x00,0x01,0x01,0x05,0x04,0x07,0x00, /*-- 文字: 试 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x11,0xF6,0x00,0x04,0x24,0xE4,0x24,0x24,0xFF,0x05,0x06,0x00,0x00,0x07,0x02,0x01, 0x02,0x03,0x01,0x01,0x01,0x02,0x07,0x00, /*-- 文字: 运 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x10,0xF1,0x02,0x08,0x89,0xC9,0xB9,0x89,0xC9,0x89,0x08,0x00,0x06,0x01,0x02,0x04, 0x05,0x04,0x04,0x04,0x04,0x05,0x04,0x00, /*-- 文字: 动 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x92,0x52,0x32,0x52,0x92,0x10,0x08,0xFF,0x08,0x08,0xF8,0x00,0x03,0x01,0x01,0x01, 0x05,0x02,0x01,0x04,0x04,0x06,0x01,0x00, /*-- 文字: 状 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x84,0x48,0xFF,0x00,0x08,0x88,0x7F,0xC8,0x0A,0x0C,0x08,0x00,0x00,0x00,0x07,0x04, 0x02,0x01,0x00,0x00,0x01,0x02,0x04,0x00, /*-- 文字: 态 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x44,0x44,0x24,0x94,0xAC,0x27,0x4C,0x14,0xA4,0x46,0x44,0x00,0x04,0x03,0x00,0x07, 0x04,0x05,0x04,0x04,0x06,0x01,0x02,0x00, /*-- 文字: 距 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0xEF,0x09,0xF9,0x4F,0x40,0xFF,0x49,0x49,0x49,0x79,0x01,0x00,0x07,0x04,0x03,0x02, 0x02,0x07,0x04,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 离 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x02,0x82,0xBE,0xA2,0xB6,0xEB,0xB6,0xA2,0xBE,0x82,0x02,0x00,0x00,0x07,0x00,0x02, 0x03,0x02,0x02,0x03,0x04,0x07,0x00,0x00, /*-- 文字: 前 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ //13 0x04,0xF4,0x54,0x55,0xF6,0x04,0x06,0xF5,0x04,0xF6,0x04,0x00,0x00,0x07,0x01,0x05, 0x07,0x00,0x00,0x05,0x04,0x07,0x00,0x00, /*-- 文字: 进 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ //14 0x10,0xF1,0x02,0x24,0x24,0xFF,0x24,0x24,0xFF,0x24,0x24,0x00,0x06,0x01,0x02,0x06, 0x05,0x04,0x04,0x04,0x07,0x04,0x04,0x00, /*-- 文字: 后 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0xFE,0x0A,0xC9,0x49,0x49,0x49,0x49,0xC9,0x08,0x00,0x04,0x03,0x00,0x00, 0x07,0x02,0x02,0x02,0x02,0x07,0x00,0x00, /*-- 文字: 退 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x11,0xF6,0x00,0x00,0xFF,0x15,0x55,0x55,0x95,0x5F,0x00,0x00,0x06,0x01,0x02,0x02, 0x05,0x05,0x05,0x04,0x04,0x05,0x04,0x00, /*-- 文字: 左 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x04,0x04,0xC4,0x34,0x2F,0x24,0xE4,0x24,0x24,0x26,0x04,0x00,0x02,0x05,0x04,0x04, 0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 转 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x32,0x2E,0xFB,0xA2,0xA2,0x14,0x74,0x5F,0x54,0xD4,0x14,0x00,0x01,0x01,0x07,0x00, 0x00,0x00,0x02,0x02,0x05,0x00,0x00,0x00, /*-- 文字: 右 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x04,0x84,0x44,0xF4,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x00,0x01,0x00,0x00,0x07, 0x02,0x02,0x02,0x02,0x02,0x07,0x00,0x00, /*-- 文字: 转 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x32,0x2E,0xFB,0xA2,0xA2,0x14,0x74,0x5F,0x54,0xD4,0x14,0x00,0x01,0x01,0x07,0x00, 0x00,0x00,0x02,0x02,0x05,0x00,0x00,0x00, /*-- 文字: 停 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x10,0xFC,0x03,0x62,0xBA,0xAA,0xAB,0xAA,0xAA,0xBA,0x62,0x00,0x00,0x07,0x00,0x00, 0x00,0x04,0x04,0x07,0x00,0x00,0x00,0x00, /*-- 文字: 止 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0xF8,0x00,0x00,0x00,0xFF,0x10,0x10,0x10,0x10,0x00,0x04,0x04,0x07,0x04, 0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 碍 --*/ /*-- Trebuchet MS9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x21,0xF9,0x17,0xF1,0x00,0x5F,0x55,0x55,0x55,0xDF,0x40,0x00,0x00,0x03,0x01,0x03, 0x00,0x01,0x03,0x05,0x05,0x07,0x01,0x00 }; //延时函数// void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } void Delay(unsigned int i)//延时 { while(--i); } /*-------------------------------------------- LCD_write_byte: 使用SPI接口写数据到LCD 输入参数:dt:写入的数据; command :写数据/命令选择; 编写日期:20080918 ----------------------------------------------*/ void LCD_write_byte(unsigned char dt, unsigned char command) { unsigned char i; sce=0; dc=command; for(i=0;i<8;i++) { if(dt&0x80) sdin=1; else sdin=0; dt=dt<<1; sclk=0; sclk=1; } dc=1; sce=1; sdin=1; } /*--------------------------------------- LCD_init: 3310LCD初始化 编写日期:20080918 ----------------------------------------- */ void LCD_init(void) { res=0; delay_20us(); res=1; LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令 LCD_write_byte(0xD0,0);//设定液晶偏置电压 LCD_write_byte(0x20,0);//使用基本指令 LCD_write_byte(0x0C,0);//设定显示模式,正常显示 } /*------------------------------------------- LCD_set_XY: 设置LCD坐标函数 输入参数:X:0-83 Y:0-5 编写日期:20080918 ---------------------------------------------*/ void LCD_set_XY(unsigned char X, unsigned char Y) { LCD_write_byte(0x40 | Y, 0);// column LCD_write_byte(0x80 | X, 0);// row } /*------------------------------------------ LCD_clear: LCD清屏函数 编写日期:20080918 --------------------------------------------*/ void LCD_clear(void) { unsigned char t; unsigned char k; LCD_set_XY(0,0); for(t=0;t<6;t++) { for(k=0;k<84;k++) { LCD_write_byte(0x00,1); } } } /*--------------------------------------------- LCD_write_shu: 显示6(宽)*16(高)点阵列数字字母符号等半角类 输入参数:c:显示的字符; 编写日期:20080918 -----------------------------------------------*/ void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i; LCD_set_XY(row*6, page);// 列,页 for(i=0; i<6;i++) { LCD_write_byte(shuzi[c*12+i],1); } LCD_set_XY(row*6, page+1);// 列,页 for(i=6; i<12;i++) { LCD_write_byte(shuzi[c*12+i],1); } } /*--------------------------------------------- LCD_write_hanzi: 显示12(宽)*16(高)点阵列汉字等半角类 输入参数:c:显示的字符; 编写日期:20080918 -----------------------------------------------*/ void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i; LCD_set_XY(row*6, page);// 列,页 for(i=0; i<12;i++) { LCD_write_byte(hanzi[c*24+i],1); } LCD_set_XY(row*6, page+1);// 列,页 for(i=12; i<24;i++) { LCD_write_byte(hanzi[c*24+i],1); } } //显示数据转换程序 void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //*************************************************************** //外部中断0,用做判断回波电平 INTO_() interrupt 0 // 外部中断是0号 { outcomeH =TH1; //取出定时器的值 outcomeL =TL1; //取出定时器的值 succeed_flag=1; //至成功测量的标志 EX0=0; //关闭外部中断 } //**************************************************************** //定时器0中断,用做显示 timer0() interrupt 1 // 定时器0中断是1号 { TH0=0x0D; //写入定时器0初始值 TL0=0x77; switch(flag) { case 0x00: LCD_write_shu(9,4,bai);flag++;break; case 0x01: LCD_write_shu(10,4,shi);flag++;break; case 0x02: LCD_write_shu(11,4,ge) ;flag=0;break; } LCD_write_hanzi(9,2,p); //运动 LCD_write_hanzi(11,2,q); //方向 } void show() { LCD_init(); //初始化LCD模块 LCD_clear(); //清屏幕 LCD_write_hanzi(0,0,0); //蔽 LCD_write_hanzi(2,0,1); //障 LCD_write_hanzi(4,0,2); //机 LCD_write_hanzi(6,0,3); //器 LCD_write_hanzi(8,0,4); //人 LCD_write_hanzi(10,0,5); //调 LCD_write_hanzi(12,0,6); //试 LCD_write_hanzi(0,2,7); // 运 LCD_write_hanzi(2,2,8); //动 LCD_write_hanzi(4,2,9); //状 LCD_write_hanzi(6,2,10); //态 LCD_write_shu(8,2,10); //: LCD_write_hanzi(9,2,13); //前 LCD_write_hanzi(11,2,14); //进 LCD_write_hanzi(0,4,1); //障 LCD_write_hanzi(2,4,21); //碍 LCD_write_hanzi(4,4,11); //距 LCD_write_hanzi(6,4,12); //离 LCD_write_shu(8,4,10); //: LCD_write_shu(12,4,11); //C LCD_write_shu(13,4,12); //M } void data_do() { uchar CONT_1; EA=0; Trig=1; delay_20us(); Trig=0; //产生一个20us的脉冲,在Trig引脚 while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志 EX0=1; //打开外部中断 TH1=0; //定时器1清零 TL1=0; //定时器1清零 TF1=0; // TR1=1; //启动定时器1 EA=1; while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; //关闭定时器1 EX0=0; if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=588; k=distance_data; //微秒的单位除以58等于厘米 } //为什么除以58等于厘米, Y米=(X秒*344)/2 if(succeed_flag==0) { distance_data=0; //测试灯变化 } a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3) { CONT_1=0; b=a; conversion(b); } } //主函数// void main() { uint m; uchar temp; i=0; flag=0; Trig=0; //首先拉低脉冲输入引脚 TMOD=0x11; //定时器0,定时器1,16位工作方式 TR0=1; //启动定时器0 IT0=0; //由高电平变低电平,触发外部中断 ET0=1; //打开定时器0中断 EX0=0; //关闭外部中断 EA=1; //打开总中断0 P0=0xff; show(); P2=0X00; while(1) { P0=0xff; temp=P0; data_do(); if(temp==0x00) { if(k>=20) { P2=0x50; //前进 p=13; q=14; } else if(IR_obj_left) { P2=0x90; //左转 p=17; q=18; } else if(IR_obj_right) { P2=0x60; // 右转 p=19; q=20; } else if(IR_obj_back) { for(m=0;m<1000;m++) { P2=0xA0; //后退 p=15; q=16; delay_20us(); } } else { P2=0x00; //停止 p=21; q=22; } } else if(temp==0x01) { P2=0x00; //停止 p=21; q=22; } else if(temp==0x02) { P2=0x50; //前进 p=13; q=14; } else if((temp==0x03)&&IR_obj_back) { P2=0xa0; //后退 p=15; q=16; } else if((temp==0x04)&&IR_obj_left) { P2=0x90; //左转 p=17; q=18; } else if((temp==0x05)&&IR_obj_right) { P2=0x60;//右转 p=19; q=20; } else if(temp==0x06) { for(i=0;i<4;i++) //4相 { P2=F1_Rotation[i]; //输出对应的相 可以自行换成反转表格 Delay(500); //改变这个参数可以调整电机转速 } } else if(temp==0x07) { for(i=0;i<4;i++) //4相 { P2=B1_Rotation[i]; //输出对应的相 可以自行换成反转表格 Delay(500); //改变这个参数可以调整电机转速 } } } } 5 作品的创新点 本作品将单片机技术与传感器技术完美的结合起来,具有现今探测机器人的诸多特点,本作品是采用三个轮子作为运动的触角,具有一定的稳定性,本作品的创新点的在于小车上装设了摄像头,超声波测距以及自动避障装置,可以实现自动控制,本作品可以实现对危险地方的探测、摄像和测量等一些功能。尤其是应用在一些人类为了解的区域或人员由于某种原因不能进去的区域中进行一些数据的采集和拍摄可供工作人员进行分析,以便更好的了解里面的情况。从而能够给出更合理的应对和解决方案还。本装置的摄像头为红外线摄像头, 还可以实现监控及在夜间模式下的拍摄。本作品外形美观,质量轻,制造成本低、能耗小可长时工作、环保节能,因而具有很大的市场前景和实用性。 6 设计技术说明 (1)ST178H红外光电传感器可用作红外反射式光电开关。传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,输出信号经施密特电路整形,稳定可靠。 (2)由于换能器的聚焦件采用了多层阻抗匹配、背衬、压电元件频率误差小,具有良好的时间稳定性和温度稳定性、无退极化现象,通带特性好,芯片与声传输器件统一计算基波谐振频率本模块性能稳定,测度距离精确。能和国外的SRF05,SRF02等超声波测距模块相媲美。 (3)本装置的摄像头为红外线摄像头, 还可以实现监控及在夜间模式下的拍摄。 7 作品实用性 本设计具有智能化、人性化、模块化等特点。该作品的使用范围很广,它可以应用于工业,军事,日常生活。工业,它可以带一些危险的场所进行作业。军事,安装上一些枪支弹药,它就是一名战士,也可以对敌人军情进行探测。日常生活就是玩具,智能管家等应用。也可以用于危险场所,替代人去探测,去做一些危险的事。总而言之,该作品具有很大的发展前景。
/
本文档为【多功能避障探测小车】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索