一、系统总体设计 ........................................................................................................................... 3 二、硬件设计 ................................................................................................................................... 5
2.1 AT89S52单片机主控模块 ................................................................................................. 5 2.2 NE555产生40kHz频率模块 ........................................................................................... 6 2.3 超声波测距收发模块 ........................................................................................................ 9
2.3.1 超声波发射模块 ................................................................................................... 11 2.3.2 超声波接收模块 ................................................................................................... 12 2.4 DS18B20温度测量模块 ................................................................................................. 15 2.5 红外遥控模块 .................................................................................................................. 18 2.6 1602液晶显示模块......................................................................................................... 20 三、程序设计 ................................................................................................................................. 29
3.1 超声波测距收发模块程序设计 ...................................................................................... 32 3.2 DS18B20温度测量模块程序设计 .................................................................................. 35 3.3 红外遥控模块程序设计 .................................................................................................. 42
3.3.1 0和1的编码 ....................................................................................................... 42 3.3.2 按键的编码 ........................................................................................................... 42 3.3.3 遥控信号的解码算法及程序编写 ....................................................................... 43 3.4 1602液晶显示模块程序设计 ......................................................................................... 45 四、结语......................................................................................................................................... 47 五、谢辞......................................................................................................... 错误!未定义书签。 六、参考文献 ................................................................................................................................. 48
1
红外遥控超声波测距仪
吴飞运
0600310326
关键词:传感器 超声波 温度 测距
摘要
红外遥控超声波测距仪是以超声波测距为核心的多传感器巧妙结合的作品。本作品用到红外传感器一体化红外接收头、温度传感器DS18B20、压电式传感器超声波测距收发头等传感器。可以根据需要用红外遥控来选择不同的运行模式,并实时地将运行结果在1602液晶显示出来,具有较好的人机界面。本
2
作品可以用于测温、测距,测量精度较高,测量效果很好。如果经过稍微改装,还可以将本作品应用在机器人和汽车上。
一、系统总体设计
3
图1.1-1 系统总体设计框图
红外遥控超声波测距仪主要由AT89S52单片机主控模块、NE555产生40kHz频率模块、超声波测距收发模块、DS18B20温度测量模块、红外遥控模块、1602液晶显示模块等模块组成。
本作品用AT89S52单片机主控模块来控制系统的运行,用红外遥控模块做模式选择,用DS18B20温度测量模块测量温度,用NE555产生40kHz频率模块供给超声波测距收发模块,用超声波测距收发模块来接收和发射超声波信号,用1602液晶显示模块来显示运行结果。
本作品开始运行时在1602液晶显示屏上显示作者的名字,然后自动提示用户进行模式选择,按遥控上的“1”键只测量温度并显示;按“2”键只测量距离并显示;按“3”键测温测距并显示;按“4”键显示作者的名字。用户可以根据需要用红外遥控来选择不同的运行模式。
4
二、硬件设计
2.1 AT89S52单片机主控模块
图2.1-1 AT89S52单片机主控模块图
图2.1-1中的左下部是电源模块用9V供电经7805稳压为5V后供给系统使用。左上部是52单片机的复位电路,按下按键可以手动复位。LOAD_SE1是下载头,用来下载程序。单片机的CON接到NE555产生40kHz频率模块,INT0接到红外遥控模块,BACK_PLUS接到超声波测距收发模块,DQ接到DS18B20温度测量模块,E、RW、RS、D0~D7接到1602液晶显示模块。
AT89S52单片机简介:
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
主要性能:
● 与MCS-51单片机产品兼容
5
● 8K字节在系统可编程Flash存储器 ● 1000次擦写周期 ● 全静态操作:0Hz~33Hz ● 三级加密程序存储器 ● 32个可编程I/O口线 ● 三个16位定时器/计数器
● 八个中断源,全双工UART串行通道 ● 低功耗空闲和掉电模式 ● 掉电后中断可唤醒 ● 看门狗定时器 ● 双数据指针 ● 掉电标识符
2.2 NE555产生40kHz频率模块
图2.2-1 NE555产生40kHz频率模块图
6
图2.2-1 中当SW1开关拨到VCC端时,NE555连续发射频率;当接到CON端时,由单片机来控制是否发射频率,当CON为高电平时发射,低电平时不发射。40KHZ_SEND将产生占空比约为1:2的40kHz的频率,40KHZ_SEND接到超声波测距收发模块。
NE555简介:
NE555时基集成电路是8脚的数字集成电路,是由21个晶体三极管、4个晶体二极管和16个电阻组成的定时器,有分压器、比较器、触发器和放电器等功 能的电路。它具有成本低、易使用、适应面广、驱动电流大和一定的负载能力。在电子制作中只需经过简单调试,就可以做成多种实用的各种小电路,远远优于三极管电路,内部结构如图2.2-2。
它的各个引脚功能如下:
1脚:外接电源负端VSS或接地,一般情况下接地。
8脚:外接电源VCC,双极型时基电路VCC的范围是4.5 ~ 16V,CMOS型时基电路VCC
的范围为3 ~ 18V。
3脚:输出端Vo 2脚:TL低触发端 6脚:TH高触发端
4脚:RD是直接清零端。当RD端接低电平,则时基电路不工作,此时不论TL、TH处于何电平,时基电路输出为“0”,该端不用时应接高电平。
5脚:VC为控制电压端。若此端外接电压,则可改变内部两个比较器的基准电压,当该端不用时,应将该端串入一只0.01μF电容接地,以防引入干扰。
7脚:放电端。该端与放电管集电极相连,用做定时器时电容的放电。 在1脚接地,5脚未外接电压,两个比较器A1、A2基准电压分别为情况下,555时基电路的功能表如表2.2-1所示。
7
21VCC,VCC的33
图2.2-2 NE555内部结构图
NE555时基集成电路的主要参数:电源电压4.5~16V,输出驱动电流为200毫安,作定时器使用时,定时精度为1%,作振荡使用时,输出的脉冲的最高频率可达500千赫。
清零端RD 0 1 高触发端TH 低触发端TL Qn+1 放电管T 功能 直接清零 置0 2VCC 3 1VCC 38
0 0 导通 导通
1 1 2VCC 32VCC 31VCC 31VCC 31 Qn 截止 不变 置1 保持 表2.2-1 555时基电路的功能表
NE555应用十分广泛,可装如下几种电路: (1)单稳类电路
作用:定延时,消抖动,分(倍)频,脉冲输出,速率检测等。 (2)双稳类电路
作用:比较器,锁存器,反相器,方波输出及整形等。 (3)无稳类电路
作用:方波输出,电源变换,音响报警,玩具,电控测量,定时等。 时基电路,可以作成:振荡器,也可以作放大用。
2.3 超声波测距收发模块
图2.3-1 超声波探头图
超声波测距原理 :
9
1、 超声波发生器
为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。
2、压电式超声波发生器原理
压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超声波发生器内
部结构如图2.3-1所示,它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
图2.3-1 超声波发生器内部结构图
3、超声波测距原理
途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。若
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2,这就是所谓的时间差测距法。
10
2.3.1 超声波发射模块
图2.3.1 超声波发射模块图
40kHz频率可以由单片机产生,也可以由NE555产生,本作品用NE555产生,产生的频率稳定,控制也方便。图2.3.1中的非门CD4049对40KHz频率信号进行调理,以使超声波传感器产生谐振。
11
2.3.2 超声波接收模块
图2.3.2-1 超声波接收模块图
超声波接收处理部分电路前级采用NE5532构成10000倍放大器,对接收信号进行放大;后级采用LM311比较器对接收信号进行调整,比较电压为LM311的3管脚的输入。 LM311输出7脚在图2.3.2-1的电路中,无回波信号时输出低电平 ;当有回波信号时输出方波,有下降沿出现,单片机进入外部中断程序。
NE5532简介:
图2.3.2-2 NE5532引脚图
5532是高性能低噪声运放,与很多标准运放(如1458)相似,它具有较好的噪声性能,优良的输出驱动能力及相当高的小信号与电源带宽。 (1)小信号带宽:10MHz; (2)输出驱动能力:600Ω,10V;
(3)输入噪声电压:5nV/√HZ(典型值); (4)DC电压增益:50000; (5)AC电压增益:10KHz时2200; (6)电源带宽:140KHz;
12
(7)转换速率:9V/μS;
(8)大电源电压范围:±3~±20V。 极限参数:
电源电压:Vs …………………… ±22V 差分输入电压:VDIFF …………………… ±5V 工作温度范围:TA …………………… 0℃~70℃ 存贮温度:TSTG …………………… -65℃~150℃ 结温:Tj …………………… 150℃
功耗(5532FE):PD …………………… 1000mW 引线温度(焊接,10S)…………………… 300℃
LM311简介:
LM311是单片高速电压比较器,是放大器总类的IC。可以用于产生很宽范围的电压,包括给运算放大器提供的+/-15V电压和系统的5V逻辑电压。输出电压和大多数TTL和MOS电路兼容。通常用的是DIP-8封装形式的,其外型以及引脚如图3.5:
其2,3,7脚为一个放大器单元。2脚为同向输入端,3脚为反向输入端,7脚为输出。
工作原理是:给8脚和4脚分别置电源的两端,2脚和3脚分别输入采集的需要比较的两个模拟电压,当同向电压大于反向电压的话,侧7脚输出逻辑的“1”;反之,若反向大于正向,输出逻辑“0”。输出的逻辑“1”“0”的大小伏值由置与8和4脚的电源电压来决定。比如:置8为+5V,4为0,则比较后输出的逻辑电平伏值就是5V和0V。也可以置其双电源,双电源就好比+5V和-5V,其优点就是可以用于比较在0V上下的电压。现在好多种类的传感器输出就是0V上下的正旋波。
图2.3.2-3 LM311框图
13
超声波测距注意事项:避免余波信号的干扰。
图2.3.2-4 超声波发射头和接收头的两个波形图
图2.3.2-4是通过示波器采集的超声波发射头和接收头的两个波形。从图中我们,当发射头发出一组40KHz的脉冲后(图中下面的波形),接收头几乎在同一时间就收到了超声波信号,这个波束是余波信号。持续一段时间后,我们才看到超声波接收头又收到了一组波束,这个才是经过被测物表面反射的回波信号。
超声波测距时,需要测的是开始发射到接收到信号的时间差,由上图中就可看出,需要检测的有效信号为反射物反射的回波信号,故要尽量避免检测到余波信号。这就要求对接收头收到的波束进行处理,这也是超声波检测中存在最小测量盲区的主要原因。
在软件中的处理方法就是,当发射头发出脉冲后,记时器同时开始记时。我们在记时器开始记时一段时间后再开启检测回波信号,以避免余波信号的干扰。等待的时间可以为1ms左右。更精确的等待时间可以减小最小测量盲区。
14
2.4 DS18B20温度测量模块
图2.4-1 DS18B20温度测量模块图
DS18B20简介:
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线
路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点
(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在-55。C到+125。C之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。
15
(6)、内部有温度上、下限告警设置。
DS18B20的引脚介绍:
TO-92封装的DS18B20的引脚排列见图图2.4-2,其引脚功能描述见表表2.4-1。
图2.4-2 DS18B20的引脚排列底视图
序号 1 2 GND 地信号 DQ 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。 3 VDD 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。 表2.4-1 DS18B20详细引脚功能描述
DS18B20的使用方法:
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时
16
名称 引脚功能描述 序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
DS18B20的复位时序:
图2.4-3 DS18B20的复位时序图
DS18B20的读时序:
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。
图2.4-4 DS18B20的读时序图
DS18B20的写时序:
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
17
图2.4-5 DS18B20的写时序图
2.5 红外遥控模块
图2.5-1
红外遥控模块图
图2.5-2 红外一化接收头0038图
18
图2.5-3 科朗800合1万能电视遥控器RM-2008+图
此模块的INT0接到单片机的外部中断0。当遥控无按键按下时,INT0为高电平;当遥控有按键按下时,INT0出现低电平,进入外部中断服务程序,程序里对按键解码识别后,就可以根据不同的按键来做不同的相应操作。如系统工作的模式选择等。
遥控器使用方便,功能多。目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。如果能将遥控器上许多的按键解码出来。用作单片机系统的输入。则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。
红外遥控接收可采用较早的红外接收二极管加专用的红外处理电路的方法。如CXA20106,此种方法电路复杂,现在一般不采用。较好的接收方法是用一体化红外接收头,它将红外接收二极管、放大、解调、整形等电路做在一起,只有三个引脚.分别是+5V电源、地、信号输出。红外接收头的信号输出接单片机的INT0或INTl脚。用一只PNP型三极管对输出信号进行放大效果更好。
19
2.6 1602液晶显示模块
图2.6-1
1602液晶显示模块图
1602字符型LCD简介:
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图2.6-2、2.6-3。
20
图2.6-2 1602字符型液晶显示器实物正面图
图2.6-3 1602字符型液晶显示器实物背面图
1602LCD的基本参数及引脚功能:
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光
的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如图2.6-4所示:
21
图2.6-4 1602LCD尺寸图
1602LCD主要技术参数:
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表
显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm
编号 符号 引脚说明 编号 符号 引脚说明 22
1 2 3 4 5 6 7 8 VSS VDD VL RS R/W E D0 D1 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 9 10 11 12 13 14 15 16 D2 D3 D4 D5 D6 D7 BLA BLK 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 表2.6-1 引脚接口说明表 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
1602LCD的指令说明及时序:
1602液晶模块内部的控制器共有11条控制指令,如表2.6-2所示:
23
序号 1 2 3 4 5 6 7 8 9 10 指令 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 RS 0 0 0 0 0 0 R/W D7 D6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 D5 D4 D3 D2 D1 D0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 * S B * * 1 I/D D C 1 S/C R/L * DL N F * 置字符发生存贮器地址 0 置数据存贮器地址 读忙标志或地址 写数到DDRAM) 从CGRAM或DDRAM读数 CGRAM或0 0 1 字符发生存贮器地址 显示数据存贮器地址 BF 计数器地址 要写的数据内容 11 1 1 读出的数据内容 表2.6-2 控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
24
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。
与HD44780相兼容的芯片时序表如下: 读状态 写指令 输入 RS=L,R/W=H,E=H 输出 D0—D7=状态字 输入 RS=L,R/W=L,D0—D7=指令码,E=输出 无 高脉冲 读数据 写数据 输入 RS=H,R/W=H,E=H 输出 D0—D7=数据 输入 RS=H,R/W=L,D0—D7=数据,E=高输出 无 脉冲 表2.6-3 基本操作时序表
读写操作时序如图2.6-5和图2.6-6所示:
25
图2.6-5 读操作时序
图2.6-6 写操作时序
1602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的
忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图2.6-7是1602的内部显示地址。
26
图2.6-7 1602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定
位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是
自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点
阵字符图形,如表2.6-4 所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
27
表2.6-4 字符代码与图形对应表
28
系统总体程序设计: 三、程序设计
29
图3-1 系统总体程序设计框图
系统总体程序设计部分程序代码:
void key_scan(void) {
switch(Key_control) { case 1:
DS18B20();
Display_temperature();
30
}
break;
case 2:
Distance_measure(); break;
case 3:
DS18B20();
Distance_measure(); break;
case 4: }
Display_List_Char(0,2,\"Powered by:\"); Display_List_Char(1,4,\"--Wu Fei Yun\"); break;
void init(void) {
PX0=1;
//设置外
部中断0为高优先级
31
IT0=1;
//下降沿触发方式
EX0=1; //允许外部中断0,用于检测红外遥控器按键 EA=1; //总中断开
initial_lcd1602(); //初始化LCD
}
Display_List_Char(0,2,\"Powered by:\"); Display_List_Char(1,6,\"--Feewon\");
delay_1s();
initial_lcd1602(); //初始化LCD Display_List_Char(0,0,\" REMOTE CONTROL\");
void main(void) { }
init(); while(1) { }
key_scan();
3.1 超声波测距收发模块程序设计
超声波测距部分程序代码: void INT1_Ultrasonic() interrupt 2 {
32
TR0=0; //关定时器0 CON=0; //停止发40kHz
EX1=0; //关外部中断1
high_time=TH0; low_time=TL0;
dist[test_count]=Distance_count(); if(dist[test_count]>6)
test_count++;
if(test_count==6) { sort(dist,test_count);
distance=average()-4;
可以加补偿值用来校正 dispart();
//for(i=;i<20;i++)
display_dis();
test_count=0;
} finish=1;
}
void Distance_measure(void) { CON=0;
//先初始化停止发40kHz finish=0;
33
在此处
//
TMOD=0x11; 定时0为16位
TH0=0;
TL0=0;
清定时值 TR0=0;
//关定时器0
IT1=1; 外部中断1下降沿触发 EX1=1;
//开外部中断1
EA=1;
开总中断
CON=1;
//开始发40kHz TR0=1;
//开定时器0
while(finish==0);
delay_200ms();
}
对每个测量过程测得的六个值用选择排序法从小到大排序: void sort(float array[],uchar n) { uchar i,j,k; float t;
34
//
//
//
//
}
for(i=0;i for(j=i+1;j t=array[k]; array[k]=array[i]; array[i]=t; 每个测量过程测量六次,取中间四个值的平均值作为最终结果: float average(void) { } float dis_temp; dis_temp=dist[1]+dist[2]+dist[3]+dist[4]; dis_temp=dis_temp/4.0; return dis_temp; 3.2 DS18B20温度测量模块程序设计 为了提高精度,需要考虑不同温度下超声波在空气中传播速度随温度变化的关系,可用DS18B20对超声波测距做温度补偿,如下式: v=331.4+0.61T (2) 式中,T为实际温度(℃),v的单位为m/s。 35 DS18B20测温程序部分代码: /******************************* 延时函数 ******************************** *在12MHz的晶振条件下。 **************************************************************************/ void Delay(int useconds) { } /******************************* 复位函数 ******************************* * 功能:完成单总线的复位操作。 * 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。 * 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。 **************************************************************************/ uchar Reset_Bus(void) { uchar presence; // int s; for (s=0; s // DQ = 1; // DQ返回高电平 Delay(3); 等待存在脉冲 36 // presence = DQ; 获得存在信号 Delay(25); 等待时间隙结束 // // return(presence); 返回存在信号,0 = 器件存在, 1 = 无器件 } /****************************** 位写入函数 ******************************* * 功能:向单总线写入1位值:bitval // *************************************************************************/ void Write_Bit(char bitval) { DQ = 0; 将DQ 拉低开始写时间隙 // if(bitval==1) DQ =1; // 如果写1,DQ 返回高电平 Delay(5); 在时间隙内保持电平值, // DQ = 1; Delay函数每次循环延时16μs,因此delay(5) = 104μs } /**************************** 字节写入函数 ******************************* * 功能:向单总线写入一个字节值:val // *************************************************************************/ void Write_Byte(char val) { 37 } uchar i; uchar temp; for (i=0; i<8; i++) { } Delay(5); temp = val>>i; temp &= 0x01; Write_Bit(temp); // 写入字节, 每次写入一位 /**************************** 位读取函数 ******************************** * 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 * 的delay()函数,而采用一个for()循环来实现延时。 * ***********************************************************************/ uchar Read_Bit(void) { } /**************************** 字节读取函数 ******************************* uchar i; DQ = 0; DQ = 1; //将DQ拉低开始读时间隙 // then return high for (i=0; i<3; i++); // 延时15μ return(DQ); // 返回 DQ 线上的电平值 38 * 功能:从单总线读取一个字节的值 *************************************************************************/ uchar Read_Byte(void) { uchar i; uchar value = 0; for (i=0;i<8;i++) // 读取字节,每次读取一 个字节 } /******************************* 读取温度函数 ***************************** * 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器 * 件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。 **************************************************************************/ uint DS18B20_Tmp_Read(void) { { } if(Read_Bit()) value|=(0x01<// 然后将其左移 Delay(6); return(value); uint TEMP; uchar TEMP_L,TEMP_H; Reset_Bus(); Write_Byte(0xCC); 39 // 跳过 ROM } Write_Byte(0x44); Delay(5); // 启动温度转换 //延时100uS Reset_Bus(); //复位操作 // 跳过 ROM // 读暂存器 //低8位 //高8位 Write_Byte(0xCC); Write_Byte(0xBE); TEMP_L = Read_Byte(); TEMP_H = Read_Byte(); TEMP=TEMP_H; TEMP=TEMP<<8; TEMP=TEMP|TEMP_L; return TEMP; void tem_deal(void) { +1; sign=(uchar)((tmp>>8)&0xf0); sign2=0; if(sign==0xf0) { tmp=(~tmp)+1; //若温度为负,取反 //判断温度是否为负 //取高四位为符号位 } sign2=1; //设负号标记为1 tmp_point=(uchar)(tmp&0x0f); //取低4位 tmp_integer=(uchar)((tmp>>4)&0xff); //去除低4位后,取剩下的 12位,即是整数部分 40 tmp_point=tmp_point*6.25; 得小数部分 point_two_t=tmp_point%10; point_one_t=tmp_point/10; one_t=tmp_integer%10; ten_t=(tmp_integer%100)/10; } void Display_temperature(void) { Display_List_Char(0,2,\"Tem:\"); Display_One_Char(0,7,LCD_Code[ten_t]); Display_One_Char(0,8,LCD_Code[one_t]); Display_One_Char(0,9,LCD_Code[piont]); Display_One_Char(0,10,LCD_Code[point_one_t]); Display_One_Char(0,11,LCD_Code[point_two_t]); Display_List_Char(0,13,\"C\"); } void DS18B20(void) { tmp=DS18B20_Tmp_Read(); tem_deal(); Display_temperature(); } 41 //将低4位*0.0625*100 //小数点第2位 //小数点第1位 //个位 //十位 //显示温度 3.3 红外遥控模块程序设计 图3.3-1 0和1的编码图 图3.3-2 接收波形图 用单片机解码红外遥控解码: 下面以TC9012编码芯片的遥控器为例。谈谈如何用常用的51系统单片机进行遥控的解码。 编码格式 3.3.1 0和1的编码 遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。TC9012的0和1采用PWM方法编码,即脉冲宽度调制,其0码和1码如3-11所示(以遥控接收输出的波形为例)。0码由0.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。 3.3.2 按键的编码 当我们按下遥控器的按键时,遥控器将发出如图3.3-2的一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5部分,分别为引导码、地址码、 42 地址码、数据码、数据反码。遥控器发射代码时.均是低位在前。高位在后。由图3.3-2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。当接收到此码时。表示一帧数据的开始。单片机可以准备接收下面的数据。地址码由8位二进制组成,共256种.图中地址码重发了一次。主要是加强遥控器的可靠性。如果两次地址码不相同.则说明本帧数据有错,应丢弃。不同的设备可以拥有不同的地址码.因此。同种编码的遥控器只要设置地址码不同,也不会相互干扰。图中的地址码为十六进制的0EH(注意低位在前)。在同一个遥控器中.所有按键发出的地址码都是相同的。数据码为8位,可编码256种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误.数据应丢弃。在同一个遥控器上。所有按键的数据码均不相同。在图3.3-2中,数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前).两者之和应为0FFH。 3.3.3 遥控信号的解码算法及程序编写 平时,遥控器无键按下。红外发射二极管不发出信号,遥控接收头输出信号1。有键按下时.0和1编码的高电平经遥控头倒相后会输出信号0.由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。单片机在中断时使用定时器0或定时器1开始计时.到下一个脉冲到来时,即再次产生中断时,先将计时值取出。清零计时值后再开始计时.通过判断每次中断与上一次中断之间的时间间隔。便可知接收到的是引导码还是 0和1。如果计时值为9ms。接收到的是引导码,如果计时值等于1.12ms,接收到的是编码0。如果计时值等于2. 25ms.接收到的是编码1。在判断时间时,应考虑一定的误差值。因为不同的遥控器由于晶振参数等原因,发射及接收到的时间也会有很小的误差。 以接收TC9012遥控器编码为例,解码方法如下: (1)设外部中断0(或者1)为下降沿中断,定时器0(或者1)为16位计时器.初始值均为0。 (2).第一次进入遥控中断后,开始计时。 (3)从第二次进入遥控中断起,先停止计时。并将计时值保存后,再重新计时。如果计时值等于前导码的时间,设立前导码标志。准备接收下面的一帧遥控数据,如果计时值不等于前导码的时间,但前面已接收到前导码,则判断是遥控数据的0还是1。 (4)继续接收下面的地址码、数据码、数据反码。 43 (5)当接收到32位数据时,说明一帧数据接收完毕。此时可停止定时器的计时,并判断本次接收是否有效.如果两次地址码相同且等于本系统的地址,数据码与数据反码之和等于0FFH,则接收的本帧数据码有效。否则丢弃本次接收到的数据。 (6)接收完毕,初始化本次接收的数据,准备下一次遥控接收。 红外遥控模块部分代码: /*----------------------------------------------------------*/ /*-----------------------红外解码程序(核心)-----------------*/ /*----------------------------------------------------------*/ void IR_decode() { uchar i,j; // while(RECEIVE==0); 等待引导码高电平到来 delay2400(); 延时2.4ms // if(RECEIVE==1) //如果检测到高电平表示检测到引 导码4.5ms的高电平 { // delay2400(); 再延时2.4ms加前面延时的2.4ms共延时4.8ms //目的是避开4.5ms的高电平,并保证此时为低电平 for(i=0;i<4;i++) 正式开始解码,4个8位共32位数据码 // { for(j=0;j<8;j++) 44 { while(RECEIVE==0); //等待地址码第1位 高电平到来 delay882(); //延时882us判断此时引 脚电平 if(RECEIVE==0) { date[i]>>=1; date[i]=date[i]&0x7f; //将date[i] 最高位清0,其余7位不变 } else if(RECEIVE==1) { // delay1000(); 延时1ms,保证延时1ms后回到低电平 date[i]>>=1; date[i]=date[i]|0x80; //将date[i] 最高位置1,其余7位不变 } } } //1位二进制码接收结束 } //8位二进制码接收结束 } //32位二进制码接收结束 3.4 1602液晶显示模块程序设计 LCD1602初始化程序: 45 void initial_lcd1602(void) LCD1602 { uchar i; EN=0; for(i=200;i>0;i--) lcd_delay(248); write_lcd_command(0x38); 令,双行显示,显示5x7的点阵字符 for(i=4;i>0;i--) lcd_delay(248); write_lcd_command(0x38); 0x38命令,双行显示,显示5x7的点阵字符 for(i=4;i>0;i--) lcd_delay(248); write_lcd_command(0x0c); 不闪烁 for(i=4;i>0;i--) lcd_delay(248); write_lcd_command(0x06); 不移动 for(i=4;i>0;i--) lcd_delay(248); write_lcd_command(0x01); for(i=4;i>0;i--) lcd_delay(248); } 46 //初始化 //0x38 命 //再写一次 //无光标, //光标右移,文字 //清屏 四、结语 本作品红外遥控有效距离较远,可达十几米,并且遥控解码准确无误。测温可精确到0.01摄氏度。测距可精确到0.01米,能测到2.5米左右,在2米内测距效果更佳。LCD1602的显示清晰、稳定。 本作品用到红外传感器一体化红外接收头、温度传感器DS18B20、压电式传感器超声波测距收发头等传感器。完成本作品后,我对一些常用的传感器有了更深刻的理解,并将学到的理论知识应用到了实践中去,自己的动手实践能力得到了很大的提高。 47 六、参考文献 [1] 王文辉,刘淑英,蔡胜乐等.电路与电子学(第3版)[M].北京:电子工业出版社,2007.6 [2] 宋培义,刘立新.单片机原理、接口技术及应用[M].北京:北京航空航天大学出版 社.1999.1:3~398. [3] 何利民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空 航天大学出版社,2003. [4] 谭浩强.C程序设计[M].北京:清华大学出版社,2004 [5] 王建校,杨建国,宁改娣,危建国.51系列单片机及C51程序设计[M].北京:科学出版社,2002.4 48 49 因篇幅问题不能全部显示,请点此查看更多更全内容