基于单片机的温度报警器设计
- 格式:doc
- 大小:1.02 MB
- 文档页数:28
单⽚机⼩项⽬——基于51单⽚机的温度报警器单⽚机⼩项⽬介绍项⽬功能介绍编程语⾔:C语⾔。
开发环境:keil。
主要功能:1602屏显⽰时间和温度,当温度超过预定值时蜂鸣器⼯作报警。
此项⽬只是作为单⽚机初学者的⼀个⼩测验。
硬件资源分配1602屏——P0,P2^7,P2^5,P2^6。
串⼝——P2^0,P2^1。
传感器——DS18B20 P3^7;DS1302 P3^4,P3^5,P3^6。
蜂鸣器——P1^6。
LCD1602屏配置在h⽂件中声明端⼝和函数:#ifndef __LCD1602_H_#define __LCD1602_H_#include<reg52.h>//重定义关键字#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//定义端⼝#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;//函数声明void Lcd1602_Delay1ms(uint c); //延时函数void LcdWriteCom(uchar com); //写⼊命令void LcdWriteData(uchar dat); //写⼊数据void LcdInit(); //LCD初始化⼦程序#endif在LCD1602.c⽂件中写⼊时序和命令等函数代码:#include "LCD1602.h"/***************************延时函数**************************/void Lcd1602_Delay1ms(uint c) //误差 0us{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}}}/***************************底层函数**************************/void LcdWriteCom(uchar com) //写⼊命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写⼊LCD1602_DATAPINS = com; //放⼊命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E = 1; //写⼊时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}void LcdWriteData(uchar dat) //写⼊数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择输⼊数据LCD1602_RW = 0; //选择写⼊LCD1602_DATAPINS = dat; //写⼊数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写⼊时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}void LcdInit() //LCD初始化⼦程序{LcdWriteCom(0x38); //开显⽰LcdWriteCom(0x0c); //开显⽰不显⽰光标LcdWriteCom(0x06); //写⼀个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}在main.c⽂件中运⽤:(这⾥先让显⽰屏显⽰⾃定义的内容,稍后再做更改)#include "reg52.h"#include "LCD1602.h"unsigned char Disp[]=" Pechin Science ";void main(){unsigned char i=0;LcdInit();for(i=0;i<16;i++){LcdWriteData(Disp[i]);}while(1){}}DS18B20温度传感器配置(并将其与LCD协同使⽤)在DS18B20.c⽂件中写⼊相关函数:1 #include "DS18B20.h"234/***************************延时函数**************************/5void Delay1ms(unsigned int y)6 {7 unsigned int x;8for( ; y>0; y--)9 {10for(x=110; x>0; x--);11 }12 }131415/***************************底层函数**************************/1617 unsigned char Ds18b20Init() //初始化函数18 {19 unsigned char i;20 DSPORT = 0; //将总线拉低480us~960us21 i = 70;22while(i--); //延时642us23 DSPORT = 1; //然后拉⾼总线,如果DS18B20做出反应会将在15us~60us后总线拉低25while(DSPORT) //等待DS18B20拉低总线26 {27 Delay1ms(1);28 i++;29if(i>5) //等待>5MS30 {31return0; //初始化失败32 }3334 }35return1; //初始化成功36 }373839void Ds18b20WriteByte(unsigned char dat) //写⼊⼀个字节40 {41 unsigned int i, j;4243for(j=0; j<8; j++)44 {45 DSPORT = 0; //每写⼊⼀位数据之前先把总线拉低1us46 i++;47 DSPORT = dat & 0x01; //然后写⼊⼀个数据,从最低位开始48 i=6;49while(i--); //延时68us,持续时间最少60us50 DSPORT = 1; //然后释放总线,⾄少1us给总线恢复时间才能接着写⼊第⼆个数值51 dat >>= 1;52 }53 }545556 unsigned char Ds18b20ReadByte() //读取⼀个字节57 {58 unsigned char byte, bi;59 unsigned int i, j;60for(j=8; j>0; j--)61 {62 DSPORT = 0; //先将总线拉低1us63 i++;64 DSPORT = 1; //然后释放总线65 i++;66 i++; //延时6us等待数据稳定67 bi = DSPORT; //读取数据,从最低位开始读取68/*将byte左移⼀位,然后与上右移7位后的bi,注意移动之后移掉那位补0。
基于STC89C51单片机的温度控制报警系统设计摘要:本文基于STC89C51单片机设计了一种温度控制报警系统,通过温度传感器检测环境温度,并根据设定的温度范围控制风扇运转并发出报警信号,以实现室内温度自动控制。
本文介绍了系统硬件设计、软件设计以及测试实验,并通过实验数据验证了系统的可行性和稳定性。
关键词:STC89C51单片机;温度控制;报警系统;温度传感器一、引言随着科技的不断发展,自动化控制技术在各个领域得到广泛应用。
温度自动控制是其中的一个重要应用方向。
在家庭、工厂以及医院等场所,温度的合理控制对于人们的身体健康和环境的稳定运转都有着重要的影响。
因此,设计一种基于STC89C51单片机的温度控制报警系统具有重要的研究价值和应用前景。
二、系统设计2.1 系统功能本系统主要功能为:实时检测环境温度,根据设定的温度范围控制风扇运转,并发出报警信号以实现室内温度自动控制。
2.2 系统硬件设计本系统主要硬件设计包括:温度传感器模块、LED指示灯、蜂鸣器、风扇以及STC89C51单片机。
温度传感器模块采用DS18B20型号,通过单总线接口与单片机相连,用于检测室内温度。
LED指示灯用于显示系统状态,包括运行状态和报警状态。
蜂鸣器用于发出报警信号。
风扇用于控制系统温度,实现温度自动控制。
STC89C51单片机负责系统的数据采集、运算和控制。
2.3 系统软件设计本系统的软件设计分为两部分:系统初始化和主程序部分。
系统初始化包括:串口初始化、温度传感器初始化、LED指示灯初始化、蜂鸣器初始化、风扇初始化等,主要用于对系统各个硬件进行初始化设置。
主程序部分包括:温度采集、温度判断、风扇控制和报警控制等。
主要通过程序实现室内温度的采集和判断,并根据设定温度范围控制风扇和报警控制信号等。
三、实验结果在实际测试中,将系统置于模拟室内环境中进行测试,测试数据显示本系统能够实现温度自动控制,并在温度超出设定范围时发出报警信号。
基于单片机的温度报警系统报告温度报警系统是一种应用电子技术和单片机技术相结合的智能化设备,其主要功能是监测环境温度并在温度超过设定阈值时发出报警信号。
本报告将介绍基于单片机的温度报警系统的设计原理、硬件和软件实现以及系统的性能评估。
一、设计原理单片机温度报警系统的设计原理主要分为三个部分:传感器模块、控制模块和报警模块。
传感器模块用于检测环境温度,通常采用数字温度传感器,如LM35、控制模块使用单片机来读取传感器模块的温度值,并与预设的温度阈值进行比较。
如果温度超过阈值,控制模块将触发报警模块发出报警信号。
二、硬件实现1.单片机选择:常用的单片机有8051、PIC、AVR等。
根据实际需求选择性能适中的单片机。
2.传感器模块:采用数字温度传感器LM35,可提供线性的电压输出与温度变化之间的关系。
3.控制模块:通过单片机读取LM35的模拟输出电压,并通过AD转换将其转化为数字温度值。
然后与预设的温度阈值进行比较。
如果超过阈值,则触发报警。
4.报警模块:可选择蜂鸣器、LED灯等作为报警的输出设备。
三、软件实现1.初始化:设置单片机的各个引脚(输入或输出)、定时器、ADC等。
2.ADC转换:读取LM35的模拟输出电压并进行AD转换,将其转化为数字温度值。
3.温度比较:将读取到的温度值与预设的温度阈值进行比较。
4.报警触发:如果温度超过阈值,则触发报警,通过控制报警模块(如蜂鸣器或LED)输出报警信号。
5.延时处理:为了避免频繁的报警,可以设置一个延时处理时间,即在触发报警后,系统将进入一个延时状态。
四、系统性能评估1.精度:温度报警系统的精度主要依赖于传感器模块和ADC的精度。
2.响应时间:系统的响应时间取决于单片机的运行速度和各个模块的设计。
3.可靠性:系统的可靠性与硬件和软件的稳定性相关,如单片机的抗干扰性、温度传感器的稳定性等。
4.扩展性:系统的可扩展性决定了其在实际应用中的灵活性和适用范围。
综上所述,基于单片机的温度报警系统设计原理清晰,硬件和软件实现相对简单,能够实现对环境温度的准确监测和报警功能。
一、摘要我们介绍的是一种基于单片机控制的数字温度报警,本温度系统具有多功能性,即可以当数字温度计使用,显示当前环境温度,又可以作为报警器使用,设置报警温度,当温度不在设置范围内时,可以报警,并采取措施使温度下降。
该温度报警系统控制器使用单片机AT89C51,测温传感器使DS18B20,用2位共阳极LED数码管,实现温度显示,能准确达到以上要求。
二、设计方案1、方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
2、方案二进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
温度报警系统电路设计总体设计方框图如图1所示1、单片机主板电路单片机AT89C51具有低电压供电和体积小等特点,该模块包括中央处理CPU -AT89C51、时钟电路及复位电路;图2复位电路图3 时钟电路2、DS18B20温度传感器与单片机的接口电路DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
该电路完成了信号的采集、转换和传输。
图43、上下限报警调整电路分别调整温度的上下限报警设置,有“+“、”“-”、“确定”等键图5上下限报警调整电路4、温度显示电路显示当前测得的温度,数码管采用74LS247驱动图6温度显示电路5、报警电路当环境温度超过设定温度时,蜂鸣器鸣叫,红灯点亮,发生报警;当人员发现警报时,可按图8中的按钮,暂时中断蜂鸣器的鸣叫。
《单片机原理及应用》课程设计任务书二级学院:电子信息与电气工程学院专业:班级:课程设计题目:基于单片机的数字温度报警器的设计姓名:学院:专业:班级:学号:指导教师:2011年9月15日目录摘要 (4)1 引言 (4)1.1课题背景 (4)1.2研究内容和意义 (6)2 芯片介绍 (6)2.1 DS18B20概述 (6)2.1.1 DS18B20封装形式及引脚功能 (7)2.1.2 DS18B20内部结构 (7)2.1.3 DS18B20供电方式 (9)2.1.4 DS18B20的测温原理 (10)2.1.5 DS18B20的ROM命令 (12)2.2 AT89C52概述 (13)2.2.1单片机AT89C52介绍 (13)2.2.2功能特性概述 (13)3 系统硬件设计 (14)3.1 单片机最小系统的设计 (14)3.2 温度采集电路的设计 (15)3.3 LED显示报警电路的设计 (16)4 总结 (16)致谢 (17)参考文献 (18)附录A 总电路图 (19)附录B 原器件清单 (19)附录C 温度报警器部分程序 (20)摘要随着时代的进步和发展,温度的测试已经影响到我们的生活、工作、科研、各个领域,已经成为了一种非常重要的事情,因此设计一个温度测试的系统势在必行。
本文主要介绍了一个基于AT89C52单片机的数字温度报警器系统。
详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。
DS18B20与AT89C52结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
基于单片机温度报警器的设计温度报警器是一种常见的安全设备,用于监测环境温度并在温度超过设定阈值时发出警报。
基于单片机的温度报警器可以实现温度监测、报警和数据记录等功能,具有灵敏度高、可靠性好、成本低等优点。
下面将描述一种基于单片机的温度报警器的设计。
设计思路:本设计采用温度传感器、单片机、蜂鸣器和LCD液晶显示器等组成,实现温度监测和报警功能。
温度传感器用于测量环境温度,将温度值传输给单片机进行处理;单片机负责对温度值进行比较和判断,当温度超过设定阈值时,通过控制蜂鸣器发出警报声,并在LCD显示器上显示温度值和警报信息。
硬件设计:1.温度传感器:可以选择数字温度传感器,如DS18B20。
将温度传感器连接到单片机的数字引脚上,通过引脚读取传感器输出的数字信号。
2.单片机:可以选择常见的8位单片机,如STC89C52、单片机具有较强的处理能力和丰富的IO资源,可以用于读取和处理温度传感器数据,并控制蜂鸣器和LCD显示器。
3.蜂鸣器:选择合适的蜂鸣器,并将其连接到单片机的IO引脚上。
当温度超过设定阈值时,单片机将IO引脚置高,使蜂鸣器发出警报声。
4.LCD液晶显示器:选择适配器单片机的LCD显示器,通过单片机的IO引脚与单片机连接。
当温度超过设定阈值时,将警报信息显示在LCD上。
软件设计:1.硬件初始化:设置单片机相关IO引脚为输入输出模式,初始化温度传感器和LCD显示器。
2.温度采集:通过单片机的数字引脚读取温度传感器输出的数字信号,并进行相应的数据转换,得到环境温度值。
3.温度监测:将环境温度值与设定的阈值进行比较,若温度超过阈值则触发报警。
4.报警处理:当温度超过设定阈值时,通过设置单片机的IO引脚,控制蜂鸣器发出警报声,并在LCD显示器上显示警报信息。
5.数据记录:可以选择将温度数据保存到EEPROM中,方便后续查询和分析。
总结:基于单片机的温度报警器是一种简单但实用的安全设备,通过温度传感器和单片机的配合,可以实现对环境温度的实时监测和报警功能。
天津滨海职业学院全日制高等职业教育毕业实践环节毕业设计(典型性项目)说明书基于单片机的温度报警器设计(方案)作者:李佳璐院系:天津滨海职业学院机电工程系专业:电子信息工程技术年级:2012级学号:20120012113指导教师:×××时间:2015年4月主要内容简介在农业生产中,温室的温度很难把握。
往往超过或低于允许值,致使大批良种的报废,耽误农时,影响生产。
这就需要设计一个温度报警器,在环境温度超过一定范围时报警,来提醒使用者。
基于以上背景设计基于单片机的温度报警器。
本设计采用ATMEL公司的ATmega16单片机为硬件核心系统,添加数码管、按键和温度传感器芯片,组成完整的硬件系统。
采用C语言为编程语言,进行系统的软件系统开发。
通过本系统硬件、软件部分设计完成如下目标:1、完成系统的硬件部分设计,硬件部分包括电源、显示、按键、温度接口、报警触发等部分设计。
在此基础上保证软件功能实现。
2、温度报警器可以通过按键方便设定报警范围。
3、温度报警器通过数码管显示实时显示测量的环境温度。
当环境温度温度超出设定范围时,启动报警。
本设计硬件制作方便,通过C语言程序实现软件设计,可移植性强,能够精准的对环境进行温度测量并显示,实用性强。
关键字:M16;18B20;温度控制;C语言目录一、绪论 (4)(一)研究背景与现状 (4)(二)设计内容及要求 (4)二、关键技术简介 (5)三、M16单片机概述 (6)(一)ATmega16 的主要性能 (6)(二)M16的基本组成及引脚 (6)(三)M16的引脚基本功能 (6)(四)外部晶体振荡器 (8)四、温度传感器18B20介绍 (8)(一)温度传感器18B20的特性 (8)(二)温度传感器18B20的基本组成,见下图4所示。
(9)(三)温度传感器18B20的测温操作 (10)五、硬件设计 (12)(一)硬件电路设计 (12)(二)电源和复位电路设计 (13)(三)输入、输出部分设计 (14)(四)驱动部分设计 (15)六、软件设计 (15)(一)显示部分设计 (15)(二)按键检测设计 (21)(三)1-wire 是一种通讯协议实现 (23)(四)软件总体设计 (27)一、绪论(一)研究背景与现状1.在农业生产中,温室的温度很难把握。
基于51单片机的温度报警器设计引言:温度报警器是一种用来检测环境温度并在温度超过设定阈值时发出警报的装置。
本文将基于51单片机设计一个简单的温度报警器,以帮助读者了解如何利用单片机进行温度监测和报警。
一、硬件设计硬件设计包括传感器选择、电路连接以及报警装置的设计。
1.传感器选择温度传感器的选择非常重要,它决定了监测温度的准确性和稳定性。
常见的温度传感器有热敏电阻(如NTC热敏电阻)、热电偶以及数字温度传感器(如DS18B20)。
在本设计中,我们选择使用DS18B20数字温度传感器,因为它具有高精度和数字输出的优点。
2.电路连接将DS18B20与51单片机连接,可以采用一根三线总线(VCC、GND、DATA)的方式。
具体连接方式如下:-将DS18B20的VCC引脚连接到单片机的VCC引脚(一般为5V);-将DS18B20的GND引脚连接到单片机的GND引脚;-将DS18B20的DATA引脚连接到单片机的任意IO引脚。
3.报警装置设计报警装置可以选择发出声音警报或者显示警报信息。
在本设计中,我们选择使用蜂鸣器发出声音警报。
将蜂鸣器的一个引脚连接到单片机的任意IO引脚,另一个引脚连接到单片机的GND引脚。
二、软件设计软件设计包括温度读取、温度比较和报警控制的实现。
1.温度读取通过51单片机的IO引脚和DS18B20进行通信,读取DS18B20传感器返回的温度数据。
读取温度数据的具体步骤可以参考DS18B20的通信协议和单片机的编程手册。
2.温度比较和报警控制将读取到的温度数据和设定的阈值进行比较,如果温度超过阈值,则触发报警控制。
可以通过控制蜂鸣器的IO引脚输出高电平或低电平来控制蜂鸣器是否发出声音警报。
三、工作原理整个温度报警器的工作原理如下:1.首先,单片机将发出启动信号,要求DS18B20开始温度转换。
2.单片机等待一段时间,等待DS18B20完成温度转换。
3.单片机向DS18B20发送读取信号,并接收DS18B20返回的温度数据。
基于51单片机温度报警器设计
以上
研究背景
随着电子技术的发展,温度报警器的应用已有很大的普及,它可以准确的检测温度,
并且控制环境温度,从而给生活带来很多实施便利性。
51单片机温度报警器的研究是一项极具挑战的任务,因为除了要考虑温度传感原理,还需要研究51单片机的软硬件结构。
本研究即以51单片机为主要研究环节,结合温度特性,设计一款简单实用的温度报警器。
研究方法
本研究使用51单片机,采用51系统软件编程,结合串口程序实现温度检测功能。
51
芯片单片机能够轻松实现温度采集、数据处理、报警控制功能,并且能够满足用户的一些
特定功能实现要求。
本研究还考虑了温度传感器、报警器等元件,并在实验过程中对报警
器进行了优化改进,保证数据测量和控制精度。
研究结果
通过实验,本研究设计出一款温度报警器,它采用51单片机,结合温度传感器和报
警器而成。
51单片机校准温度采集、数据处理计算,报警器可以根据用户自定义的告警值发出声光报警。
整个系统对温度的测量和报警控制能够达到用户的要求。
此外,该温度报
警器采用独立模块化设计,在现场控制时可以灵活配置参数,增加报警器的功能性。
通过本研究设计出一款51单片机温度报警器,能够准确地检测温度,当温度超出预
定值时,发出报警,实现环境温度的控制。
同时,本研究还研发出独立模块化的系统,可
以灵活的配置参数,显著提高其报警功能。
温度报警器1、作品介绍:我个人设计的温度报警器是基于51单片机开发的一种能时时检测温度,并且报警的器件,它采用AT89S52单片机、DS18B20、1602液晶显示器等电学元器件,通过编写程序和一定的算法,最终实现的功能是:开机后单片机自动运行一套程序,使DS18B20检测室内的温度,并通过一定的算法对数据采样处理,计算出室内的温度,通过1602液晶显示器显示出来,当室温超过设定的值时,单片机驱动峰鸣发出声音!2、器件介绍:a、A T89S52单片机:AT89S52是一种低功耗、高性能8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
b、DS18B20测温芯片:DS18B20数字温度传感器,采用DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: (1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
⏹(2 )测量温度范围宽,测量精度高DS18B20 的测量范围为-55 ℃~+ 125 ℃;在-10~+ 85°C 范围内,精度为±°C 。
⏹(3 )在使用中不需要任何外围元件。
⏹(4 )持多点组网功能多个DS18B20 可以并联在惟一的单线上,实现多点测温。
1、作品介绍:我个人设计的温度报警器是基于51单片机开发的一种能时时检测温度,并且报警的器件,它采用AT89S52单片机、DS18B20、1602液晶显示器等电学元器件,通过编写程序和一定的算法,最终实现的功能是:开机后单片机自动运行一套程序,使DS18B20检测室内的温度,并通过一定的算法对数据采样处理,计算出室内的温度,通过1602液晶显示器显示出来,当室温超过设定的值时,单片机驱动峰鸣发出声音!2、器件介绍:a、A T89S52单片机:AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
b、DS18B20测温芯片:DS18B20数字温度传感器,采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: (1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
⏹(2 )测量温度范围宽,测量精度高DS18B20 的测量范围为-55 ℃~+ 125 ℃;在-10~+ 85°C 范围内,精度为±0.5°C 。
⏹(3 )在使用中不需要任何外围元件。
⏹(4 )持多点组网功能多个DS18B20 可以并联在惟一的单线上,实现多点测温。
⏹(5 )供电方式灵活DS18B20 可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
⏹(6 )测量参数可配置DS18B20 的测量分辨率可通过程序设定9~12 位。
⏹(7 )负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
⏹(8 )掉电保护功能DS18B20 内部含有EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
⏹DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
DS18B20管脚排列:C、1602液晶:1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形(用自定义CGRAM,显示效果也不好)1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶图片:管脚功能:3、程序代码:#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件unsigned char code digit[11]={"zhaozhongmin"}; //定义字符数组显示数字unsigned char code Str[]={"1602-DS18B20"}; //说明显示的是温度unsigned char code Error[]={" DS18B20 ERROR"}; //说明没有检测到DS18B20unsigned char code Error1[]={" PLEASE CHECK"}; //说明没有检测到DS18B20unsigned char code Temp[]={"WENDU:"}; //说明显示的是温度unsigned char code Cent[]={"Cent"}; //温度单位unsigned char codeuser[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};unsigned char 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(){unsigned char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/ void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值: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 (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据表8-6,写指令时,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(unsigned char x){WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/ void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据表8-6,写指令时,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^3;unsigned char 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~960us for(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***************************************************/ unsigned char ReadOneChar(void){unsigned char i=0;unsigned char 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存入dat elsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}/*****************************************************函数功能:向DS18B20写入一个字节数据入口参数:dat***************************************************/ WriteOneChar(unsigned char dat){unsigned char 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){unsigned char 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_explain(void){unsigned char i;WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Str[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Str[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}}/*****************************************************函数功能:显示温度符号***************************************************/ void display_symbol(void){unsigned char 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给硬件一点反应时间}/*****************************************************函数功能:显示温度的单位(Cent)***************************************************/ void display_cent(void){unsigned char i;WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示for(i=0;i<8;i++)WriteData(user[i]);WriteAddress(0x4b);delaynms(5);WriteData(0x00);}/*****************************************************函数功能:显示温度的整数部分入口参数:x***************************************************/ void display_temp1(unsigned char x){unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位 j=x/100; //取百位k=(x%100)/10; //取十位l=x%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]); //将小数部分的第一位数字字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:主函数***************************************************/ void main(void){unsigned char TL; //储存暂存器的温度低位unsigned char TH; //储存暂存器的温度高位unsigned char TN; //储存温度的整数部分unsigned char TD; //储存温度的小数部分LcdInitiate(); //将液晶初始化delaynms(5); //延时5ms给硬件一点反应时间if(Init_DS18B20()==1)display_error();display_explain();display_symbol(); //显示温度说明display_dot(); //显示温度的小数点display_cent(); //显示温度的单位while(1) //不断检测并显示温度{ 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位进1 TN=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);}}4、应用:此作品的设计虽然是为了练习单片机的使用,但是它也有一定的使用价值,比如最简单的,可以把它放在室内,检测温度。