超声波传感器测距离
目 录
................................................ 2 一、课程设计任务书
二(超声波传感器测距原理 ......................................... 42.1超声波传感器 .................................................... 4 2.2超声波测距原理概述 .............................................. 5 三(系统总体设计
.............................................. 6
四(系统的硬件结构设计 ............................................ 8
4.1 单片机最小系统原理概述 .......................................... 8 4.2超声波发射电路 ................................................. 13
超声波检测接收电路 ............................................. 14 4.3
4.4 超声波测距系统的显示电路设计 ................................... 14 4.5 PROTUES仿真硬件电路图 ......................................... 15 五(系统软件的设计 ............................................... 15
5.1 超声波测距仪的算法设计 ......................................... 16 5.2 程序流程图 ..................................................... 16 5.3 主程序设计 ..................................................... 18 5.4定时中断服务子程序设计 ......................................... 18 5.5超声波发生子程序和超声波接收中断程序设计 ....................... 19 六(调试结果 ...................................................... 20
七(系统误差来源及解决方案分析 ................................. 22
八(收获体会 ...................................................... 23
参考文献 ........................................................... 24
附录一 超声波测距电路原理图 ..................................... 25
附录二 程序清单 .................................................. 26
附录三 元件清单 ................................................... 36
一、 课程设计任务书
《智能仪器综合设计》课程设计任务书
题目:超声波测距系统设计
一、课程设计任务
超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,如液位、井深、管道长度等场合。超声波测距的原理是,发射器发射出超声波,遇到被测物体后返回声波由接收器接收,测量出超声波发射和接收到回波的时间差,超声波波速与时间差乘积的一半即为被测距离。该超声波测距系统以AT89S52单片机为核心进行设计。
二、课程设计目的
通过本次课程设计使学生掌握:1)智能仪器的一般设计、实现方法;2)超声波传感器测距的工作原理;3)智能仪器设计的实际调试技巧。从而提高学生对智能仪器的设计和调试能力。
三、课程设计
和要求
1、掌握超声波传感器的测距原理,测量结果数显;
2、根据超声波测距原理,设计超声波测距系统的硬件结构电路并画出原理图;
3、用PROTUES对所设计的系统进行仿真;
4、给出软件设计流程图;
5、系统软硬件连调,给出该测距系统的性能指标,并对产生的误差进行分析。 四、课程设计
要求
报告中提供如下内容:
1、目录
2、正文
(1)课程设计任务书;
(2)超声波传感器测距原理;
(3)系统总体设计方案;
(4)超声波测距系统硬件电路的设计,包含发射电路、接收电路和显示模块的设计,
用PROTEL软件绘制硬件原理图并列出器件清单,用PROTUES仿真;
(5)软件设计:程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序
的名称及其功能);
(6)调试结果:各个关键点波形和实测数据组;
(7)系统误差来源及解决方案分析;
3、收获、体会
4、参考文献
五、课程设计进度安排
周次 工作日 工作内容
1 布置课程设计任务,查找相关资料
2 熟悉智能仪器综合实验平台所提供的相关资源 第
一 3 完成总体设计方案
周 4 画出硬件原理图并进行仿真
5 完成硬件接线,编写程序并调试
1 编写程序并调试
2 编写程序并调试 第
二 3 编写程序并调试及准备课程设计报告
周 4 完成课程设计报告并于下午两点之前上交
5 答辩
本课题共需两周时间
七、课程设计考核办法
本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面
进行评分,其所占比例分别为20%、40%、40%。
二(超声波传感器测距原理
2.1超声波传感器
超声波是由机械振动产生的,可以在不同的介质中以不同的速度传播,其频率高于20KHz。由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。超声波测距是一种非接触式的检测电路,因而利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到农业生产等自动化的使用要求。超声波发射器如今有两类,一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。本系统选用的是压电式超声波传感器。它是利用压电效的应原理,压电效应有逆效应和顺效应,实际上是利用压电晶体的谐振来工作的。超声波发生器它有两个压电晶片和一个共振板,当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
发射器发出的超声波以速度υ在空气中传播,在到达被测物体时被反射返回,由由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。由于超声波也是一种声波,其声速v与温度有关,表2.1列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。
表2.1 超声波波速与温度的关系
温度(?) -30 -20 -10 0 10 20 30 100
声速(m,s) 313 319 325 323 338 344 349 386
2.2超声波测距仪原理概述
超声波测距的原理一般采用渡越时间法TOF(timeofflight)。其原理为:检测从超声波发射器发出的超声波,经气体介质的传播到接收器的时间,即渡越时间。渡越时间与气体中的声速相乘,就是声波传输的距离。超声波发射器向某一方向发射超声波,在发射时刻的同时单片机开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
单片机发出40kHZ的信号,经放大后通过超声波换能射器输出;反射后的超声波经超声波换能器作为系统的输入,锁相环对此信号锁定,产生锁定信号启动单片机中断程序,读出时间为t,再由软件进行判别、计算,得出距离数并送LED显示。限制超声波系统的最大可测距离存在四个因素:超声波的幅度、反射物的质地、反射和入射波之间的夹角以及接受换能器的灵敏度。接受换能器对声波脉冲的直接接收能力将决定最小可测距离。
三(系统总体设计方案
超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
超声波测距系统主要由超声波接收器、发射器、放大电路、单片机和显示器几部分组成,其系统框图如下图3.1所示:
放大电路超声波接收器(三级放大)
障碍物定时器单片机控制显示
超声波放射器放大电路(40kHz方波)
图3.1 超声波测距系统框图
显示模块中,通过测得数据经p0口送至LCD进行显示,LCD显示原理:液晶显示模块是128×64 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192 个中文汉字、16X16 点阵、128 个字符、8X16 点阵及64X256 点阵,显示RAM GDRAM 可与CPU 直接,接口提供两种界面来连接微处理机8-位并行及串行两种连接方式具有多种功能光标显示画面移位睡眠模式等。显示资料RAM 提供642 个位元组的空间,最多可以控制4 行16 字和64 个字的中文字型显示,当写入显示资料RAM 时可以分别显示CGROM HCGROM 与CGRAM 的字型,ST7920A 可以显示三种字型:半宽的
HCGROM 字型CGRAM 字型及中文CGROM 字型 ,三种字型的选择由DDRAM 中写入的编码选择,在0000H 0006H 的编码中将自动的结合下一个位元组,组成两个位元组的编码达成中文字型的编码,A140 D75F 各种字型详细编码如下: 1 显示半宽字型 将8 位元资料写入DDRAM 中范围为02H 7FH 的编码 2 显示CGRAM 字型将16 位元资料写入DDRAM 中总共有0000H 0002H 0004H 0006H
四种编码
3 显示中文字形将16 位元资料写入DDRAMK ,范围为A1A1H- F7FEH 的编码。 绘图显示RAM 提供64 *32 个位元组的记忆空间,最多可以控制256 *64 点的二维绘图缓冲空间,在更改绘图RAM 时,先连续写入水平与垂直的坐标值,再写入两个8 位元的资料到绘图RAM而地址计数器AC 会自动加一。在写入绘图RAM 的期间,绘图显示必须关闭整个写入绘图RAM的步骤如下:
1 关闭绘图显示功能
2 先将水平的位元组坐标X 写入绘图RAM 地址
3 再将垂直的坐标Y 写入绘图RAM 地址
4 将D15 D8 写入到RAM 中
5 将D7 D0 写入到RAM 中
6 打开绘图显示功能
四(系统的硬件结构设计
硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波检测接收电路四部分。单片机采用AT89S52或其兼容系列。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,利用外中断0口监测超声波接收电路输出的返回信号。显示电路采用简单实用的LED。
4.1 单片机最小系统原理概述
AT89S52单片机是整个系统的主控制器,欲使单片机正常工作,必须要设计单片机的最小系统。单片机最小系统,是指最少的元件组成的单片机可以工作的系统。对于51系列的单片机来说,最小系统一般应该包括单片机、晶振电路、复位电路。一般的晶振电路中晶振的负载电容为15p或12.5p ,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的振荡电路就是比较好的选择。单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。51单片机的最小系统原理图如下图4.1所示。
U1 139P10P00238按键复位电路P11P01337 P12P02VCC436S1P13P03535R1P14P04634 P15P05SW-PB200733P16P06832P17P07E1 RESET1319INT1P2022uF1220INT2P21R221 P221k1522T1P231423T0P2424 P253125EA/VPP26GND27P261928X1P27 18X2晶振电路RESET910RESETRXD Y11TXD121730RDALE/E162911.0592MHzWRPSEN
AT89C52C1C2 30pF30pF
GND
图4.1 51单片机最小系统原理图
AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程
Flash 存储器。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造。
AT89S52具有以下
功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻 辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下, P0不具有内部上拉电阻。 在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验 时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4个 TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。 在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能:
P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5 MOSI(在系统编程用)
P1.6 MISO(在系统编程用)
P1.7 SCK(在系统编程用)
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能
驱动4 个 TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用 8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4个 TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。 在flash编程和校验时,P3口也接收一些控制信号。
端口引脚 第二功能:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 INTO(外中断0)
P3.3 INT1(外中断1)
P3.4 TO(定时/计数器0)
P3.5 T1(定时/计数器1)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器读选通)
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE
禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。
特殊功能寄存器:并不是所有的地址都被定义了。片上没有定义的地址是不能用的。读这些地址,一般将得到一个随机数据;写入的数据将会无效。
用户不应该给这些未定义的地址写入数据“1”。由于这些寄存器在将来可能被赋予新的功能,复位后,这些位都为“0”。
定时器 2 寄存器:寄存器T2CON 和T2MOD 包含定时器2 的控制位和状态位,寄存器对RCAP2H和RCAP2L是定时器2的捕捉/自动重载寄存器。
中断寄存器:各中断允许位在IE寄存器中,六个中断源的两个优先级也可在IE中设置。定时器 0 和定时器1在AT89S52 中,定时器0 和定时器1 的操作与AT89C51 和AT89C52 一样。为了获得更深入的关于UART 的信息,选择“Products”,然后选择“8051-Architech Flash Microcontroller”,再选择“ProductOverview”
即可。
定时器 0 和定时器1:在AT89S52 中,定时器0 和定时器1 的操作与AT89C51 和AT89C52 一样。为了获得更深入的关于UART 的信息,选择“Products”,然后选择“8051-Architech Flash Microcontroller”,再选择“ProductOverview”即
可。
定时器 2:定时器2是一个16位定时/计数器,它既可以做定时器,又可以做事件计数器。其工作方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。定时器2有三种工作模式:捕捉方式、自动重载(向下或向上计数)和波特率发生器。如表3 所示,工作模式由T2CON中的相关位选择。定时器2 有2 个8位寄存器:TH2
和TL2。在定时工作方式中,每个机器周期,TL2 寄存器都会加1。由于一个机器周期由12 个晶振周期构成. 通过T2CON中的EXEN2来选择两种方式。如果EXEN2=0,定时器2时一个16位定时/计数器,溢出时,对T2CON 的TF2标志置位,TF2引起中断。如果EXEN2=1,定时器2做相同的操作。除上述功能外,外部输入T2EX引脚(P1.1)1至0的下跳变也会使得TH2和TL2中的值分别捕捉到RCAP2H和RCAP2L中。除此之外,T2EX 的跳变会引起T2CON 中的EXF2 置位。像TF2 一样,T2EX 也会引起中断。捕捉模式如图5所示。在计数工作方式下,寄存器在相关外部输入角T2 发生1 至0 的下降沿时增加1。在这种方式下,每个机器周期的S5P2期间采样外部输入。一个机器周期采样到高电平,而下一个周期采样到低电平,计数器将加1。在检测到跳变的这个周期的S3P1 期间,新的计数值出现在寄存器中。因为识别1,0的跳变需要2个机器周期(24个晶振周期),所以,最大的计数频率不高于晶振频率的1/24。为了确保给定的电平在改变前采样到一次,电平应该至少在一个完整的机器周期内保持不变。自动重载当定时器2 工作于16 位自动重载模式,可对其编程实现向上计数或向下计数。这一功能可以通过特殊寄存器T2MOD(见表4)中的DCEN(向下计数允许位)来实现。通过复位,DCEN 被置为0,因此,定时器2 默认为向上计数。DCEN 设置后,定时器2就可以取决于T2EX向上、向下计数。DCEN=0 时,定时器2 自动计数。通过T2CON 中的EXEN2位可以选择两种方式。如果EXEN2=0,定时器2计数,计到0FFFFH后置位TF2溢出标志。计数溢出也使得定时器寄存器重新从RCAP2H 和RCAP2L 中加载16 位值。定时器工作于捕捉模式,RCAP2H和RCAP2L的值可以由软件预设。如果EXEN2=1,计数溢出或在外部T2EX(P1.1)引脚上的1到0的下跳变都会触发16位重载。这个跳变也置位EXF2中断标志位。T2EX 上的一个逻辑0 使得定时器2 向下计数。当TH2 和TL2 分别等于RCAP2H 和RCAP2L中的值的时候,计数器下溢。计数器下溢,置位TF2,并将0FFFFH加载到定时器存储器中。置位DCEN,允许定时器2向上或向下计数。在这种模式下,T2EX引脚控制着计数的方向。T2EX上的一个逻辑1使得定时器2向上计数。定时器计到0FFFFH溢出,并置位TF2。定时器的溢出也使得RCAP2H和RCAP2L中的16位值分别加载到定时器存储器TH2和TL2中。定时器2上溢或下溢,外部中断标志位EXF2 被锁死。在这种工作模式下,EXF2不能触发中断。
中断源:AT89S52 有6个中断源:两个外部中断(INT0 和INT1),三个定时中断(定时器0、1、2)和一个串行中断。这些中断每个中断源都可以通过置位或清除特殊
寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。IE.6位是不可用的。对于AT89S52,IE.5位也是不能用的。用户软件不应给这些位写1。它们为AT89系列新产品预留。定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。程序进入中断服务后,这些标志位都可以由硬件清0。实际上,中断服务程序必须判定是否是TF2 或EXF2激活中断,标志位也必须由软件清0。定时器0和定时器1标志位TF0 和TF1在计数溢出的那个周期的S5P2被置位。它们的值一直到下一个周期被电路捕捉下来。然而,定时器2 的标志位TF2 在计数溢出的那个周期的S2P2被置位,在同一个周期被电路捕捉下来。各控制位功能如下表4.2所示。
中断允许控制寄存器(IE)(MSB) (LSB)
中断允许控制位=1,允许中断
中断允许控制位=0,禁止中断
表4.2 控制位功能
符号 位地址 功能
中断总允许控制位。EA=0,中断总禁止;EA=1,各中断 EA IE.7
由各自的控制位设定
IE.6 预留
ET2 IE.5 定时器2中断允许控制位
ES IE.4 串行口中断允许控制位
ET1 IE.3 定时器1中断允许控制位
EX1 IE.2 外部中断1允许控制位
ET0 IE.1 定时器0中断允许控制位
EX0 IE.0 外部中断0允许控制位
4.2 超声波发射电路
超声波由发射电路产生。通过电路产生一个27MHZ大小的方波。发射电路如图4.2。发射电路主要有反向器和超声波换能器构成,AT89S52单片机在P1.0口产生方波,由单片机产生的发射脉冲信号。一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电可极,用这种推挽形式将方波信号加到超声波换能器两端可以提高超声波的发射强度、增强驱动能力,输出端采用两个反向器并联,用于提高驱动能力。这样,两倍的反向器输出电压施加在传感器上。超声波传感器将输入的电信号转换为超声波信号传输出去,电容C可以除去直流分量,压电式超声波换能器是利用压电晶体的谐振来工作的。
VCC R18R20GND+15V2K1K R17
U6A1K8 2U6B8TRANSMIT16 37R195P10
LM358 1KLM3584
4图4.2 发射电路 -15V
4.3 超声波检测接收电路
超声波接收电路包括一个放大电路,以更好的接受反射回来的超声波。如图4.3所示,为超声波检测接收电路。
10K50K50KW2W3W4+15V+15VU8A8R21U8B2C58R23U7A61C781KR252731K150.1uF1K30.1uFLM358LM358R224C4LM358R2410K4C60.1uF-15VR2610K4C80.1uF10K0.1uF-15VGNDGNDGND
图4.3 接收电路
4.4 超声波测距系统的显示电路设计
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128x64全点阵液晶显示器组成。可完成图形显示,也可以显示8x4(16x16点阵)汉字。如下图4.4所示: VCCGNDVCCJ411111119VSS65432101R38VCC2R37V03103RS1034R/W512345678U1EN6P10139DB0DB0P10P007P11238DB1DB1P11P018P12337DB2DB2P12P029436DB3P13DB3P13P0310535DB4P14DB4P14P0411634DB5P15DB5P15P0512733DB6P16DB6P16P0613832DB7P17DB7P17P0714CS1151319VCCINT1CS2INT1P2016R36INT01220RESETINT2P211721VOUT103P2218R351522T1LED+T1P23191423T0LED-1KT0P242024P24P25EA3125P25LCD12864EA/VPP2627P26P26GNDX11928P27X1P27X218X2RESET910RXDRESETRXD11TXDTXDP371730ALERDALE/EP361629PSENWRPSENAT89C52
图4.4 LCD驱动控制电路
4.5 PROTUES仿真硬件电路图
硬件仿真电路如下图4.5所示,首先由555电路产生40KHz的方波,经过74LS160电路进行100进制计数产生下降沿,下降沿触发AT89S52产生IT0中断,根据定时器T1
的时间间隔由公式计算得出所测距离,传送至LCD显示。 18-Vout17RST16DB715DB6LCD114DB5AMPIRE128X6413DB412DB311DB2C210DB19DB08E30pF7R/WY16RSCRYSTAL5C3V0U14VCC19393XTAL1P0.0/AD0GND38C130pF2P0.1/AD1CS2371P0.2/AD2CS11836XTAL2P0.3/AD31nF35P0.4/AD434P0.5/AD533P0.6/AD6932RSTP0.7/AD7R121P2.0/A810k22P2.1/A923P2.2/A102924PSENP2.3/A113025ALEP2.4/A123126EAP2.5/A1327R18R20P2.6/A1428P2.7/A15R17U1:A10k10kU2:B10k110P1.0P3.0/RXD211P1.1P3.1/TXD6312P1.2P3.2/INT074132P1.3P3.3/INT1R1955141P1.4P3.4/T0R51615310kP1.5P3.5/T18471610kLM358P1.6P3.6/WR84RV5AT89C51817LM358P1.7P3.7/RD1kRV1RV2RV3RV41k1k1k1k
R2710kU8:AU7:BU8:BU7:A2R21C86R2316C5R28R2510k737C910k551nF10k10k21nF8411nFLM35884843R22LM358LM35884C910kLM35821R10C71nFR6R810k1nFD1C610k10kLM385-2V51nF
图4.5 Proteus 仿真系统图
五(系统软件的设计
软件分为两部分:主程序和中断服务程序,主程序完成初始化工作、各路超声波发射和接受顺序的控制。
5.1 超声波测距仪的算法设计
超声波测距的原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。距离的计算公式为: d=s/2=(c×t)/2,其中,d为被测物与测距仪
在启动发的距离,s为声波的来回的路程,c为声速,t为声波来回所用的时间。 射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。
5.2 程序流程
超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。工作时,先把P1.0口置0,启动超声波传感器发射超声波,同时启动内部定时器T0开始计时。当超声波碰到障碍物时信号立即返回,微处理器不停地扫描INT0引脚,如果INT0接受的信号由高电平变为低电平,此时表明信号已经返回,微处理器进入中断关闭定时器。再把定时器中的数据经过换算就可以得出超声波传感器与障碍物之间的距离。程序流程图如图5.1所示:
开始
定时器中断0初始化服务子程序LCD初始化
定时器初始化
定时器初始化
开中断
P1.0取反
方波产生发送信号
返回否
是否接收到 是信号定时器0中断 计算传输时间
显示
主程序流程图
结束
外部中断0定时器1中断服务子程序服务子程序
接收标志清零定时器初始化
计算传输时间超时标志
Overflag=1
返回
返回
外部中断0
定时器1中断
5.3 主程序设计
软件分为两部分,主程序和中断服务程序,主程序完成初始化工作、各路超声波发射和接收顺序的控制。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。
5.4定时中断服务子程序设计
定时中断服务子程序完成超声波的发射,时间值的读取、距离计算、结果的输出等工作。主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式。置位总中断允许位EA并给显示端口P0和P1清0。然后调用超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1 ms(这也就是超声波测距仪会有一个最小可测距离的原因)后,才打开外中断0接收返回的超声波信号。由于采用的是12 MHz的晶 振,计数器每计一个数就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式(2)计算,即可得被测物体与测距仪之间的距离,设计时取20?时的声速为344 m/s则有:
d=(c×t)/2=172T0/10000cm,其中,T0为计数器T0的计算值。
5.5超声波发生子程序和超声波接收中断程序设计
超声波发生子程序的作用是通过P1.0端口发送2个左右超声波脉冲信号(频率约40kHz的方波),脉冲宽度为12μs左右,同时把计数器T0打开进行计时。超声波发生子程序较简单,但要求程序运行准确,所以采用汇编语言编程。
超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超
声波信号(即INT0引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测
0溢出中断将外中断0关闭,并将测距成功标志字到超声波返回信号,则定时器T
赋值2以表示此次测距不成功。 前方测距电路的输出端接单片机INT0端口,中断优先级最高,中断优先级为先右后左。
六(调试结果
超声波测距仪的制作和调试,中心频率为40kHz,若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。根据测量范围要求不同,可适当调整与接收
换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范围为0.07,5.5m,测距仪最大误差不超过1cm。系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。
P1.0输入到超声波模块的方波波形如下图6.1所示:
图6.1 输入波形
P3.2口接收到超声波模块输出的波形如下图6.2所示:
图6.2 输出波形
表6.3 数据测量
序号 1 2 3 4 5 6
理论值(mm) 100 200 300 400 500 600
实测值(mm) 103 202 303 404 498 599
相对误差% 3 1 1 1 -0.4 -0.17
序号 7 8 9 10 11 12
理论值(mm) 700 800 900 1000 1100 1200
实测值(mm) 699 785 875 972 1070 1264
相对误差% 0.14 1.88 2.78 2.8 2.73 5.33
根据以上测量实验数据所得:测距仪能测的范围为0.20,1.5m,测距仪最大误差不超过5cm。
七(系统误差来源及解决方案分析
超声波测距无非就是发射然后接受反射,再计算时间差乘上速度。关键是要精确。 用单片机产生超声波信号可以用定时中断,产生固定频率的方波信号,经过放大到换能器(发射头),换能器把电信号转换成超声波发射出去。经过若干时间,有接受头(其实还是换能器)接受到返回的超声波信号,再次还原成固定频率的电信号,再处理这个信号,送到单片机产生一个接受中断,再用单片机计算时间差乘上现在的速度就是距离。
所以,产生的误差可能会有一下几种:
? 测量距离传播的时间误差
根据超声波测距公式L=C×T/2,可知测距的误差是由超声波的传播速度误差和测量距离传播的时间误差引起的时间误差 .因为当超声波发出后定时器开始计时,到超声波接触到物体的时候,此时的距离才是这个时候车到障碍物的距离。而后在接收到超声波的时候。此时车已经行驶一段距离,所以此时会产生一定的误差。
在超声波的传播速度是准确的前提下,使用的12MHz晶体作时钟基准的89C52单片机定时器能方便的计数到1μs的精度,所以这个误差能够控制在很小的范围内。
? 超声波传播速度误差
超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快,而空气的密度又与温度有着密切的关系。已知超声波速度与温度的关系如下: v2=r•R•T/M,式中: r —气体定压热容与定容热容的比值,对空气为1.40, R —气体普适常量,8.314kg•mol-1•K-1, M—气体分子量,空气为28.8×10-3kg•mol-1, T —绝对温度,273K+T?。
近似公式为:C=C0+0.607×T? ,式中:C0为零度时的声波速度332m/s;
T为实际温度(?)。对于超声波测距精度要求达到1mm时,就必须把超声波传播的环境温度考虑进去。例如当温度0?时超声波速度是332m/s, 30?时是350m/s,温度变化引起的超声波速度变化为18m/s。若超声波在30?的环境下以0?的声速测量100m距离所引起的测量误差将达到5m,测量1m误差将达到5mm。
八(收获体会
俗话说“好的开始是成功的一半”。通过这次实习,我们学到了很多东西。在进行课程设计时,我们应该做到以下三点:首先,我认为最重要的就是认真研究老师给的题目。其次,在老师讲解的基础上认真研究硬件电路的设计,和软件流程的设计。最后,重点实现软硬结合的综合调试。
这次课程设计的课题是超声波测距,用超声波测距的方法很常见,不过对于我们来说,亲自动手编写程序,进行整体设计还是很有挑战性的。查找资料是我们的第一步,我们通过各种途径,比如上网,图书馆以及询问老师等等方法收集了很多资料,然后汇总,将我们在这次课程设计中可能遇到的问题的解决方案都纳入了我们的资料库。
接着就是硬件电路设计和软件设计,其实,这对我们每个人来说都是一个挑战。软件的设计调试是我最担心的设计,平时对这方面的知识理解的不是很透彻,比较欠缺,而且对于硬件模块我就更抓狂了。这时候小组的力量就体现出来了,各司其职,各尽其能。发挥了集体的效用。我们遇到问题,就向大家提出,然后寻找答案,共同解决,这样进展就好很多。我在这个过程中,受到了好多帮助,其实这次的课程设计我的最大的感受不是知识的获得,而是人格的磨练和交际的能力。
”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义(其实这次的课程设计我的最大的感受不是知识的获得,而是人格的磨练和交际的能力。课程设计这样集体的任务光靠团队里的一个人或几个人是不可能完成好的,合作的原则就是要利益均沾,责任公担。在团队中,当然也会出现一些矛盾,当然这是不可避免的。在产生小矛盾的时候,我们没有逃避。重要的是我们如何去解决它。我想经过这样的一个过程我们会学到很多,学会了怎样去和别人沟通,理解别人所做的事,别人也会宽容的对待我们,从而我们就在无形之中加强了我们的人际交往能力。这个经验对我们以后的人生将会发挥很大的作用。
对我们来说,此次课程设计最重要的就是分工合作的精神。将理论知识充分运用到实践操作中,使我们的专业知识得到了进一步的巩固,为以后的工作打下了坚实的基础。对于我们以后学习、找工作也真是受益菲浅。在短短的一个星期中,让我们初步让理性回到感性的重新认识,也让我们初步的认识了这个社会,对于以后做人所应把握的方向也有所启发~
参考文献
[1] 胡萍.超声波测距仪的研制.计算机与现代化,2003.10
[2] 时德刚,刘哗.超声波测距的研究.计算机测量与控制,2002.10 [3] 华兵.MCS-51单片机原理应用.武汉:武汉华中科技大学出版社,2002 .5 [4] 李华.MCU-51系列单片机实用接口技术.北京:北京航空航天大学出版社, 1993.
6
[5] 陈光东.单片机微型计算机原理与接口技术(第二版).武汉:华中理工大学出版
社,1999.4
[6] 徐淑华,程退安,姚万生.单片机微型机原理及应用.哈尔滨:哈尔滨工业大学
出版社,1999. 6.
[7] 苏长赞.红外线与超声波遥控.北京:人民邮电出版社,1993.7 [8] 张谦琳.超声波检测原理和方法.北京:中国科技大学出版社,1993.10 [9] 九州.放大电路实用设计手册.沈阳:辽宁科学技术出版社,2002.5 [10] 樊昌元,丁义元. 高精度测距雷达研究.电子测量与仪器学报,2000.10 [11] 苏伟,巩壁建.超声波测距误差分析.传感器技术,2004.
[12] 恒清,张靖.加强单片机系统抗干扰能力的方法.通化师范学院学报,2004 .10 [13] 晗晓,袁慧梅.单片机系统的印制板设计与抗干扰技术.电子工艺技术,2004 .6 [14] 丰,薛红宣.采用软件抗干扰设计提高微机系统的可靠性.电子产品世界,
2004.1
[15] 占操,梁厚琴,曹燕.单片机系统中的软件抗干扰技术.电子技术,2003.3 [16] 华兵.MCS-51单片机原理应用.武汉:武汉华中科技大学出版社,2002 .5 [17] 继兴,刘霞.单片机系统软件抗干扰措施分析.电子测量技术,2003
附录一 超声波测距电路原理图
DNGCCV12SR3WR4DNEN5器GLED4_A+15V6CCVLED4_B感7LED4_C传12348LED4_DCHAOSHENGBOHeader 4波9LED4_E10声LED4_FK110LED4_GR511超12LED4_HD10LED313CS_114FCS_2TRANSMITp4150040C1212E11617DDCCVNN18GRES1LB13G19KK01R32Res2120LCD12864K0R21118+15V+15VDDiode00R502914DBL CONQ2N3904CN0.1uFGK0DDD54NNN1GGvcc?AW654DU8ADNNGGK23400R221C1014SSW DIP-3Fu-15V+15V123020E11
路F5pC0.1uF04300电11EC1111源21JHeader 2-15V-15VK0电R2317DDiode6DLED3
6DCN1DA0.1uFNGCON1K654K0DR31Res2153NKGR301WU8B-15VK2305R241SSW DIP-3VCC1239DLED3
1+5V1CON1DNGK0R251NWWDCS_1CS_2ERRNGLED4_ALED4_BLED4_CLED4_DLED4_ELED4_FLED4_HLED4_G78C0.1uFC090.1uF32DP10产产40KHz产产NGP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27RXDTXDPSENU7AALE/PKKR201R19Res21K650R2612K0W1R1210D-15V+15VU6BP10P11P12P13P14P15P16P17INT1INT0TTEA/VPXXRESETRW1UAT89C5223KR9767111131111A9C12KVCCP10INT0XXRESET0.1uF0R331D1NU7BG23K1K1R171RESETW12U6AXX1R27Y12MHZ23VCC5K10110R2210路0DA22N电RDFFVCC-15V+15V84GppN2030K位G33R281CC复1F5uD12ECap Pol221DSSW-PBNGDNVCCGTRANSMITINT0
附录二 程序清单
#include
#define uchar unsigned char
#define uint unsigned int
#define Disp_On 0x3f
#define Disp_Off 0x3e
#define Col_Add 0x40 //列地址,Y地址,0列
#define Page_Add 0xb8 //页地址,X地址,0页
#define Start_Line 0xc0 //行地址,0行
#define Lcd_Bus P0 //MCU P1<------> LCM
sbit Mcs=P2^1; //Master chip enable
sbit Scs=P2^2; //Slave chip enable
sbit Enable=P2^3; //6800 mode Enable single
sbit Di=P2^5; //Data or Instrument Select
sbit RW=P2^4; //Write or Read
sbit LE1=P3^4;
/*定义16*16汉字结构体*/
struct typFNT_GB16
{
unsigned char Index[2];
unsigned char MSK[32];
};
struct typFNT_GB16 code GB16[16];
sbit Sq=P1^0;
uchar Overtime_flag,Send_flag=1,Receive=1;
unsigned long Time,Len;
uchar code ASCII816[96*16]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,/*"!",1*/
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,/*"#",3*/
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,/*"$",4*/
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,/*"%",5*/
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,/*"&",6*/
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",7*/
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,/*"(",8*/
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,/*")",9
*/
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",10*/
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,/*"+",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,/*",",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"-",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*".",14*/
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/*"/",15*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*":",0*/
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,/*";",1*/
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,/*"<",2*/
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*"=",3*/
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,/*">",4*/
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,/*"?",5*/
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,/*"@",0*/
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,/*"A",
1*/
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,/*"B",2*/
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,/*"C",3*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",4*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,/*"E",5*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,/*"F",6*/
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,/*"G",7*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",8*/
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"I",9*/
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,/*"J",10*/
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,/*"K",11*/
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,/*"L",12*/
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,/*"M",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",15*/
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,/*"P",16*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,/*"Q",17*/
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,/*"R",18*/
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,/*"S",19*/
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",20*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"U",21*/
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,/*"V",22*/
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,/*"W",23*/
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,/*"X",24*/
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"Y",
25*/
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,/*"Z",26*/
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,/*"[",0*/
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,/*"\",1*/
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,/*"]",2*/
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,/*"_",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,/*"a",0*/
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"b",1*/
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,/*"c",2*/
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,/*"d",3*/
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,/*"e",4*/
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"f",5*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,/*"g",6*/
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"h",7*/
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"i",8*/
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,/*"j",9*/
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,/*"k",10*/
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"l",11*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,/*"m",12*/
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"n",13*/
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"o",14*/
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,/*"p",15*/
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,/*"q",
16*/
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,/*"r",17*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,/*"s",18*/
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,/*"t",19*/
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"u",20*/
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,/*"v",21*/
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,/*"w",22*/
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,/*"x",23*/
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,/*"y",24*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,/*"z",25*/
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,/*"{",0*/
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,/*"|",1*/
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,/*"}",2*/
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",3*/
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,/*"$",4*/
};
/*------------------延时子程序-----------------------------*/
void delays(uint x)
{
uint j;
uchar i;
for(j=0;j63) {Mcs=0;Scs=1;lie=col-64;}
if(col>127) {Mcs=1;Scs=0;pag=pag+2;lie=col-128;col=col-128;}
if((col+8)>127) {Mcs=1;Scs=0;pag=pag+2;col=col+8;lie=col-128;col=col-128;}
if(c1<=128)
{
write_com(Page_Add+pag);
write_com(Col_Add+lie); //
for(i=0;i<8;i++)
{
dat=ASCII816[(c1-0x20)*16+i];
write_data(dat);
}
write_com(Page_Add+pag+1);
write_com(Col_Add+lie); //
for(i=8;i<16;i++)
{
dat=ASCII816[(c1-0x20)*16+i];
write_data(dat);
}
j=j+1;
col=col+8;
}
else
{
for(k=0;k63) {Mcs=0;Scs=1;lie=col-64;}
if(col>127) {Mcs=1;Scs=0;pag=pag+2;lie=col-128;col=col-128;}
if((col+8)>127) {Mcs=1;Scs=0;pag=pag+2;col=col+8;lie=col-128;col=col-128;}
write_com(Page_Add+pag);
write_com(Col_Add+lie); //
for(i=0;i<8;i++)
{
dat=ASCII816[(ch-0x20)*16+i];
write_data(dat);
}
write_com(Page_Add+pag+1);
write_com(Col_Add+lie); //
for(i=8;i<16;i++)
{
dat=ASCII816[(ch-0x20)*16+i];
write_data(dat);
}
}
}
/*--------------------------指定位置显示数据-----------------------*/
void ShowData(uchar lin,uchar column,uint dat)
{
//uint StartAddr;
uchar QIAN,BAI,SHI,GE;
QIAN=dat/1000;
QIAN=QIAN+0x30;
dat=dat%1000;
BAI=dat/100;
BAI=BAI+0x30;
dat=dat%100;
SHI=dat/10;
SHI=SHI+0x30;
GE=dat%10;
GE=GE+0x30;
ShowChar816(lin,column,QIAN);
ShowChar816(lin,column+8,BAI);
ShowChar816(lin,column+16,SHI);
ShowChar816(lin,column+24,GE);
}
/*-------------------------------初始化LCD屏---------------------------*/
void init_lcd(void)
{
P2=0x40;
delays(100);
P0=0x00;
delays(100);
P2=0x80;
Mcs=1;Scs=1;delays(100);
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Start_Line+0);
write_com(Col_Add+0);
write_com(Disp_On); }
/************************************************************/
void delay10us(uint us) //delay 10us
{
while(us--);
}
/***************************************************************************/
void main(void)
{
P3=0xff;
init_lcd();
Clr_Scr();
TMOD=0x12; //定时器0工作在方式2,定时器1工作在方式1
TH0=0xee; //产生40kHz方波
TL0=0xee;
TH1=0; //用于计时
TL1=0;
IT0=1; //跳沿触发
EA=1;
ET0=1;
ET1=1;
while(1)
{
if(Send_flag)
{
Sq=1;
TR1=1; //
TR0=1; //
delay10us(5);
TR0=0;
Send_flag=0;
EX0=1;
}
while(Receive && (!Overtime_flag));
if(!Receive)
{
TR1=0;
Time = TH1;
Time <<= 8;
Time = Time | TL1;
Len=Time*170/1000; //mm
ShowData(0,0,Len);
TH1=0;
TL1=0;
Send_flag=1;
Receive=1;
}
else
{
Overtime_flag=0;
TR1=0;
TH1=0;
TL1=0;
Send_flag=1;
//ShowData(0,0,5000);
} /* */
}
}
/****************************************************/
void INT0_ISR() interrupt 0 {
Receive=0;
}
void Timer0_ISR() interrupt 1 {
Sq=~Sq;
}
void Timer1_ISR() interrupt 3 {
Overtime_flag=1; }
附录三 元件清单