您的当前位置:首页正文

超声波测距设计报告

2024-04-08 来源:好走旅游网
天津工业大学 电子与信息工程学院 创兴杯设计报告

超声波测距

—设计报告

摘要 利用超声波测距原理,出于低成本、高精度的目的,提出了一种基于AT89C52的超声波测距的设计方案。硬件部分采用AT89C52单片机作为控制器,主要有超声波发射电路、超声波接收电路、温度检测电路、LCD显示电路和报警电路。在分析超声波测距原理的基础上,给出了实现超声波测距的硬件设计电路图和软件设计流程图。该系统测量精度为1cm,测量范围为0.30-3.00m,能够很好的满足测距的设计要求。

关键字 单片机 超声波 温度补偿 测距 LCD显示

1、设计任务

(1)超声波测距系统原理

1) 超声波传感器

总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。

压电式超声波发生器实际上是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。超声波传感器结构如下:

第 1 页 共 1 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

图 2超声波传感器外部结构 图 3 超声波传感器内部结构 2) 超声波测距的方案

超声波测距方法主要有三种:1)相位检测法:精度高,但检测范围有限;2)声波幅值检测法:易受反射波的影响;3)渡越时间法:工作方式简单,直观,在硬件控制和软件设计上都容易实现,其原理为:检测从发射传感器发射的超声波经气体介质传播到接收传感器的时间t,这个时间就是渡越时间,然后求出距离l。设l为测量距离,t为往返时间差,超声波的传播速度为c,则有l=ct/2。综合以上分析,本设计将采用渡越时间法。

图 4 测距原理

由于超声波也是一种声波,其声速c与空气温度有关,一般来说,温度每升高1摄氏度,声速增加0.6米/秒。表1列出了几种温度下的声速:

表1 声速与温度的关系表

温度(摄氏度) 声速(米/秒)

-30 -20 -10 0 313

319

325

10

20

30

100

323 338 344 349 386

在使用时,如果温度变化不大,则可认为声速c是基本不变的,计算时取c为340m/s。如果测距精度要求很高,则可通过改变硬件电路增加温度补偿电路的方法或者在硬件电路基本不变的情况下通过软件改进算法的方法来加以校正。

在本系统中利用AT89S52中的定时器测量超声波传播时间,利用DS18B20测量环境温度,从而提高测距精度。空气中声速与温度的关系可表示为:

声速确定后,只要测得超声波往返的时间,即可求得距离:

第 2 页 共 2 页

c331.45T273.16331.40.6T(m/s)273.16

天津工业大学 电子与信息工程学院 创兴杯设计报告

l=1/2(331.4+0.6T)t。 (系统中应用该式进行温度补偿)

如果为了进一步提高测量精度,本设计中将根据需要利用软件方式增加角度补偿的设计:s2l2h2。 (系统中应用该式进行角度补偿)

2、总体设计

(1)超声波测距系统电路总体设计方案

系统硬件部分由AT89C52控制器、超声波发射电路及接收电路、温度测量电路、声音报警电路和LCD显示电路组成。测距启动时LCD显示环境温度,发射和接收电路工作,经过AT89C52数据处理将距离也显示到LCD上,如果距离小于设定值时,报警电路会鸣叫,提醒人们注意。超声波测距器的系统框图如下图1所示:

发射电路LCDDS18B20启动电路 AT89C52接收电路 图1 系统设计总框图

由单片机AT89C52编程产生10us以上的高电平,由指定引脚输出,就可以在指定接收口等待高电平输出。一旦有高电平输出,即在模块中经过放大电路,驱动超声波发射探头发射超声波。发射出去的超声波经障碍物反射回来后,由超声波接收头接收到信号,通过接收电路的处理,指定接收口即变为低电平,读取单片机中定时器的值。单片机利用声波的传播速度和发射脉冲到接收反射脉冲的时间间隔计算出障碍物的距离,并由单片机控制显示出来。

由时序图可以看出,超声波测距模块的发射端在T0时刻发射方波,同时启动定时器开始计时,当收到回波后,产生一负跳变到单片机中断口,单片机响应中断程序,定时器停止计数。计算时间差,即可得到超声波在媒介中传播的时间t,由此便可计算出距离。

第 3 页 共 3 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

时序图 (2)超声波发射和接收电路的设计

分立元件构成的发射和接收电路容易受到外界的干扰,体积和功耗也比较大。而集成电路构成的发射和接收电路具有调试简单,可靠性好,抗干扰能力强,体积小,功耗低的优点,所以优先采用集成电路来设计收发电路。 (3)温度补偿和显示电路的设计

选用用温度传感器作为测量温度的器件,反应灵敏,数据测量精确,易于实现温度补偿的功能。选用LCD作为显示,更好更清楚的显示所需内容,同时便于操作。

3、电路设计

(1)超声波发射电路

超声波发射电路包括超声波产生电路和超声波发射控制电路两部分,可采用软件发生法和硬件方法产生超声波。在超声波的发射电路的设计中,我们采用电路结构简单的集成电路构成发射电路:

U1:A1P2.51174HC04274HC04U1:E101374HC04R110k12U1:DLS1SPEAKERU1:C574HC046R2U1:B374HC04410k 图2由反相器构成的超声波发射电路

图2是由反相器74HC04构成的发射电路,用反相器74HC04构成的电路简单,

第 4 页 共 4 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

调试容易,易通过软件控制。单片机输出的方波经过反相器接到发射器T1的两极,用图中的推挽形式将方波信号加到发射器T1两端,可以提高发射器T1的发射强度。图中把两个非门的输出接到一起的目的是为了提高其吸入电流,电路驱动能力提高。74HC04是一个高速CMOS六反相器,具有对称的传输延迟和转换时间,而相对于LSTTL逻辑IC,它的功耗减少很多。另外,上拉电阻R1、R2一方面可以提高反相器74HC04输出高电平的驱动能力,另一方面可以增加发射器T1的阻尼效果,缩短其自由振荡的时间。

(2)超声波接收电路

图是由CX20106构成的接收电路,在实物的制作过程中,我们将用CX20106A这一型号代替。CX20106A是索尼公司生产的彩电专用红外遥控接收器,是CX20106的改进型,也可用于超声波测试,有较强的抗干扰性和灵敏度。CX20106A采用单列8脚直插式,超小型封装,+5V供电。管脚1是超声波信号输入端,其输入阻抗约为40K;管脚2的R1、C4决定接收器R的总增益,增大电阻R1或减小电容C4,将使放大倍数下降,负反馈量增大,电容C4的改变会影响到频率特性,实际使用中一般不改动;管脚3与GND之间连接检波电容C2,考虑到检波输出的脉冲宽度变动大,推荐参数为3.3uF;管脚5上的电阻R2用以设置带通滤波器的中心频率,阻值越大,中心频率越低,取R2=200K时,中心频率约为42KHZ;管脚6与GND之间接入一个积分电容C3,电容值越大,探测距离越短;管脚7是遥控命令输出端,它是集电极开路的输出方式,因此该引脚必须接上一个上拉电阻到电源端,没接收信号时,该端输出为高电平,有信号时则会下降;管脚8接+5V电源。

J1CX2010612345678P2.6LS1C1SPEAKER473C33.3ufR2200kC4330pR322kR14.7C21ufC5104 图3 CX20106构成的接收电路

综合以上的分析,在由集成电路构成的接收和发射电路中,发射电路我们选

第 5 页 共 5 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

用由反相器构成的电路,接收电路采用由红外接收检波芯片CX20106A构成,主要是考虑到系统的调试简单,成本低以及可靠性好。

(3) 单片机主机系统电路

1) 复位电路

单片机在RESET端加一个大于20ms正脉冲即可实现复位,上电复位和按钮组合的复位电路如图。

在系统上电的瞬间,RST与电源电压同电位,随着电容的电压逐渐上升,RST电位下降,于是在RST形成一个正脉冲。只要该脉冲足够宽就可以实现复位。当人按下按钮SW1时,使电容C1通过R1迅速放电,待SW1弹起后,C1再次充电,实现手动复位。

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C210u18XTAL29RSTSW1SW-SPST293031PSENALEEAR110k12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51 图4 复位电路

第 6 页 共 6 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

2) 时钟电路

当使用单片机的内部时钟电路时,单片机的XTAL1和XTAL2用来接石英晶体和微调电容,如图5所示。

C330pfC1X130pfCRYSTALU119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A153938373635343332212223242526272818XTAL29RST293031PSENALEEA 图5 时钟电路 3) 按键电路 通过P1.0来启动测量,程序中通过查询P1.0的电平来检测是否按键被按下,在软件中通过软件延时来消除按键的机械抖动。按键按下前,P1.0的电平是高电平,按下后P1.0电平变成低电平,系统启动测距。如图 R14.7kp10SW1SW-SPST 图6 按键电路

第 7 页 共 7 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

4)温度测量电路

由于超声波的传播速度c会受温度、湿度、压强等的影响,其中温度的影响尤为严重。因此在测量精度要求高的场合,应通过温度补偿对超声波的传播速度进行校正,以减小误差。

U1p2.7R14.7k321VCCDQGNDDS18B2027.0 图7 温度检测电路

本系统采用DALLAS公司的DS18B20数字式温度传感器进行温度测量,它所测量的温度值用9位二进制数直接表示,这些值通过DS18B20的数据总线直接输入CPU,无需A/D转换,而且读写指令、温度转换指令都是通过数据总线传入DS18B20,无需外部电源。DS18B20数字温度传感器与AD590、LM35等温度传感器相比,具有相当的测温范围和精度,温度测量精确、不受外界干扰等优点。 5)LCD显示电路

本设计采用LCD液晶显示屏来显示距离和温度,具有体积小、功耗低、界面美观大方等优点,这里使用YB1602液晶屏,它具有16个引脚,其正面左起为第一脚,如图8所示:

图8 LCD1602实物

第一脚VSS:接地。 第二脚VDD:+5V电源。

第三脚VEE:对比度调整端。使用时通过接一个20K的电位器来调节。 第四脚RS:寄存器选择信号线,H为数据选择,L为指令选择。 第五脚RW:读写信号线。

第 8 页 共 8 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

第六脚E :使能端,当E由高电平跳变为低电平时执行命令。 第7-14脚:8位数据线D0-D7。

第十五脚BLA:背光电源正极输入端。 第十六脚BLK:背光电源负极输入端。

LCD1LM020LVSSVDDVEERSRWE456123RV120K7891011121314D0D1D2D3D4D5D6D7 图9 LCD显示电路

第 9 页 共 9 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

4、软件设计

(1)软件各模块的划分及功能

1) DS18B20温度传感器接口模块,分为初始化程序、写入命令以及读取子程序等部分;

2) 基于YB1602的显示模块,分为初始化子程序、写入子程序以及显示子程序;

3) 温度补偿与距离计算模块,分为超声波发送控制程序、接收处理程序、温度补偿子程序等。

本次设计使用C语言编写程序,C语言相比汇编有许多的优势,编译器使用KeilVersion4进行程序编译,Keil功能强大使用方便。在编译完成后,通过Proteus软件进行仿真,对设计进行验证和优化。如图10所示描述了各个模块的关系:

DS18B20初始化温度测量温度补偿超声波发射计算距离超声波接受LCD显示按键处理图10 系统软件方框图

蜂鸣器

(2)主程序设计

本设计主程序的思想如下:

(1)温度为两位显示,距离为四位显示单位为mm;

(2)温度每隔900ms采样一次,DS18B20在12位精度下转换周期为750ms ,故900ms满足该速度要求;超声波每隔60ms发送一次。 (3)按键SW2为测量启动键;

(4)系统采用AT89S52的内时钟:12MHz,每记一次数为1us;

第 10 页 共 10 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

图11 主程序流程图

(3)各模块程序设计

1)40KHz超声波发送子程序

超声波每过60ms发送一次,通过定时器T0中断发送超声波,超声波发送后延时一段时间后返回,防止余波被接收头接收误判,流程图如下:

图12 超声波发送子程序流程图

第 11 页 共 11 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

2)DS18B20温度采集程序

DS18B20的工作流程是,初始化ROM操作指令存储器操作指令数据传输。其工作时序包括:初始化时序、写时序和读时序。

图13 温度采集程序流程图 3)距离计算子程序

距离计算中,实行了温度补偿和角度补偿。流程图如下:

图14 距离计算子程序流程图

4)数据转换子程序

经过程序求出的数据原码无法直接用于显示,必须转换为LCD所接受

第 12 页 共 12 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

的BCD码的形式。

图15 数据转换子程序流程图

5) LCD显示子程序

LCD液晶显示程序分为液晶初始化、读忙、写指令和写数据操作,液

晶显示器是一块慢器件,所以在执行每条指令之前必须确定模块忙标志为低电平(不忙),否侧此指令无效。液晶显示子程序流程图如下:

图16 LCD显示子程序

第 13 页 共 13 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

在程序中,我们将测量的各种结果存放到一个数组num[]中,然后通过这个数组的数据到预先存放字符的数组中去按num[]中的数据的顺序去读取出预存在numcode[]中的字符然后送到LCD中显示。

5、测试及结果 (1)温度测量的测试

1)测试方案

写一个温度测量和显示的程序,利用开发板上现有的的温度正确测量电路检测程序是否正确,如果可行在将程序导入设计电路中,检测电路是否有问题。

2) 测试装置

+5恒流源 YYE_mini51单片机开发板 3)测试结果

通过测试,温度程序没问题。但将程序用于实际焊接的电路中,却不出现正确的结果,通过反复检查,发现电路有问题,之后就改电路,并且能够正确测量。

(2)LCD显示测试 1)测试方案

利用单片机开发板简单导入显示字符的程序,检测LCD是否完好,有导入实际焊接电路,测试LCD电路及程序是否正确。

2)测试装置

+5恒流源 LCD1602 YYE_mini51单片机开发板 3)测试结果

通过测试,发现LCD完好,但LCD显示电路却有问题,由于LCD VEE端接的是固定阻值为10KΩ电阻,致使LCD对比度过高,无法显示,所以,又将电路重新焊接,换掉了电阻,使用了一个20KΩ的电位器,调节电位器,是LCD正常显示,此时接入电路的阻值为3.3KΩ。

(3)超声波发接收程序及电路的测试

1)测试方案

利用超声波模块接入电路,并导入程序实际焊接电路中,检测程序是否正确,如果程序正确,去掉模块,使用实际焊接的电路,检测电路是否有问题。 2)测试装置

+5恒流源 YYE_mini51单片机开发板 HC-SR04超声波模块

第 14 页 共 14 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

3)测试结果

通过测试利用模块测试,发现程序有点问题,程序进入不了中断,于是通过查阅资料和找学长,解决了这个问题,用在实际焊接电路中,发现电路没问题。

6、总结及体会

总结:根据设计方案,顺利完成设计的基本功能,各个电路的功能完整,性能良好。由于发射电路的驱动能力较差,导致超声波测试的距离较短,此电路有待改进,改进方案,加入放大电路,提高驱动电压。

设计体会:通过此次设计,更好的掌握了单片机、LCD、温度传感器的使用及编程。了解了超声波的测距原理及超声波探头的使用。

第 15 页 共 15 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

附录 源程序

#include #include #include \"DS18B20.h\" #include \"math.h\"

sbit RX = P2^6; sbit TX = P2^5;

sbit LCM_RW = P2^1; //定义LCD引脚 sbit LCM_RS = P2^0; sbit LCM_E = P2^2;

sbit BUZZER=P3^7;

sbit key = P1^0;

#define LCM_Data P0

extern unsigned char TempBuffer[5]; // 存放温度的各个位的值 extern int temp_value; //温度值

#define Busy 0x80 //用于检测LCM状态字中的Busy标识 uchar inter_count = 0;

第 16 页 共 16 页

//器件配置文件

天津工业大学 电子与信息工程学院 创兴杯设计报告

void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void Decode(unsigned char ScanCode); void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void);

//unsigned char code mcustudio[] ={\"mcustudio.com.cn\//unsigned char code email[] = {\"fhwxaoo@163.com \unsigned char code Cls[] = {\" \

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针 unsigned long time=0; //写数据

unsigned long S=0; bit flag =0;

unsigned char disbuff[4] ={ 0,0,0,0,};

第 17 页 共 17 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

void WriteDataLCM(unsigned char WDLCM) { } //写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 { } //读数据

unsigned char ReadDataLCM(void)

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1;

ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1;

第 18 页 共 18 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

{ } //读状态

unsigned char ReadStatusLCM(void) { }

void LCMInit(void) //LCM初始化 {

LCM_Data = 0; LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data);

第 19 页 共 19 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0c,1); // 显示开及光标设置

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { }

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码

WriteCommandLCM(X, 1); //发命令字 WriteDataLCM(DData); //发数据

第 20 页 共 20 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

ListLength = 0; }

//5ms延时

void Delay5Ms(void) { }

unsigned int TempCyc = 5552; while(TempCyc--); Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x19) //若到达字串尾则退出

{ }

if (X <= 0xF) //X坐标应小于0xF

{ }

DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++;

unsigned char ListLength;

第 21 页 共 21 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

//400ms延时

void Delay400Ms(void) { }

/********************************************************/ void Conut(void)

{ float c;

time=TH0*256+TL0 + (inter_count << 16); inter_count = 0; TH0=0; TL0=0;

if(temp_value<0x8000) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--)

{ };

TempCycB=7269; while(TempCycB--);

// c=331.4+0.61*temp_value*0.0625;

c=331.4+0.61*temp_value;

//温度为负

else

//c=331.4-0.61*temp_value*0.0625;

第 22 页 共 22 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

c=331.4-0.61*temp_value;

S=(time*c)/20000; //算出来是CM S = S*S; S = S-0.798; S = sqrt(S);

if(flag==1) //超出测量范围显示“-” { flag=0;

DisplayOneChar(5, 1, '_'); DisplayOneChar(6, 1, ASCII[11]);

DisplayOneChar(7, 1, ASCII[10]); //显示点 DisplayOneChar(8, 1, ASCII[11]); DisplayOneChar(9, 1, ASCII[11]);

DisplayOneChar(10, 1, ASCII[12]); //显示M } else {

disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; DisplayOneChar(5, 1, S/1000 + 0x30); DisplayOneChar(6, 1, ASCII[disbuff[0]]); DisplayOneChar(7, 1, ASCII[10]); //显示点 DisplayOneChar(8, 1, ASCII[disbuff[1]]);

第 23 页 共 23 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

DisplayOneChar(9, 1, ASCII[disbuff[2]]); DisplayOneChar(10, 1, ASCII[12]); //显示M } }

/********************************************************/ void zd0() interrupt 1 {

inter_count++;

if(inter_count>=100)

flag=1;

//中断溢出标志

//T0中断用来计数器溢出,超过测距范围

}

/********************************************************/ void StartModule() {

TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

//启动一次模块

//启动模块

第 24 页 共 24 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;

/********************************************************/ void delayms(unsigned int ms) {

unsigned char i=100,j; for(;ms;ms--) { }

while(--i) { }

j=10; while(--j);

第 25 页 共 25 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

void beep(unsigned int bp) {

unsigned char i, j;

for (i=0;i<250;i++)

{ }

void distance_disp() { }

void Temperature_Disp() {

ReadTemp();

WriteCommandLCM(0xc0,0); WriteDataLCM('D'); WriteDataLCM('i'); WriteDataLCM('s'); WriteDataLCM('t'); WriteDataLCM(':');

BUZZER=!BUZZER; //BEEP取反 for(j=0;jBUZZER=0; //关闭蜂鸣器

//一个CPU周期

第 26 页 共 26 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

temp_to_str();

WriteCommandLCM(0x80,0); WriteDataLCM('T'); WriteDataLCM('e'); WriteDataLCM('m'); WriteDataLCM('p'); WriteDataLCM(':');

WriteDataLCM(TempBuffer[0]); WriteDataLCM(TempBuffer[1]); WriteDataLCM(TempBuffer[2]); WriteDataLCM(TempBuffer[3]); WriteDataLCM(TempBuffer[4]);

/*********************************************************/ void main(void) {

bit flag = 0;

Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化 Init_DS18B20(); TMOD=0x01; TH0=0;

TL0=0;

ET0=1; //允许T0中断 EA=1;

//开启总中断

//设T0为方式1,GATE=1;

第 27 页 共 27 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

while(!key) { }

while(!key); flag = 1; BUZZER=0; distance_disp(); while(flag) { }

Temperature_Disp(); StartModule();

// DisplayOneChar(0, 1, ASCII[0]); while(!RX); TR0=1; while(RX); TR0=0; Conut();

//当RX为零时等待 //开启计数

//当RX为1计数并等待 //关闭计数

//计算 //80MS

delayms(80);

第 28 页 共 28 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

/********************************************************** DS18B20 DRIVER

File Name: DS18B20.H

**********************************************************/ #ifndef DS18B20_H_2009_6_28 #define DS18B20_H_2009_6_28

#define uint unsigned int #define uchar unsigned char

sbit DQ = P3^5; //温度传送数据IO口 int temp_value; //温度值 int temp_dot;

unsigned char TempBuffer[5]; // 存放温度的各个位的值

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i) { }

/**********ds18b20初始化函数**********************/

while(i--);

第 29 页 共 29 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

void Init_DS18B20(void) { }

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void) {

uchar i=0; uchar dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ) unsigned char x=0;

DQ = 1; //DQ复位 delay_18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);

第 30 页 共 30 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

}

dat|=0x80; delay_18B20(4);

return(dat);

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat) {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1;

} }

/**************读取ds18b20当前温度************/

void ReadTemp(void) {

第 31 页 共 31 页

天津工业大学 电子与信息工程学院 创兴杯设计报告

unsigned char a=0; unsigned char b=0; unsigned char t=0; float float_value; unsigned int int_value;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) delay_18B20(100);

a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位

temp_dot = (a & 0x0f); temp_value=b<<4; temp_value+=(a&0xf0)>>4; float_value = (a&0x0f)/16.0;

int_value = (unsigned int)(float_value*10000);

第 32 页 共 32 页

前两个就是温度

天津工业大学 电子与信息工程学院 创兴杯设计报告

}

TempBuffer[3]=int_value/1000 + 0x30;

void temp_to_str() //温度数据转换成液晶字符显示 {

int dot; float temp_d;

temp_d = temp_dot / 16; dot = (int)(temp_d * 10000);

TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value%10+'0'; //个位 TempBuffer[2]='.'; TempBuffer[4]='C'; } #endif

第 33 页 共 33 页

因篇幅问题不能全部显示,请点此查看更多更全内容