视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
超声波测距毕业设计
2025-09-29 08:56:35 责编:小OO
文档
1方案选择的论证和选择…………………………………………………………1

1.1  设计方案一…………………………………………………………………1

1.2  设计方案二…………………………………………………………………2

1.3  设计方案三…………………………………………………………………2

2工作原理 …………………………………………………………………………2

3部分芯片介绍 ……………………………………………………………………3

3.1  ATS52的简介……………………………………………………………4

     3.1.1 引脚信号介绍 ……………………………………………………4

     3.1.2 P3口的第二功能……………………………………………………5

     3.1.3 ATS52的总线结构 ………………………………………………5

3.2  温度传感器DS18B20………………………………………………………6

     3.2.1 温度传感器(DS18B20)的引脚分布图及其功能………………6

     3.2.2 单线(1-wire)技术 ………………………………………………7

     3.2.3 DS18B20有两种供电方式:寄生电源和外部电源 ………………7

3.3  LCD显示器 ………………………………………………………………10

     3.3.1字符型液晶显示模块RT-1602C的内部结构 ……………………10

     3.3.2 指令格式与指令功能……………………………………………11

     3.3.3 LCD显示器的初始化………………………………………………12

4  单元电路设计说明 ……………………………………………………………15

4.1  电源设计…………………………………………………………………15

     4.1.1 整流滤波电路设计 ………………………………………………16

     4.1.2 稳压电路设计 ……………………………………………………16

4.2  单片机时钟电路…………………………………………………………17

4.3  单片机复位电路…………………………………………………………18

4.4  单片机键盘电路…………………………………………………………19

4.5  超声波发射电路…………………………………………………………20

4.6  超声波接收电路…………………………………………………………20

4.7  单片机最小系统控制运算模块总原理图………………………………22

5  软件设计流程图 ………………………………………………………………22

5.1  主流程图…………………………………………………………………23

5.2  温度读取程序……………………………………………………………23

5.3  LCD现实流程图…………………………………………………………24

5.4  外中断服务程序…………………………………………………………25

5.5  超声波发射接收程序……………………………………………………25

5.6  键少子程序………………………………………………………………26

6  调试说明 ………………………………………………………………………27

6.1  软件调试…………………………………………………………………27

6.2  硬件调试…………………………………………………………………28

7  误差分析 ………………………………………………………………………28

7.1  超声波回波声强的影响…………………………………………………28

7.2  超声波波束入射角的影响………………………………………………29

7.3  超声波传播速度的影响…………………………………………………30

7.4  实测比较…………………………………………………………………30

8  设计心得 ………………………………………………………………………30

参考资料……………………………………………………………………………32

致谢…………………………………………………………………………………33

附录…………………………………………………………………………………34

1  总原理图……………………………………………………………………34

2  PCB图 ………………………………………………………………………35

3  程序清单 ……………………………………………………………………35

4  元件清单 ………………………………………………………………………44

1  方案选择的论证和选择

1.1  设计方案一

采用单片机来控制的超声波测距仪是先由单片机产生一个信号,经过信号线,把信号引入到与超声波发射器相连的信号引脚上,再由超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:

                         ………………………………………1.1

原理框图如1-1所示:

图1.1 采用单片机来控制的超声波测距仪

1.2  设计方案二

采用CPLD来控制的超声波测距仪,主要是在软件上运用VHDL(Very High Speed Integrated Circuit Hardware Description Language)编写程序使用MAX + plus II软件进行软硬件设计的仿真和调试,最终实现测距功能。使用本方案的优点在于在超声波测距仪设计中采用的是MAX7000s系列中的EPM7128SLC84-15的CPLD器件,其最高频率可达175.4MHz,可用于组合逻辑电路、时序逻辑电路、算法、双端口RAM等的设计。充分利用了其多达128个宏单元、68pin可编程I/O口,使该器件可以将分频功能、计数功能、显示编码功能、振荡功能全部集于一体。又因其延时平均的特点,保证了测距结果精度高、响应速度快。缺点是方案中需要一块FPGA,一块双口RAM,还需要一块用来存储波形数据的EEPROM,那么设计的成本较高。同时在FPGA中还要用硬件描述语言(VHDL语言)编写程序来实现硬件电路功能。由于EPM7128SLC84-15的算法复杂,所以在软件实现起来编程也复杂。

1.3  方案设计三

采用锁相环频率合成技术,也可以实现我们所需要的超声波测距仪。具体方案如下:首先通过频率合成技术产生超声波所需要的频率,在通过信号线将采用锁频率相合成技术得到的频率引到超声波的发射头上,这样就可以实现超声波测距。它的优点就是工作频率可调,也可以达到很高的频率分辨率;缺点是要求使用的滤波器通带可变,实现很困难。它的原理如图1.2所示:

图1.2 超声波原理图

综上所述,因此选择第一种设计方案。

2工作原理

我们做的是基于单片机的超声波测距仪。用单片机控制超声波的发射、接受电路以及进行数据处理,再用液晶显示屏进行数据的显示。因为声音的速度会随着温度的变化而改变,所以,我们增加了温控装置,即通过温度传感器(18B20),把当前的温度信息传给单片机,再通过一定的算法,得到当前的声音速度。操作者可以通过几个简单的按键完成测量方式的选择(实时监测、手动测量)。

由单片机产生一个信号,经过信号线,把信号引入到与超声波发射器相连的信号引脚上,在由超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即: 

其中,D为换能器与障碍物之间的距离,C为波声传播速度,T为超声波发射到返回的时间间距。

本次设计包含硬件设计与软件设计两部分,根据设计任务要求,采用ATC52单片机,配置时钟电路,复位电路构成单片机最小系统,由模拟电路和数字电路构成超声波发射、接收模块。由键盘,LED显示构成人机对话通道,以及温度传感器来构成由单片机最小系统来控制的超声波测距仪,其结构框图如下:

图2.1 总结构框图

3部分芯片介绍

3.1  ATS52的简介

ATS52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位处理器和Flash存储单元,功能强大的ATS52单片机可为您提供许多较复杂系统控制应用场合。

ATS52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,ATS52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。ATS52芯片的管脚、引线与功能ATS52芯片图如图3.1:

3.1.1  引脚信号介绍

P00~P07 :P0口8位双向口线

P10~P17 :P1口8位双向口线

P20~P27 :P2口8位双向口线

P30~P37 :P3口8位双向口线

访问程序存储器控制信号:当信号为低电平时,对ROM的读操作限定在外部程序存储器;而当信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。

ALE地址锁存控制信号:在系统扩展时,ALE用于控制把P0口输出低8位地址锁存起来,以实现低位地址和数据的隔离。此外由于ALE是以晶振六分之一的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲作用。

外部程序存储器读选取通信号:在读外部ROM时有效(低电平),以实现外部ROM单元的读操作。

XTAL1和XTAL2外接晶体引线端:当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于拉外部的时钟脉冲信号。

RST复位信号:当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作。

VSS:地线

VCC:+5V电源

3.1.2  P3口的第二功能

下表是P3口的第二功能

口线第二功能替代的专用功能
P3.0

RXD

串行输入口
P3.1

TXD

串行输出口
P3.2

外部中断0

P3.3

外部中断1

P3.4

T0

定时器0的外部输入

P3.5

T1

定时器1的外部输入

P3.6

外部数据存储器写选通
表3.1 P3口的第二功能

3.1.3  ATS52的总线结构

ATS52的管脚除了电源、复位、时钟接入、用户I/O口部分P3外,其余管脚都是为实现系统扩展而设置的。这些管脚构成了三总线形式,即:

(1)地址总线(AB):地址总线宽度为16位,因此,其外部存储器直接地址外围为K字节。16位地址总线由P0经地址锁存器提供低8位地址(A0~A7);P2口直接提供高8位地址(A8~A15)。

(2)数据总线(DB):数据总线宽度为8位,由P0口提供。

(3) 控制总线 (CB):由部分P3口的第二功能状态和4根控制线RESET、、ALE、组成。ATC52结构框图如图3-2所示:

3.2  温度传感器DS18B20

经过综合考虑,我们采用美国达拉斯(Dallas)公司的单线数字温度计传感器芯片DS18B20作为温度传感器,与传统的热敏电阻有所不同,DS18B20可直接将被测温度转化成数字信号,以供单片机处理,它还具有微型化、低功耗、高性能、抗干扰能力强等优点。

DS18B20具有以下特点。

1采用单线技术,与单片机通信只须一个引脚;

2通过识别芯片各自唯一的产品序列号从而实现单线多挂接,简化了分布式温度检测的应用。

3实际应用中不需要外部任何元器件即可实现测温。

4可通过数据线供电,电压范围为3~5.5V;

5不需备份电源;

6测量范围为-55~+125度,在-10~+82度范围内的误差为±0.5度

7数字温度计的分辨率用户可以从9位到12位选择,可配置实现9~12V的温度读数;

8将12位的温度值转换为数字量所需时间不超过750ms;

9用户定义的、非易失性的温度告警设置,用户可自行设定告警的上下限温度;

10告警寻找命令可以识别和寻址那些温度超出设计预设告警界限的器件。

3.2.1  温度传感器(DS18B20)的引脚分布图及其功能

单片机选用Atmel公司常用的单片机芯片ATS52,它完全可以满足采集、控制、数据处理的需要。

图3.3 温度传感器引脚图

引脚功能说明:

     NC(1、2、6、7、8脚):空引脚,悬空不使用;

     VDD(3脚):可选电源脚,电源电压范围3~5.5V。当工作于寄生电源时,此引脚必须接地。

     DQ(4脚):数据输入/输出脚。漏极开路,常态下高电平。

3.2.2  单线(1-wire)技术

目前常用的微机和外设之间数据输出的串行总线有I2C总线,SPI总线等,其中,I2C总线采用同步串行两线(一根时钟线,一根数据线)方式,而SPI总线采用同步串行三线(一根时钟线,一根输入线,一根数据输出线)方式。这两种总线需要至少两根或两根以上的信号线。美国达拉斯半导体公司推出了一项特有的单线(1-wire)技术,该技术与上述总线不同,它采用单根信号线,即可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单线技术具有线路简单、硬件开销小、成本低、便于扩展的优点。

单线技术适用于单主机系统,单主机能控制一个或多个从机设备。主机可以是微控制器,从机可以是单线器件,它们之间的数据交换、控制都由这根线完成。主机或从机通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放该线,而让其他设备使用。单线通常要求外接一个约5K的上拉电阻,这样,当该线闲置时,其状态为高电平。

主机和从机之间的通信主要分为3个步骤:初始化单线器件、识别单线器件和单线数据传输。由于只有一根线通信,所以它们必须是严格的主从结构,只有主机呼叫从机时,从机才能答应,主机访问每个单线器件都必须严格遵循单线命令序列。

所有的单线器件都要遵循严格的协议,以保证数据的完整性。1-wire协议由复位脉冲、应答脉冲、写0、写1、读0和读1这几种信号类型组成。这些信号中,除了应符答脉冲,其他均由主机发起,并且所有命令和数据都是字节的低位在前。

3.2.3  DS18B20有两种供电方式:寄生电源和外部电源

寄生电源简单说起来就是器件从单线数据线中“窃取”电源,在信号线为高电平的时间周期内,把能量储存在内部的电容器中,在单信号线为低电平时的时间期内断开些电源,直到信号线变为高电平,重新接上寄生(电容)电源为止。寄生电源有两个优点。

     ·可实现远程温度检测而无须本地电源。

     ·没有正常电源条件下也可以读ROM。

为了使DS18B20能完成准确的温度变换,当温度变换发生时,DQ线上必须提供足够的功率。因为DS18B20工作电流1。5mA,4.7K的上拉电阻将使得DQ线没有足够的驱动能力。如果多个DS18B20连接,而且同时变换时,这一问题将变得更为突出。解决的方法是在发生温度变换时,在DQ线上提供强的上拉,比如用MOSFET管把DQ线直接拉到电源。

当面作用寄生电源时,VDD引脚必须接地。

    DS18B20的另一种的供电方式是将VDD引脚接外部电源(3~5.5V)。这种方法的优点是在DQ线上不要求强的上拉。总线上的主机在温度变换期间不需要一直使DQ线保持高电平,这就允许在变换期间内其他数据在单线上传送。而且,在单线上可以放置多个DS18B20。如果它们都使用外部电源,那么通过发起“跳过ROM”命令,接着执行“温度变换”命令就可以同时完成各自的温度变换。采用外部电源这种方式时,GND(地)引脚不可悬空。

DS18B20的单线协议和命令:

·初始化

  单线总线上所有操作均从初始化开始。初始化过程如下:主机通过拉低单线480us以上,产生复位脉冲,然后释放该线,进入RX接收模式。主机释放总线时,会产生一个上升沿。单线器件DS18B20检测到该上升沿后,延时15~60us,通过拉低总线60~240us来产生应答脉冲。主机接收到本机的应答脉冲后,说明有单线器件在线。

·ROM操作命令

一旦总线主机检测到应答脉冲,便可以发起ROM操作命令。共有5位ROM操作命令,如下表所示

                

命令类型命令字节功能说明
Read  Rom

(读ROM)

33H此命令读到激光ROM中的位,只能于总线上单个DS18B20器件的情况,多挂接则发生数据冲突。

Match Rom

(匹配ROM)

55H此命令后跟位ROM序列号,寻址多挂接总线上的对应DS18B20,只有序列号完全匹配的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲。此命令可用于单挂或者多挂接总线。

Skip Rom

(跳过ROM)

CCH些命令用于单挂接总线系统时,可以无须提供位ROM序列号即可运行内存操作命令。如果总线上挂接多个DS18B20,并且在此命令后执行读写命令,将会发生数据冲突。

Search Rom

(搜索ROM)

F0H主机调用此命令,通过一个打排除法过程,可以识别出总线上所有器件的ROM序列号。

Alarm Search

(告警搜索)

ECH此命令流程和Search Rom命令相同,但是DS18B20只有在最近的一次温度测量时满足了告警触发条件,才会响应此命令。

表3.2 ROM操作命令

·内存操作指令

在成功执行了ROM操作命令之后,才可以使用内存操作命令。主机可提供6种内存操作命令。

命令类型命令字节功能说明
Write  Scratchpad

(写暂存器)

4EH此命令写暂存器地址2~地址4的3个字节在发起复位脉冲之前,3个字节都必须写。

Read Scratchpad

(读暂存器)

BEH此命令读取暂存器内容,从字节0一直读取到字节8。主机可以随时

发起复位脉冲以停止此操作。

Copy Scratchpad

(复制暂存器)

48H此命令将暂存器中内容复制进EERAM,以便将温度告警触发字节存入非易失内存。如在

此命令后主机产生读时隙,那么只要器件在进行复制就会输出0,复制完成后再输出1。

Convert T

(温度转换)

44H此命令开始温度转换操作。如果在引命令后主机产生读时隙,那么只要器件在进行温转

换就会输出0,转换完成后再输出1。

Recall  E2

(重调E2存器)

B8H将存储在EERAM中的温度告警触发值和配置寄存器重新拷贝到暂存器中。此重调节操作在DS18B20加电时自动产生。

ReadPowerSupply

(读供电方式)

B4H主机发起此命令后的第个读数据时隙内,DS18B20会发信号通知

它的供电方式:0为寄生电源方式,1为外部供电方式。

表3.3 内存操作命令

·数据处理

首先来看写时隙。当主机将数据线从高电平拉至低电平时,产生写时隙。有2种类型的写时隙:写“1”和写“0”。所有写时隙必须在60us以上(即由高拉低后持续60us以上),各个写时隙之间必须保证最短1us的恢复时间。DS18B20在DQ线变低后的15~60us的窗口对DQ线进行采样,如果为高电平,就为写“1”;如果为低电平就为写“0”。对于主机产生写“1”时隙的情况,数据线必须先拉低,然后释放,在写时隙开始后的15us,允许DQ线拉至高电平。对于主机产生写“0”时隙的情况,DQ线必须被拉至低电平且至少保持低电平60us。

再来看读时隙。当主机从DS18B20读数据时,把数据线从高电平拉至低电平时,产生读时隙。数据线DQ必须保持低电平至少1us,来自DS18B20的输出数据在读时隙下降沿之后15us内有效。因此,在些15us内,主机必须停止将DQ引脚置低。在读时隙结束时,DQ引脚将通过外部上拉电阻拉回至高电平。所有的读时隙最短持续在60us,各个读时隙之间必须保证最短1us的恢复时间。

所有的读写时隙至少需要60us,且每两个的时隙之间至少需要1us的恢复时间。在写时隙中,主机将在拉低总线15us内释放总线,并向DS18B20写“1”。若主机拉低总线后能保持至少60us的低电平,则向单总线器件写“0”。 DS18B20仅在主机发出读时隙时才向主机传输数据,所以,当主机向DS18B20发出读数据命令扣,必须马上产生读时隙,以便DS18B20能传输数据。

3.3  LCD显示器

LCD显示器是利用液晶经过处理后能改变光线的传输方向特性实现显示信息的。液晶显示器具有体积小、重量轻、功耗极低,显示内容丰富等特点,在单片机应用系统中得到了日益广泛的应用。液晶显示器按其功能可以分为三类:七段式液晶显示器、字符点阵式液晶显示器和图形点阵式液晶显示器。前两种可以显示数字、字符和符号等。而图形点阵式液晶显示器还可以显示汉字和任意图形,达到图文并茂的效果。

字符形液晶显示模块是一种专门用于显示字母、数字、符号等的点阵式液晶显示模块。它是由若干个5*7或者是5*11等点阵符位组成的,每个点阵字符位都可以显示一个字符。点阵字符位之间,有一定点距间隔,这样就起到了字符间距和行距的作用。

要使用点阵型LCD液晶显示器,必须要有相应的LCD控制器、驱动器来对LCD液晶显示器进行扫描、驱动,以及一定空间的ROM和RAM来存储的写入的命令和显示字符的点阵。现在往往将LCD控制器、驱动器、RAM、ROM和LCD显示器连接在一起,称为液晶显示模块LCM。使用时只要向LCM送入相应的命令和数据就可以显示所需的信息。

目前市面上常用的有16字*1行、16字*2行、20字*2行和40字*2行等的字符液晶显示模块。这些LCD虽然显示字数各个相同,但是都具有相同的输入输出界面。

3.3.1  字符型液晶显示模块RT-1602C的引脚功能

RT-1602C采用标准的16脚接口,各引脚情况如下:

第1脚:VSS,电源地;

第2脚:VDD,+5V;

第3脚:VL,液晶显示偏置电压;

第4脚:RS,数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。

第5脚:读/写选择,高电平时进行读操作,低电平时进行写操作。当RS和共同为低电平时可以写入指令或者显示地址;当RS为低电平为高电平时可以读忙信号;当RS为高电平时为低电平时可以写入数据。

第6脚:E,为使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。

第7至14脚:D0至D7,为8位双向数据线。

第15脚:BLA,背光源正极

第16脚:BLK,背光源负极

3.3.2  字符型液晶显示模块RT-1602C的内部结构

液晶显示模块RT-1602C的内部结构可以分为三部分:一、LCD控制器,二、为LCD驱动器,三、LCD显示装置。如图3-4所示。

 图3.4 晶显示模块RT-1602C的内部结构

控制器采用HD44780,驱动器采用HD44100。HD44100是集成控制器、驱动器于一体,专用于字符显示控制驱动集成电路。HD44100是作扩展显示字符位的。HD44780是字符型液晶显示控制器的代表电路。

HD44780集成电路的特点:

(1)可选择5*7或5*10点字符。

(2)HD44780不仅可以作为控制器,而且还具有驱动16*40点阵液晶像素能力,并且HD44780的驱动能力可通过外接驱动器扩展360列驱动。

HD44780可控制的字符高达每行80个字,也就是5*80=400点,HD44780内藏有16路行驱动器和40路列驱动器,所以HD44780本身就具有驱动16*40点阵LCD的能力(即单行16个字符或两行8个字符)。如果在外部一HD44100外扩展多40路/列驱动,则可驱动16*2LCD。

(3)HD44780的显示缓冲区DDRAM、字符发生存储器(ROM)及用户自定义的字符发生器CGRAM全部内藏在芯处内。

HD447803有80个字节的显示缓冲区,分两行,地址分别为00H-27H,40H-67H,它们实际显示地址的顺序跟LCD的型号有关,液晶显示模块RT-1602C的显示地址与实际显示位置关系如图所示。

这些字符有阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符教都有一个固定的代码。如数字“1”的代码是00110001B(31H),又如大写的英文字母“A”的代码是01000001B(41H),可以看出英文字母的代码与ASCII编码相同。要显示“1”时,只需将ASCII码31H存入DDRAM指定的位置,显示模块将在相应的位置把数字“1”的点阵字符图形显示出来,我们就能看到数字“1”了。

(4)HD44780具有8位数据和4位数据传输两种方式,可与人4/8位CPU相连。

(5)HD44780具有简单而功能较强的指令集,可实现字符移动、闪烁等显示功能。

3.3.3  指令格式与指令功能

LCD控制器HD44780内有多个寄存器,通过RS和引脚共同决定选择哪一个寄存器选择情况见表

RS寄存器及操作
00指令寄存器写入
01忙标志和地址计数器读出
10数据寄存器写入
11数据寄存器读出
表3.4 HD44780内部寄存器选择

 总共有11条指令,它们的格式和功能如下:

(1)清屏命令

格式:

RSD7D6D5D4D3D2D1D0
0000000001
表3.5 清屏命令

功能:清除屏幕,将显示缓冲区DDRAM的内容全部写入空格(ASCII20H)。

   光标复位,回到显示器的左上角。

   地址计数器AC清零。

(2)光标复位命令

格式:

RSD7D6D5D4D3D2D1D0
0000000010
表3.6 光标复位命令

功能:光标复位,回到显示器的左上角。

   地址计数器AC清零。

   显示缓冲区DDRAM的内容不变。

(3)输入方式设置命令

格式:

RSD7D6D5D4D3D2D1D0
00000001I/DS
表3.7 输入方式设置命令

功能:设定当写入一个字节后,光标的移动方向以及后面的内容是移动的。

   当I/D=1时,光标从左向右移动,I/D=0时,光标从右向左移动。

   当S=1时,内容移动,S=0时,内容不移动。

(4)显示开关控制命令

格式:

RSD7D6D5D4D3D2D1D0
0000001DCB
表3.8 显示开关控制命令

功能:控制显示的开关,当D=1时显示,D=0时不显示。

   控制光标开关,当C=1时光标显示,C=0时光标不显示。

   控制字符是否闪烁,当B=1时字符闪烁,B=0时字符不闪烁。

(5)光标移位置命令

格式:

RSD7D6D5D4D3D2D1D0
00000IS/CR/L
表3.9 光标移位置命令

功能:移动光标或整个显示字幕移位。

    当S/C=1时整个显示字幕移位,当S/C=0时只光标移位。

    当R/L=1时光标右移,R/L=0时光标左移。

(6)功能设置命令

格式:

RSD7D6D5D4D3D2D1D0
00001DLNF
表3.10 功能设置命令

功能:设置数据位数,当DL=1时数据为8位,DL=0时数据位为4位。

   设置显示行数,当N=1时双行显示,N=0时单行显示。

   设置字形大小,当F=1时5*10点阵,F=0时为5*7点阵。

(7)设置字库CGRAM地址命令

格式:

RSD7D6D5D4D3D2D1D0
00CGRAM的地址

表3.11 设置字库CGRAM地址命令

功能:设置用户自定义CGRAM的地址,对用户自定义CGRAM的访问时,要先设定CGRAM的地址,地址范畴为0-63。

(8)显示缓冲区DDRAM地址设计命令

格式:

RSD7D6D5D4D3D2D1D0
00DDRAM的地址

表3.12 显示缓冲区DDRAM地址设计命令

功能:设置当前显示缓冲区DDRAM的地址,对DDRAM访问时,要先设定DDRAM的地址,地址范畴为0~127。

(9)读忙标志及地址计数器AC命令

格式:

RSD7D6D5D4D3D2D1D0
01BFAC的值

表3.13 读忙标志及地址计数器AC命令

功能:读忙标志及地址计数器AC命令。

   当BF=1时表示忙,这时不能接收命令和数据:BF=0时表示不忙。

   低7位为读出的AC的地址,值为0~127。

(10)写DDRAM或CGRAM命令

格式:

RSD7D6D5D4D3D2D1D0
10写入的数据
表3.14 写DDRAM或CGRAM命令

功能:向DDRAM或CGRAM当前位置写入数据。对DDRAM或CGRAM写入数据之前必须设定DDRAM或CGRAM的地址。

(11)读DDRAM或CGRAM命令

格式:

RSD7D6D5D4D3D2D1D0
11读出的数据
表3.15 读DDRAM或CGRAM命令

功能:从DDRAM或CGRAM当前位置中读出数据。当DDRAM或CGRAM读出数据时,先须设定DDRAM或CGRAM的地址。

3.3.4  LCD显示器的初始化

LCD使用之前须对它进行初始化,初始化可通过复位完成,也在复位后完成,初始化过程如下:

(1)清屏。

(2)功能设置。

(3)开/关显示设置。

(4)输入方式设置。

4  单元电路设计说明

4.1  电源设计

4.1.1  直流稳压电源

    小功率稳压电源由电源变压器、整流电路、滤波电路和稳压电路四个部分组成,如图4. 1所示。

        

    +       电  源    +        整 流   +       滤 波 稳 压   +

 1 2                          u3                      uI                        U0

    _       变压器    _        电 路   _       电 路   _       电 路   _

图4.1 稳压电源的组成框图

 u1 2 3                          uI                     U0  

                                                                                                   

  0             t    0             t   0             t  0           t  0        t 

  

图4.2 整流与稳压过程

本次的设计的稳压电源电路原理图如图所示:

图4.3 稳压电源电路原理图

4.1.2  电源变压器部分电路设计

电源变压器作用是将电网220V的变流电压V1变换成整流滤波电路所需的变流电压V2。变压器副边与原边的功率比P2/P1=η,式中η为变压器的效率。

4.1.3  整流滤波电路设计

整流电路将交流电压变成单向脉动的直流电压;滤波电路用来滤除整流后单向脉动电压中的交流成份,合之成为平滑的直流电压。

小功率直流电源因功率比较小,通常采用单相交流供电。由于桥式整流电路克服了半波整流的缺点,在桥式整流电路中,由于每两只二极管只导通半个周期,故流过每个二极管的平均电流仅为负载电流的一半,与半波整流电路相比较,其输出电压提高,脉动成分减小了。

为了获得平滑的直流电压,常在整流电路的后面加接滤波电路,以滤去交流成分。滤波电路常见的有电容滤波电路(主要利用电容两端电压不能突变的特性,使负载电压波形平滑,故电容应与负载并联)、电感滤波电路及π型滤波电路。本设计采用电容滤波电路。

4.1.4  稳压电路设计

稳压电路的作用是当输入交流电源电压波动、负载和温度变化时,维持输出直流电压的稳定。由于三端式稳压器只有三个引出端子,具有应用时外接元件少、使用方便、性能稳定、价格低廉等优点,因而广泛应用。三端式稳压器有两种,一种称为固定输出三端稳压器,另一种称为可调输出三端稳压器。它们的基本组成及工作原理都相同,均采用串联型稳压电路。

三端固定输出集成稳压器通用产品有CW7800系列和CW7900系列。

正压系列:CW7800系列,该系列稳压块有过流、过热和调整管工作保护,以防过载而损坏。一般不需要接元件即可工作,有时为改善性能也加少量元件。

负压系列:CW7800系列与CW7900系列相比,除了输出电压极性、引脚定义不同外,其他特点都相同。

稳压电源的技术指标分为两种:一是特性指标:包括允许的输入电压、输出电压、输出电流及输出电压调节范围等;另一种是质量指标,用来衡量输出直流电压的稳定程度,包括稳压系数(或电压调整流器率)、输出电阻(或电流调整率)、温度系数及纹波电压等。

4.2  单片机时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地作。

(1)时钟信号的产生

单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。

电容器C1和C2的作用是稳定频率和快速起振,电容值的范围在5pF∽30pF,典型值为30pF。晶振的频率通常选择两种6MHz和12MHz。只要在单片机的XTAL1和XTAL2引脚外接晶体振荡器就构成了自激振荡器并在单片机内部产生时钟脉冲信号。

(2)时钟振荡电路如图4.4所示。

4.3  单片机复位电路

复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。

(1)单片机常见的复位电路

通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的

在此设计中,采用的按键复位电路。按键复位电路如图4.5所示:

(2)复位电路工作原理

上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。

上电与按键均有效的复位电路不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作。

故本设计选用第二种上电复位与按键均有效的各单位电路。

4.4  单片机键盘电路

键盘电路是很多设计中很重要的组成部分。它主要是输入设备。

单片机应用系统中键盘有式和行列式两种。

式键盘:式键盘中,每个按键占用一根I/O口线,每个按键电路相对。I/O口通过按键与地相连,I/O口有上拉电阻,无键按下时,引脚端为高电平,有键按下时,引脚电平被拉低。I/O口内部有上拉电阻时,外部可不接上拉电阻。

行列式键盘:行列式键盘键数比较多,从按一个键到键功能被执行主要包括两项工作:一是键的识别,即在键盘中找出被按的是那一个键,另一项是键功能的实现,第一项是接口电路来实现的,而第二项是通过执行中断服务程序来实现的。具体来说,键盘借口应完成以下操作功能:

●键盘扫描,以判断是否有键按下。

●键识别,以来确定闭和键的行列位置。

●产生闭和键的键码。

●排除多键,串键以及抖动。

本次设计中采用的是式键盘,键盘电路图如图4.6所示:

图4.6 与单片机相连的式键盘

4.5  超声波发射电路

4.7 超声波发射原理图

超声波信号由单片机产生,信号经过三极管后驱动超声波换能器发送超声波,途中碰到障碍物就立即返回。否则认为没有探测到物体。

此电路有两个三极管构成推拉式驱动电路,三极管工作在开关状态。当信号线来一个高电平时,三极管Q1导通,Q1的集电极高电平,Q2截止,Q2的发射极为低电平,从而使超声波换能器工作。在此电路图中的电容(C1)起隔直耦合作用。

4.6  超声波接收电路

图4.8 超声波接收原理图

超声波接收是用来将探测波回波的声能转换为电信号,实现超声波回波的接收。在被测物距离较远的情况下回波很弱,要求将信号多次放大,放大后的信号整形、比较、触发后产生中断信号,此中断信号向CPU发中断请求,执行中断服务程序中,读取计时器的定时值。

此电路由信号放大部分,检波部分,电压比较部分和信号保持部分组成,收到的信号经过两级放大,再通过倍压式峰值检波电路检波,得到一个基本稳定的信号,再通过与电压比较器比较,若信号电压大于参考电压,则输出高电平,若低于参考电压则输出为低电平,若输出高电平,则RS触发器触发,输出高电平,且一直保持下去,直到单片机给出控制信号,触发器回到低电平状态。

超声波从发射到接收时间间距的测量,是由单片机内部的计数器(如T0)来完成的 。超声波从发射到接收的时间间隔的测量, 是由单片机内部的计数器(如T 0) 来完成的。在CPU 停止发送脉冲群后, 由于电阻尼, 换能器不会立即停止发送超声波, 在一定时间内仍然发送。这段时间的存在使系统不能够测量比较近的物体, 形成所谓的“盲区”, 需要对盲区时间产生的信号进行屏蔽, 不同性能的超声波换能器的盲区有所差异, 以一个通道工作的时序为例进行说明, 如图4.9 所示。

图4.9 一个通道的工作时序

4.7  单片机最小系统控制运算模块总原理图

图4.10 单片机最小系统控制运算模块总原理

5  软件设计流程图

5.1  主流程图

图5.1 主流程图

5.2  温度读取程序

 

图5.2 温度检测程序

5.3  LCD显示流程图

图5.3 LCD显示流程图

5.4  外中断服务程序

图5.4 外中断服务程序

5.5  超声波发射接收程序

图5.5 超声波发射程序

5.6  键扫子程序

图5.6 键扫子程序

6  调试说明

6.1  软件调试

系统软件设计、调试的过程如图6.1所示

  

    Y    

N

    Y

N

图6.1

其过程分为以下几个步骤:

第一步,建立源程序。通过计算机开发系统的编辑软件,按照所要求的格式、语法规定、源程序输入到开发系统中,并存在磁盘上。

第二步,在计算机上,利用KILE软件对第一步输入的源程序进行编译,变为可执行的目标代码。如果源程序有语法错误,则其错误将显示出来,然后返回到第一步进行修改,再进行编译,直到语法错误全部纠正为止。

第三步,动态在线调试。对于与系统、硬件无联系的程序,可以借助动态在线调试手段,如单步运行、设置断点等,发现逻辑错误,然后返回到第一步修改,直到逻辑错误纠正为止。对于与系统硬件紧密相关的程序,则需软件,硬件同时进行调试,将程序烧入CPU,然后将CPU 插入系统,发现硬件故障排除故障,发现逻辑错误,修改程序,消除逻辑错误。

6.2  硬件调试

硬件调试分两步:

第一步:系统上电之前,先用万用表等工具,根据硬件逻辑设计图,仔细检查线路是否连接正确,并核对元器件的型号、规格和安装是否符合要求,应特别注意电源系统的检查,以防止电源的短路和极性错误,并重点检查系统总线是否存在相互之间短路或与其它信号线的短路。

第二步:第一步的调试,只是对系统进行初步调试,可以排除一些明显的故障,而硬件故障(如各个部件内部存在的故障和部件之间连接的逻辑错误)主 要是靠软件和硬件联调来排除。

硬件调试和软件调试是不能完全分开的,许多硬件错误是在软件调试中发现和被纠正的。

7  误差分析

7.1  超声波回波声强的影响

回波的声强与障碍物距离的远近有直接关系, 实际测量时, 不一定是第一个回波的过零点触发, 其原理如图7-1 所示。这种误差不能从根本上消除, 但是可以通过根据障碍物的距离调整脉冲群的脉冲个数以及动态调整比较电压来减小这种误差。另一方面将求距离公式后加一个补偿系数来补偿计时误差, (a 与距离、脉冲个数相关) 。

图7.1 脉冲个数与回波声强对计时影响示意图

7.2  超声波波束入射角的影响

如果系统是用来测量面与点的距离, 则被测物、换能器及换能器所在测量参考平面三者之间存在一个几何角度, 即反射波入射到换能器的角度, 当这

角度不是90°时, 系统测量到的距离是障碍物与换能器之间的距离而不是和

量参考平面之间的距离, 这就会造成测量误差, 如图7.2 所示。

图7.2 超声波回波入射角影响分析图

当障碍物的距离较小时, 这个误差就会成为近距离时的主要误差来源。可以用多个换能器同时测量, 利用几何关系来计算得出实际距离, 消除这种误差。

…………………………………7.1

               ……………………………………7.2

式中   ----换能器a 、b到被测物的距离

       ----换能器a、b之间的距离

       -----被测物到测量的距离

7.3  超声波传播速度的影响

稳定准确的声波传播速度是保证测量精度的必要条件, 传播介质的温度、压力及密度对声速都产生直接影响。对于在大气中传播的声波而言, 引起声速变化的主要原因是温度的变化。采用声速预置和传播介质温度测量结合的方法对声速进行修正, 可有效地降低温度变化产生的误差。在对距离的精确度要求不高的应用中可以不进行温度补偿, 选择室温20℃左右时的声速340m/s作为固定参数, 当温度在- 10~ 40 ℃之间变化时声速误差在±5% 之间。如果在室外测量, 对于季节温差大的地区, 还可以采用预置该地区12 个月的统计温度, 用以对温度进行补偿, 既可提高精度, 又不增加成本。影响测量误差的因素8 很多, 包括现场环境干扰、时基脉冲频率等。在实际应用中可以根据系统测量精度要求, 采用合理的补偿手段。

7.4  实测比较

实测值测量值
0.34m

0.30m

0.m

0.62m

0.84m0.82m

1.12m

1.11m
1.23m1.21m
1.37m1.35m
1.72m1.68m
表7.1 实际测量值与测量值的比较

8  设计心得

通过一个多月的努力,基于单片机的超声波测距仪设计的毕业设计终于在我的努力下完成了。设计能够成功的完成是与桂友超老师细心的指导和帮助分不开的,在此表示忠心的感谢。

在这次毕业设计过程中。通过资料的查阅,制定方案等一系列过程,极大的丰富了我的专业知识,使我的理论与实际动手能力又有了一个很大的提高,特别是在单片机编程方面又学到了不少新的东西。毕业设计使我有机会把自己平时理论学习能够运用到实际中去,理论与实践相结合使我对自己的毕业设更加得心应手,在设计过程中同样也发现自己在各方面还存在不少问题,值得一说的就是自己有时候做事还是比较盲目,记得程序做好以后,我就马上迫不及待装机进行测试,但结果大失所望,显示、输出什么都没有。测试单片机,ALE无信号,竟然连晶振输出都没有信号,在没有经过仔细的分析下便马上断定晶振有问题,换!,还是不行,当时就晕了,不知道出了什么问题,拆这拆那,最后才发现自己的复位电路的PCB板在设计上存在问题,导致按键一直处于按下的状态,这样就迫使单片机的复位引脚一直处于高电平的复位状态,试问单片机又怎么可能会正常工作呢。当然,最后经过自己冷静分析终于找到了问题所在,修复后一切正常。经过这次也使我真正的认识单片机复位的重要性,也从此得到了一个教训,做事一定有条理,不能盲目的去干,否则造成大返工,吃亏终就是自己。    

毕业设计对我来说,是三年来所学的所有知识的一个非常全面的综合性应用,涉及的理论知识面也很广,需要了解各方面的知识,是理论与实践相结合的最好体现,也是对我们大学三年生活的一种肯定,所以我们大家都是用心去把它做到最好,毕业论文的编写经过了很长的时间,也发现了很多问题,不过在宋老师的耐心指导下都一一得到了解决,在这里再次表示感谢,同时也非常感谢三年以来所有教导我的老师,你们辛苦了。最后祝愿湖南工学院蒸蒸日上,越来越好。

    

参考资料

[1] 何小艇.电子系统设计[M].杭州:浙江大学出版社,2000.156~159 

[2] 谢自美.电子电路设计[M].武汉:华中理工大学出版社,2000.163~165 

[3] 徐爱钧.智能化测量控制仪表原理与设计[M].北京:北京航空航天大学出版社,2004.179~182 

[4] 何立民.MCS-51 系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,1990.~93

[5] 刘守义.单片机应用技术[M].西安:西安电子科技大学出版社,2003.23~26

[6] 马忠梅.单片机的C语言Windows环境编程宝典[M]. 北京:北京航空航天大学出版社,2003.52~55    

[7] 李光飞.单片机C程序设计指导[M].北京:北京航空航天大学出版社,2003.32~36

[8] 赵茂泰.智能仪器原理及应用[M].北京:电子工业出版社,2004.147~150

致  谢

本毕业设计师是在桂友超老师的悉心指导下完成。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。他对指导的耐心着实让我感动,从设计的起步到最终完成,桂友超老师都始终给予我细心的指导和不懈的支持。两年多来,桂友超老师不仅在学业上给我以精心指导,同时还在思想、生活上给我以无微不至的关怀,在此谨向尹老师致以诚挚的谢意和崇高的敬意。 

在此,我还要感谢在一起愉快的度过大学生活的电气0802班全体同窗以及610的各位室友,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,一路开心快乐成长到至今,正是你们的热心和彼此的默契才有我毕业设计的顺利完成。在这里特别感谢我实习的各位前辈,是你们手把手的指点才有我的迅速成长,特别要感谢的是我的爸爸,谢谢你带我走入实践的大门,触摸建筑的殿堂。在这里还要感谢教我软件的老师们。

    在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的前辈、老师、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,女儿正在努力中,谢谢你们!真的幸苦你们啦!

附录

1 总原理图

2 PCB图  

3 程序清单

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

uint c=340;                                     //定义10度时声音的速度//

ulong l,time;

char ii=1,k=80,aa;

char t,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg;

sbit RW=P2^1;                                   //定义LCD读/写选择端//

sbit RS=P2^0;                                //定义LCD数据/命令选择端//

sbit E=P2^2;                                          //定义LCD使能端//

sbit k3=P1^2;

sbit k4=P1^3;

sbit sg=P3^7;                                       //定义超声波射引脚//

sbit ctl=P3^5;                                     //定义超声波控制引脚//

uchar tplsb,tpmsb;                               //温度值低位、高位字节//

sbit DQ=P3^6;                                    //DS18B20数据通信线//

ulong tp,sw,gw,sfw,bfw,tppp;

uchar *p;

void delay(uint i) //延时程序//

{while(i--);

 }

//*******产生复位脉冲初始化DS18B20*******//

void Txreset()

{DQ=0;

  delay(100);                                           //拉低约900US//

 DQ=1;                                                  //产生上升沿//

  delay(4);

 }

//*******等待应答脉冲*******//

 void Rxwait()

{while(DQ);

 while(DQ==0);                                       //检测到应答脉冲//

  delay(4);

 }

//*******读取数据的一位,满足读时隙要求*******//

bit Rdbit()

{uint i;

 bit b;

 DQ=0;

 i++;                                                  //保持至少1US//

 DQ=1;

 i++;

 i++;   //延时节15US以上,读时隙下降后15US,DS18B20输出数据才有效//           b=DQ;           

 i=8;

while(i>0)i--;

 return(b);                                         //读时隙不低于60US//

}

//*******读取数据的第一个字节*******//

uchar Rdbyte()

{uchar i,j,b;

 b=0;

for(i=1;i<=8;i++)

 {j=Rdbit();

b=(j<<7)|(b>>1);

  }

  return(b);

}

//*******写数据的第一个字节,满足写1和写0的时隙要求*****//

void Wrbyte(uchar b)

{uint i;

 uchar j;

 bit btmp;

for(j=1;j<=8;j++)

 {btmp=b&0x01;

  b=b>>1;                                  //取下一位(由低位向高位)//

  if(btmp)

  {DQ=0;

   i++;

   i++;                                     //延时,使得15US以内拉高//

   DQ=1; 

   i=8;

   while(i>0)i--;                              //整个写1时隙不低于60US//

   DQ=1;

   i++;

   i++;

   }

  else

  {DQ=0;

   i=9;

   while(i>0)i--;                              //保持低在60至120US之间//

   DQ=1;

   i++;

   i++;

   }

  }

}

//启动温度变换//

void convert()

{ Txreset();                              //产生复位脉冲,初始化DS18B20//

  Rxwait();                              //等待DS18B20给出的应答脉冲//

  Wrbyte(0xcc);                                          //skip rom命令//

  Wrbyte(0x44);                                         //convert T命令//

}

//温度读取值//

void Rdtemp()

{Txreset();                              //产生复位脉冲,初始化DS18B20//

 Rxwait();                               //等待DS18B20给出的应答脉冲//

 Wrbyte(0xcc);                                           //skip rom命令//

 Wrbyte(0xbe);                                          //convert T命令//

 tplsb=Rdbyte();                                       //温度值低位字节//

 tpmsb=Rdbyte();                                        //温度高位字节//

 }

date()

{

 tp=tpmsb*256+tplsb;

 sw=tp*625/100000;                                     //读取温度十位//

 gw=tp*625%100000/10000;                              //读取温度个位//

 sfw=tp*625%100000%10000/1000;                      //读取温度十分位//

 bfw=tp*625%100000%10000%1000/100;                 //读取温度百分位//

 tppp=sw*10+gw;

 }

vmain()

{delay(100);                                                //延时程序//

 convert();                                              //启动温度转换//

 delay(100);

 Rdtemp();                                                 //读取温度//

 delay(100);

 date();

 }

//************液晶显示***************//

void writercom(uchar q)                                         //写命令//

{E=1;

 RS=0;

 RW=0;

 P0=q;

 E=0;

 delay(20);

 }

void writerdata(uchar o)                                         //写数据//

{

 E=1;

 RS=1;

 RW=0;

 P0=o;

 E=0;

 delay(20);

 }

void writer_d(uchar *u)                                       //写数据串//

{while(*u) 

  writerdata(*u++);

 }

void xsinit(void)

{writercom(0x01);

 writercom(0x38);              //使用8位数据,显示两行,使用5*7的字型//

 writercom(0x0c);                  //显示设置,不显示光标,字符不显闪琐//

 writercom(0x06);                            //光标从左往右移,内容不移//

 }

void inptt()

{while(1)

 {vmain();

  writercom(0x80);

  writer_d("Taday Tp:");

  writerdata(sw+0x30);                               //LCD显示温度十位//

  writerdata(gw+0x30);                               //LCD显示温度个位//

  writerdata('.');别                               //LCD显示温度十小数点//

  writerdata(sfw+0x30);                            //LCD显示温度十分位//

  writerdata(bfw+0x30);                            //LCD显示温度百分位//

  writerdata(0xdf);

  writer_d("C  ");

  writercom(0xc0);

  writer_d("Please press K4");

  if(k4==0)break;

  }

}

//**********超声波发射程序************//

void sen()       

{uchar times=0; 

 TMOD=0x12;      //定时器1工作在定时方式1,定时器0工作在定时方式2//

 IE=0x84;                                                  //中断设置//

 TH0=244;

 TL0=244;

 TR0=1;

 TR1=1;                                                   //开定时器// 

 while(1)

 {while(TF0==0);

  sg=~sg;

  times++;     

  TF0=0;   

  if(times==20)break;}            //翻转20次,发送10个脉冲信号的超声波//

  TR0=0;

  times=0;

}

//**********外中断服务程序************//

rec()interrupt 2 using 2  //接收中断程序//

{TR1=0;                                                   //关计数器//

 ctl=0;

 time=TH1*256+TL1;                         //算出t的值,t的单位为us//

 l=time*c/2;

 TH1=0;

 TL1=0;

 }

//************数据处理,显示结果***************//

void dataxs()

{if(tppp>=10)

c=338+(tppp-10)*0.6;

 else c=338+(10-tppp)*0.6;

 cb=c/100;                                           //声音速度的百位//

 cs=c%100/10;                                        //声音速度的十位//

 cg=c%100%10;                                       //声音速度的个位//

 lb=l/1000000;                                            //距离的个位//

 ls=l%1000000/100000;                                   //距离的十分位//

 lg=l%1000000%100000/10000;                            //距离的百分位//

 

/******LCD显示********/

 writercom(0x80);

if(l<=100000)writer_d("too near! ");

else if(l>=6000000)writer_d("too long! ");

 else {writer_d("L=");

       writerdata(lb+0x30);                         //LCD显示距离的个位//

       writerdata('.');

       writerdata(ls+0x30);                       //LCD显示距离的十分位//

       writerdata(lg+0x30);                       //LCD显示距离的百分位//

       writer_d("m ");         

       writer_d("C=");

       writerdata(cb+0x30);                    //LCD显示声音速度的百位//

       writerdata(cs+0x30);                    //LCD显示声音速度的十位//

writerdata(cg+0x30);                    //LCD显示声音速度的个位//

 writer_d("m/s ");

       }

}

//****状态1,手动控制******************//

void unauto()

{while(ii)

 {while(k--)

  {writercom(0xba);

   writer_d("Press K4 measure");                    //提示按K4发射超声波//

   if(k4==0||k3==0)

{ii=0;break;}

   delay(2000);}

   k=20;

  while(k--)

  {writercom(0xba);

   writer_d("                ");

   if(k4==0||k3==0){ii=0;break;}

   delay(2000);}

   k=20;

  }

  ii=1;

  ctl=0;

  sen();                                            //调超声波发射程序//

  delay(50);

  ctl=1;

  }

//****状态2,实时监控*****//

void aut()

{writercom(0xba);

 writer_d("Designer: GUOBIN");

 ctl=0;

 sen();

 delay(50);

 ctl=1;

 }

ztxz()

{while(k3==0&&aa==0)

 {while(1)

  {if(k3==1)break;}

  aa=1;

  }

 while(k3==0&&aa==1)

 {while(1)

  {if(k3==1)break;}

  aa=0;

  }

 }

//********主程序*******************//

main()

{xsinit();

vmain();                                                    //温度输入//

inptt();

while(1)

{while(!aa)

{unauto();

   break;

  }

  while(aa) 

  {aut();

   break;

  }

  while(k--)                                                //等待回波//

  {ztxz();                                            //状态切换键判断//

   delay(2000);

   }

   k=20;

  dataxs();

  }

}

4 元件清单

中文名称规格数量
电阻10K8
电阻470K4
电阻1K10
电阻1M2
电阻100R8
电阻100K8
电阻4.7K2
电容104pF15
电容30pF2
电容102pF4
电容103pF5
电解电容2200uF1
电解电容33uF2
集成芯片55322
集成芯片74LS001
集成芯片ATC52

1
集成芯片W78051
二极管IN400710
按扭SW-PB5
晶振6MHz1
数码管LCD1
电位器50K1
电位器100K2
芯片插槽40脚

1
芯片插槽14脚

1
芯片插槽8脚

2
排线8针

1
超声波1
温度传感器18B201
三极管90142
                        下载本文
显示全文
专题