简易数字式温度计的设计
毕业设计(论文)-基于at89c51单片机的简易数字温度计的设计[管理资料]
![毕业设计(论文)-基于at89c51单片机的简易数字温度计的设计[管理资料]](https://img.taocdn.com/s3/m/0e7fceff76c66137ef061979.png)
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
A
与MCS-51兼容;
4K字节可编程闪烁存储器;
寿命:1000写/擦循环;
数据保留时间:10年;
全静态工作:0Hz-24MHz;
三级程序存储器锁定;
128×8位内部RAM;
32可编程I/O线;
两个16位定时器/计数器;
5个中断源。
A
其引脚排列如图3-1所示:
各引脚功能简单介绍如下:
VCC:供电电压。
[Key words]digital thermometer; DS18B20; AT89C51;alarm.
现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
基于单片机的简易数字温度计的设计

基于单片机的简易数字温度计的设计张逊摘要本文介绍了一种基于单片机的简易数字温度计的设计。
该设计主要由三个模块组成:温度采集模块,数据处理模块及显示模块。
温度采集主要由温度传感器DS18B20来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片STC89C52RC来完成,其负责把DS18B20传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着芯片DS18B20相互通讯。
该系统的数字温度计电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
此数字温度计可以测量得温度范围—55~+125℃并通过一个四位一体的7段数码管显示出来。
关键词单片机;数字温度计;温度传感器;STC89C52RC;DS18B20Based on single chip simple digitalthermometer designZhangXunAbstract This paper introduces a kind of based on single chip simple digital thermometer design. This design mainly consists of three modules: temperature acquisition module, data processing module and display module. Temperature acquisition is mainly composed of temperature sensor DS18B20 to complete, it is responsible for the collection of the analog conversion to the corresponding digital quantity in the transfer to the data processing module. Data processing by the chip STC89C52RC to complete, which is responsible for the DS18B20 transfer to the digital quantity in the course of data processing, produce the corresponding display code to display module display; In addition, it also control the chip DS18B20 mutual communication.The system of the digital thermometer circuit is simple, the element used less, low cost, and high measuring accuracy and reliability. The digital thermometer can measure temperature range - 55 ~ + 125 ℃and through a quaternity seven period of digital tube display.Keywords Single-chip microcontroller; Digital thermometer; Temperature sensor;AT89C51; DS18b20目录1 引言 (1)2 设计总体方案 (2)2.1设计要求 (3)2.2 设计思路 (4)2.3 设计方案 (5)3 硬件电路设计 (6)3.1 温度采集模块 (3)3.2 单片机系统 (9)3.3 复位电路和时钟电路 (16)3.4 数码管显示系统设计 (18)3.5 总体电路设计 (21)4 程序设计 (14)4.1 程序设计总方案 (23)4.2 系统子程序设计 (23)5面包电路的搭建 (25)5.1 硬件的调试 (25)5.2 显示结果分析 (18)6实物的制作 (19)结论 (37)参考文献 (38)附录程序代码 (22)致谢 (39)1 引言在环境的舒适度测量中,温度、湿度和空气质量是最基本的三个被测量,其中温度的测量最为经常。
数字简易温度计设计

目录引言 ------------------------------------------------------------------------------------ 1 设计目的-------------------------------------------------------------------------- 1 设计背景-------------------------------------------------------------------------- 1 1设计方案----------------------------------------------------------------------------- 21.1度计软件设计流程图 -------------------------------------------------------- 21.2元器件的选取:-------------------------------------------------------------- 21.3系统仿真图------------------------------------------------------------------- 2 2设计框图----------------------------------------------------------------------------- 32.1硬件电路框图:-------------------------------------------------------------- 32.2硬件电路概述:-------------------------------------------------------------- 32.3显示电路---------------------------------------------------------------------- 32.4温度传感器DS18B20 -------------------------------------------------------- 4 3软件设计----------------------------------------------------------------------------- 83.1主程序 ------------------------------------------------------------------------ 83.2读出温度子程序-------------------------------------------------------------- 93.3计算温度子程序 ------------------------------------------------------------ 103.4显示数据刷新子程序------------------------------------------------------- 103.51602的液晶显示程序设计 ------------------------------------------------- 103.6P ROTEUS程序设计 ---------------------------------------------------------- 11 4总结与体会 ------------------------------------------------------------------------- 12 参考文献------------------------------------------------------------------------------ 13 附录1 --------------------------------------------------------------------------------- 14 附录2 --------------------------------------------------------------------------------- 15 附录3 --------------------------------------------------------------------------------- 16引言设计目的本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机喜爱的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也进行一一介绍,该系统可以方便的是实现温度采集和显示。
简易数字温度计设计

课程设计任务书2015—2016学年第二学期专业:学号姓名:课程设计名称:电子技术课程设计设计题目:简易数字温度计的设计完成期限:自2016年6月13日至2016年6月26日共2周一、设计依据本课题要求利用电子技术相关知识设计出一个能够实现±0.1℃精度的数字温度计。
电路由温度采集电路、数字频率计电路和LED显示电路构成。
通过本课题练习,学生的综合知识应用能力、设计能力将有较大提高,对今后从事电子产品的研制、生产、经营维修等打下基础。
二、主要内容及要求主要内容:1、给出详细的总体设计方案;2、完成各部分具体功能电路设计,主要包括基于热敏电阻的温度信号采集电路、555振荡电路、频率计电路、LED显示电路设计;3、给出正确的电路图,仿真、调试验证各部分设计的正确性;4、整理设计成果,完成课程设计说明书的撰写。
要求所设计数字温度计的输出温度的范围-20~+45℃、误差范围±0.1℃,具体温度显示采用数码管实现。
三、途径和方法利用模拟电子技术和数字电子技术的相关知识设计一个数控温度计,可以先查阅相关资料(网上查找或参考相关书籍手册),明确课题的方向和目的,然后学习完成课题所需的理论知识,了解温度信号采集电路、555振荡电路、频率计电路、LED显示电路设计的工作原理;在理解的基础上确定设计电路方案,完成电路设计,画出原理图及PCB印制版图,通过仿真分析验证设计的正确性,最后提交课程设计说明书一份。
四、时间安排课题讲解:2小时阅读资料:10小时撰写设计说明书:12小时修订设计说明书:6小时五、主要参考资料[1]孙丽霞.数字电子技术[M].北京:高等教育出版社,2006:174-196.[2]杨素行.模拟电子技术基础简明教程[M].北京:高等教育出版社,2007:40-92.[3]高吉祥.全国大学生电子设计竞赛培训系列教程-基本技能训练与单元电路设计[M].北京:电子工业出版社,2007:24-57.[4]黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,2005.1:43-66.[5]彭介华.电子技术课程设计指导[M].北京:高等教育出版社,2002.12:37-228.[6]陈永甫.新编555集成电路应用800例[M].北京:电子工业出版,2000:80-130.[7]萧宝瑾.protel99SE操作指导与电路设计实例(第一版)[M].太原:太原理工大学,2004:198-230.[8]张义申,陆坤.电子设计技术[M].西安:电子科技大学出版,1996:48-62.指导教师(签字):教研室主任(签字):批准日期:年月日简易数字温度计的设计摘要温度在现实生活中起着相当重要的作用,在电子科技越来越发达的当今时代,工业生产中对温度的测量又有了更精确的要求。
简易数字温度计的方案设计书

目录引言 (3)1功能要求 (4)2系统方案论证与比较 (4)2.1数字温度计设计方案论证 (4)2.1.1方案一 (4)2.1.2方案二 (6)2.2方案二的总体设计框图 (7)3系统主要元器件的选择及介绍 (8)3.1 单片机的选用及功能介绍 (8)3.1.1单片机简介 (8)3.1.2单片机的产生与发展 (9)3.1.3单片机的应用 (10)3.1.4MCS-51单片机引脚及功能介绍 (11)3.2 温度传感器的选择 (13)3.2.1DS18B20 简单介绍 (14)3.2.2DS18B20 的性能特点和使用中的注意事项 (14)3.2.3DS18B20的引脚及内部结构 (16)3.2.4 DS18B20 的工作原理 (25)3.2.5DS18B20的单线协议和命令 (26)3.2.6温度数据的计算处理方法 (29)4系统硬件电路的设计 (32)4.1主板电路 (32)4.2显示电路 (32)4.3DS18B20温度传感器与单片机的接口电路 (33)5系统软件算法分析 (34)5.1主程序 (34)5.2读出温度子程序 (35)5.3温度转换命令子程序 (36)5.4计算温度子程序 (37)5.5显示数据刷新子程序 (38)6调试及性能分析 (39)结论 (40)致谢 (41)参考文献 (42)附录 (43)附录一原理图 (44)附录二控制源程序清单 (48)基于单片机的数字温度计的设计指导教师:宗文军2006级机电专业学号 20060279 姓名胡雄飞摘要随着时代的进步和发展,人类不断的需求,科技不断的进步。
温度计所给人类带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高。
由于老式温度计的精确度低,测量范围小,无法满足现代化生活:工业、教案、科研、旅游等等各个领域的需求。
随着集成电路技术的发展,单片微型计算机的功能也不断增强,由于单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,它属于多功能温度计。
数字温度计设计课程设计范本

数字温度计设计课程设计范本
设计题目:数字温度计设计
设计目的:通过设计数字温度计,学习数字电路设计基础知识,掌握数字温度计的设计方法和实现过程。
设计要求:
1.温度测量范围:-40℃ ~ 120℃;
2.温度分辨率:0.1℃;
3.显示方式:7段LED数码管显示,至少显示4位数字,其中小
数点占据一位;
4.温度传感器:使用DS18B20数字温度传感器;
5.显示方式:采用共阴极数码管,使用74HC595锁存器进行驱动,
使用AT89C51单片机进行控制;
6.设计过程:包括硬件设计和软件设计两个部分,其中硬件设计
包括电路原理图设计和PCB板设计,软件设计包括单片机程序
设计和烧录。
设计步骤:
1.硬件设计
1)根据DS18B20数字温度传感器的特性,设计传感器电路,包括电源电路和传感器接口电路。
2)根据温度范围和分辨率要求,设计ADC电路,将传感器输出的模拟信号转换为数字信号。
3)设计数码管驱动电路,使用74HC595锁存器进行驱动。
4)设计单片机接口电路,将数字信号传输到单片机,实现温度数据的处理和显示。
5)根据硬件设计结果,绘制电路原理图和PCB板图。
2.软件设计
1)根据硬件设计结果,编写单片机程序,实现温度数据的读取、处理和显示。
2)使用Keil C51软件进行编程和调试。
3)将程序烧录到单片机中。
4)进行系统测试和调试,确保数字温度计的正常工作。
设计结果:
1.电路原理图和PCB板图。
2.单片机程序。
3.数字温度计实物。
简易数字温度计的设计

简易数字温度计的设计摘要温度是我们日常生产和生活中实时在接触到的物理量,但是它是看不到的,仅凭感觉只能感觉到大概的温度值,传统的指针式的温度计虽然能指示温度,但是精度低,使用不够方便,显示不够直观,数字温度计的出现可以让人们直观的了解自己想知道的温度到底是多少度。
数字温度计采用进口高精度、低温漂、超低功耗集成电路和液晶显示器,是一种精度高、稳定性好、适用性极强的新型现场温度显示仪。
是传统温度计的理想替代产品,数字温度计采用进口芯片组装精度高、高稳定性,误差小,内电源、微功耗、不锈钢外壳,防护坚固,美观精致。
数字温度计采用温度敏感元件也就是温度传感器(如铂电阻,半导体,热敏电阻等),将温度的变化转换成电信号的变化。
本设计主要使用温度采集电路,数字频率计电路和LED显示电路构成,从而实现温度的检测和显示。
关键词:74LS161N,NE555,计数器,译码器((关键词在摘要中找3~5个目录1绪论 (1)1.1 课题描述 (1)1.2 基本工作原理 (1)2 相关芯片及硬件电路设计 (2)2.1 555定时器 (2)2.2热敏电阻 (3)2.3 74LS161N芯片 (3)2.4主要电路的电路图及原理 (4)2.4.1 单稳态振荡电路 (4)2.4.2温度转换为频率电路 (5)2.4.3译码显示电路 (7)2.5总体电路图 (8)总结 (10)致谢 (11)参考文献 (12)1 绪论1.1 课题描述随着人们生活水平的不断提高和电子技术的发展,人们的生活都向着数字化,智能化发展。
,当今社会温度检测系统被广泛的社会生产,生活的各个领域。
在工业,环境监测,医疗,家庭等多方面都有应用。
因此要求也越来越高,数字温度计就是一个简单的例子。
随着温度检测理论与技术的不断更新,温度传感器的种类也越来越多,每种传感器根据其自身特性,都有它自己的应用领域。
本设计所介绍的数字温度计与传统的温度计相比,其输出的温度由数字显示,具有读数方便,测温范围广,测温准确,使用范围广,主要用于测温比较准确的场所,或科研实验室使用,可广泛用于需要温度控制的地方。
简易数字温度计的设计

下面是我本次课程设计的内容,报告还没有写,暂时上传仿真和程序啦!!简易数字温度计的设计利用数字温度传感器与单片机结合来测量温度。
利用数字温度传感器测量温度信号,计算后在LED数码管上显示相应的温度值。
要求数字温度计所测量的温度采用数字显示,控制器采用单片机,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示。
图一仿真时,数码管会出现闪烁,修改程序没有作用。
猜测是软件问题,换用图二数码管,正常程序仿真通过,下面是程序:#include "reg52.h"#define uint unsigned int#define uchar unsigned charuchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84,0xff};//0-9,正值uchar Tem[3]={0}; //存储温度uchar tempL,tempH;uchar Neg; //负值标志sbit DQ = P2^3; //DS18B20数据口unsigned int temp;void Delay_50ms(unsigned int t);void Delay(uint t);void Reset(void);void WriteByte(uchar dat);uint ReadByte(void);uint ReadTemp(void);void Display(void);/********************************************************************延时50ms,精确***********************************************************************/void Delay_50ms(unsigned int t){unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}/********************************************************************延时函数约位10us***********************************************************************/void Delay(unsigned int i){while(i--);}/********************************************************************定时器初始化***********************************************************************/void timer_init(void){TMOD = 0x01; //定时器0工作在模式1,16Bit定时器模式TH0 = (65536-50000) / 256;TL0 = (65536-50000) % 256;TR0 =1; //开定时器ET0 =1;//开启定时器和中断}/********************************DS18B20复位函数********************************/void Reset(void){DQ=1; //DQ先置高Delay(4); //延时sec=0.00047400DQ=0; //发送复位脉冲 sec=0.00052600Delay(60); //精确延时大于480us sec=0.00052700DQ=1; //拉高数据线 sec=0.00108300Delay(30); //等待(15~60us)这里是等待DS18B20做出回应,如果回应DQ将变低,//MCU是在DQ拉高后开始监视DQ的值的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分数:单片机技能+电子初级工程师认证培训设计报告题目:简易数字式温度计的设计指导老师:文丽完成时间: 2012-5-15华南理工大学广州学院电子信息工程学院目录1 引言2方案设计3 系统的硬件设计4 proteus 仿真图5 系统的软件设计6 心理体会7 参考文献1 引言在当下,人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。
社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。
2方案设计本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:●利用温度传感器(DS18B20)测量某一环境温度●测量范围为-55℃~+127℃,精度为±0.5℃●如果测量范围超过+127℃或低于-55℃蜂鸣器就会自动进行报警●用液晶显示器LCD进行实际温度值显示采用AT89S52单片机P3.5口控制温度传感器DS18B20的温度测量,以液晶显示器LCD形式输出测量温度。
图2.1原理图3 系统的硬件设计3.1 主控制器AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:3.2 温度传感器工作原理DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:•独特的单线接口仅需一个端口引脚进行通讯•简单的多点分布应用•无需外部器件•可通过数据线供电•零待机功耗•测温范围-55~+125℃,以0.5℃递增。
华氏器件-67~+2570F,以0.90F 递增•温度以9 位数字量读出•温度数字量转换时间200ms(典型值)•用户可定义的非易失性温度报警设置•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件3.3 温度传感器接口电路4 proteus 仿真图4.1 仿真图利用proteus按电路图排放元器件以及连接线路,用keil C51将写好的C语言进行仿真,获得的仿真图如下所示:图4.1电路仿真图4.2 仿真程序//DS18B20温度检测及其液晶显示#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#include<stdio.h>#define uint unsigned int //宏定义unsigned int为 uint,为了使程序更简洁与出现少错误。
以下uchar同#define uchar unsigned charuchar code digit[11]={"0123456789-"}; //定义字符数组显示数字unsigned char code Str[]={"MAX:"}; //说明显示的是温度unsigned char code Ostr[]={"MIN:"};uchar code str1[]={"Welcome To Use"}; //开机启动时的说明文字uchar code str2[]={"My Work 2012"}; //开机说明文字uchar code Error[]={" DS18B20 ERROR"}; //说明没有检测到DS18B20uchar code Error1[]={" PLEASE CHECK"}; //说明没有检测到DS18B20uchar code Temp[]={"TEMP:"}; //说明显示的是温度uchar code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //温度单位uchar flag,tltemp; //负温度标志和临时暂存变量/******************************************************************************* 以下是对液晶模块的操作程序*******************************************************************************/ sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){uchar i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(uint n){uint i;for(i=0;i<n;i++)delay1ms();}/***********************************************************以下是对蜂鸣器的定义和操作************************************************************/sbit beep=P3^6;void delay500us(){uchar i,j;for(i=0;i<2;i++)for(j=0;j<33;j++);}void BEEP( ){uint i;for(i=0;i<1000;i++){beep=0;delay500us();beep=1;delay500us();}beep=1;delaynms(1000);}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0; //将E恢复低电平return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void WriteInstruction (uchar dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据书上表7.7,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/void WriteAddress(uchar x){WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void WriteData(uchar y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据书上表7.7,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); //延时5ms ,给硬件一点反应时间WriteInstruction(0x38);delaynms(5); //延时5ms ,给硬件一点反应时间WriteInstruction(0x38); //连续三次,确保初始化成功delaynms(5); //延时5ms ,给硬件一点反应时间WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delaynms(5); //延时5ms ,给硬件一点反应时间WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5); //延时5ms ,给硬件一点反应时间WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delaynms(5); //延时5ms ,给硬件一点反应时间}/************************************************************************以下是DS18B20的操作程序************************************************************************/sbit DQ=P3^2;uchar time; //设置全局变量,专门用于严格延时/*****************************************************函数功能:将DS18B20传感器初始化,读取应答信号出口参数:flag***************************************************/bit Init_DS18B20(void){bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; //先将数据线拉高for(time=0;time<2;time++) //略微延时约6微秒;DQ = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲DQ = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕;return (flag); //返回检测成功标志}/*****************************************************函数功能:从DS18B20读取一个字节数据出口参数:dat***************************************************/uchar ReadOneChar(void){uchar i=0;uchar dat; //储存读出的一个字节数据for (i=0;i<8;i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(DQ==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 }return(dat); //返回读出的十六进制数据}/*****************************************************函数功能:向DS18B20写入一个字节数据入口参数:dat***************************************************/WriteOneChar(uchar dat){uchar i=0;for (i=0; i<8; i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ=0; //将数据线从高拉低时即启动写时序DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样DQ=1; //释放数据线for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间}/*****************************************************函数功能:做好读温度的准备***************************************************/void ReadyReadTemp(void){Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delaynms(200); //转换一次需要延时一段时间Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}/****************************************************************************** 以下是与温度有关的显示设置******************************************************************************/ /*****************************************************函数功能:显示没有检测到DS18B20***************************************************/void display_error(void){uchar i;WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Error[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Error[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}WriteAddress(0x40); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Error1[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Error1[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}while(1) //进入死循环,等待查明原因;}/*****************************************************函数功能:显示温度符号***************************************************/void display_symbol(void){uchar i;WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示i = 0; //从第一个字符开始显示while(Temp[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Temp[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}/*****************************************************函数功能:显示温度的小数点***************************************************/void display_dot(void){WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示WriteData('.'); //将小数点的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度的单位(℃)***************************************************/void display_cent(void){uchar j;WriteInstruction(0x40); //设定CGRAM地址delaynms(5);for(j=0;j<8;j++ ){WriteData(User[j]);//写入自定义图形℃}WriteAddress(0x4b);//设定屏幕上的显示位置delaynms(5);WriteData(0x00); //从CGRAM里取出自定义图形显示}/*****************************************************函数功能:显示温度的整数部分入口参数:x***************************************************/void display_temp1(uchar x){uchar j,k,l; //j,k,l分别储存温度的百位、十位和个位j=x/100; //取百位k=(x%100)/10; //取十位l=x%100%10; //取个位WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示if(flag==1) //负温度时显示“—”{WriteData(digit[10]); //将百位数字的字符常量写入LCD}else{WriteData(digit[j]); //将十位数字的字符常量写入LCD}WriteData(digit[k]); //将十位数字的字符常量写入LCDWriteData(digit[l]); //将个位数字的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度的小数数部分入口参数:x***************************************************/void display_temp2(unsigned char x){WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/uchar keyscan(void ){uchar temp;P1=0xff;P1=0xf0;temp=P1;if(temp!=0xf0){delaynms(10);if(temp!=0xf0){P1=0xfe;temp=P1;switch(temp){case(0xee):return 1;break;case(0xde):return 2;break;case(0xbe):return 3;break;case(0x7e):return 5;break;}}}}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(uchar x,uchar y,uchar *s){if (y == 0){WriteInstruction(0x80 + x); //表示第一行}else{WriteInstruction(0xC0 + x); //表示第二行}while (*s){WriteData(*s);s ++;}}/***************************************************** 函数功能:主函数***************************************************/ void main(void){uchar num,tem;char displaytemp[7],displaytem[7];int tempH=50,tempL=1;uchar i,j;uchar TL; //储存暂存器的温度低位uchar TH; //储存暂存器的温度高位uchar TN; //储存温度的整数部分uchar TD; //储存温度的小数部分LcdInitiate(); //将液晶初始化delaynms(5); //延时5ms给硬件一点反应时间WriteAddress(0x02);i=0;while(str1[i]!='\0'){WriteData(str1[i]);i++;delaynms(100);}WriteAddress(0x40);j=0;while(str2[j]!='\0'){WriteData(str2[j]);j++;delaynms(100);}delaynms(3000);WriteInstruction(0x01);delaynms(5);if(Init_DS18B20()==1)display_error();display_symbol(); //显示温度说明display_dot(); //显示温度的小数点display_cent(); //显示温度的单位while(1) //不断检测并显示温度{beep=0;flag=0;ReadyReadTemp(); //读温度准备TL=ReadOneChar(); //先读的是温度值低位TH=ReadOneChar(); //接着读的是温度值高位if((TH&0xf8)!=0x00)//判断高五位得到温度正负标志{flag=1;TL=~TL; //取反TH=~TH; //取反tltemp=TL+1; //低位加1TL=tltemp;if(tltemp>255) TH++; //如果低8位大于255,向高8位进1TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了 TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,}TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,//这样得到的是温度小数部分的第一位数字(保留1位小数) display_temp1(TN); //显示温度的整数部分display_temp2(TD); //显示温度的小数部分delaynms(10);num=keyscan();switch(num){case 1:if(tempH<127)tempH++;break;case 2:if(tempH>-55)tempH--;break;case 3:if(tempL<127)tempL++;break;case 5:if(tempL>-55)tempL--;break;default:break;}sprintf(displaytemp,"MAX:%3d",tempH);LCD_Write_String(0x00,0,displaytemp);sprintf(displaytem,"MIN:%3d",tempL);LCD_Write_String(0x09,0,displaytem);tem=TN+(TD*0.1);if(tem>tempH){BEEP();}else if(tem<tempL){BEEP( );}}}5 系统的软件设计系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序5.1 主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。