基于DS18B20的温度报警器设计讲解.docx
- 文档编号:24232268
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:24
- 大小:899.29KB
基于DS18B20的温度报警器设计讲解.docx
《基于DS18B20的温度报警器设计讲解.docx》由会员分享,可在线阅读,更多相关《基于DS18B20的温度报警器设计讲解.docx(24页珍藏版)》请在冰豆网上搜索。
基于DS18B20的温度报警器设计讲解
江苏信息职业技术学院
毕业设计论文
基于DS18B20的温度报警器设计
系电子信息工程系
专业电子信息工程技术姓名康志凌
班级电子信息122学号**********
指导教师徐敏N职称讲师
设计时间2014.10.08-2015.04.08
摘要
本设计以AT89C51单片机为核心,设计了一个温度测量报警系统,可以方便的实现温度采集和显示。
它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工农业中的温度测量及报警。
本设计由AT89C51单片机、DS18B20温度传感器和LED显示器组成,可以直观的显示测量的温度。
本设计运行过程中,如果外界温度低于-20℃或高于70℃,系统将出发蜂鸣器,产生报警声音,且对应的LED同步闪烁。
关键词:
AT89C51,DS18B20,传感器,温度报警器
第1章引言
温度是一个十分重要的物理量,对他的测量与控制有着十分重要的意义。
随着现代化工农业技术的发展及人民对生活环境要求的提高,人民也迫切需要监测和控制温度.在人类的生活环境中,温度扮演着极其重要的角色。
无论你生活在哪里,从事什么工作,无时无刻不在跟温度打着交道。
子18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。
在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不靠路这温度的因素。
信息科学和航空工业的飞速发展给人们生活甚至国家安全带来了巨大的飞跃。
我的实习单位是航天八五一一研究所,在我工作期间深刻感觉到温度对焊接工艺的重要性,往往只是高了或低了一二摄氏度,就有可能将电缆或芯片报废掉,造成严重的损失。
我们也在重要的位置上放置了一个温度测量报警器
由此可见温度对我们工作生活的重要性,温度传感器以及温度报警器就显得格外重要。
第2章方案设计
本设计主要元件有AT89C51、DS18B20、数码管等,其中由AT89C51作为控制器,DS18B20测量温度,再通过74LS245把AT89C51单片机芯片所处理和转化的数据传输到数码管中。
当DS18B20感知到温度达到高于70℃或低于-20℃临界值时相应的LED闪烁,同时蜂鸣器发出报警声。
晶振是正弦波震荡电路,供本设计数字电路整形后作时钟源。
复位电路的作用是把电路恢复到起始状态。
本设计的温度报警器电路的总体框图如图2.1所示。
图2.1温度报警器电路的总体框架
第3章DS18B20简介
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
3.1DS18B20性能指标
(1)独特的单线接口方式:
DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:
+3.0~+5.5V。
(4)测温范围:
-55~+125℃。
固有测温分辨率为0.5℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
3.2DS18B20的封装及内部结构
DS18B20的封装如图3.1所示。
图3.1DS18B20的封装
DS18B20引脚功能:
1、GND为电源地
2、DQ为数字信号输入/输出端
3、VDD为外接供电电源输入端(在寄生电源接线方式时地)
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
3.3DS18B20工作原理及应用
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。
18B20共有三种形态的存储器资源,它们分别是:
ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。
数据在出产时设置不由用户更改。
DS18B20共64位ROM。
RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。
在上电复位时其值将被刷新。
第5个字节则是用户第3个EEPROM的镜像。
第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。
第9个字节为前8个字节的CRC码。
EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
3.4控制器对DS18B20操作流程
1.复位:
首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。
当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。
2.存在脉冲:
在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。
至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。
如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。
3.控制器发送ROM指令:
双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。
ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。
其主要目的是为了分辨一条总线上挂接的多个器件并作处理。
诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B20芯片时可以跳过ROM指令(注意:
此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。
ROM指令在下文有详细的介绍。
4.控制器发送存储器操作指令:
在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。
操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。
存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。
5.执行或数据读写:
一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。
如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。
如执行数据读写指令则需要严格遵循18B20的读写时序来操作。
数据的读写方法将有下文有详细介绍。
若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。
紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。
第4章硬件电路设计
温度报警器的电路设计如图4.1所示,控制器使用单片机AT89C51,温度传感器使用DS18B20,用数码管实现温度显示。
本温度报警器大体分四个工作过程。
首先,由DS18B20温度传感器芯片测量当前的温度,并将结果送入单片机中。
其次,再通过单片机AT89C51芯片对送来的测量温度读数进行计算和转化,并将此结果送入数码管。
然后,数码管显示温度数据。
最后,若温度超标,则二极管发光和蜂鸣器响起。
由图4.1可以看到本电路主要由DS18B20温度传感器芯片、数码管显示模块和AT89C51单片机芯片组成。
其中,DS18B20温度传感器芯片采用“一线制”与单片机相连,它独立的完成温度测量以及将测量结过传送到单片机的工作。
图4.1温度报警器电路设计原理图
4.1AT89C51
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚排列如图4.2所示。
图4.2AT89C51引脚排列
在本设计中,AT89C51起到控制器的作用。
当DS18B20温度传感器芯片测量当前的温度后,把结果送入AT89C51单片机中。
然后,通过AT89C51单片机芯片对送来的测量温度读数进行计算和转换,井将此结果送入数码管模块。
4.2晶振电路
晶振电路是给单片机提供时钟信号的。
其中,连接在晶振旁的两个电容叫做负荷电容,一般单片机的晶振工作于并联谐振状态,也可以理解为谐振电容的一部分。
晶振电路的原理图如图4.3所示。
图4.3晶振电路的原理图
它是根据晶振厂家提供的晶振要求负载电容选值的,换句话说,晶振的频率就是在它提供的负载电容下测得的,能最大限度的保证频率值的误差,也能保证温漂等误差。
两个电容的取值都是相同的,或者说相差不大,如果相差太大,容易造成谐振的不平衡,容易造成停振或者干脆不起振。
本设计中,负荷电容的值是22PF。
4.3复位电路
复位电路的作用就是把电路恢复到起始状态。
就像计算器的清零按钮的作用一样,当你进行完了一个题目的计算后肯定是要清零的是吧!
或者你输入错误,计算失误时都要进行清零操作。
以便回到原始状态,重新进行计算。
和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。
一是在给电路通电时马上进行复位操作;二是在必要时可以由手动操作;三是根据程序或者电路运行的需要自动地进行。
篡位电路都是比较简单的大都是只有电阻和电容组合就可以办到了。
复位电路的原理图如图4.4所示。
4.4报警电路
在本设计中,温度报警器的报警温度设为高:
70℃,低:
-20℃,当DS18B20感知到温度达到此临界值时相应的LED闪烁,同时蜂鸣器会发出报警声。
报警电路的原理图如图4.5所示。
图4.5报警电路的原理图
4.574LS245
74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
其封装与引脚如图4.6所示。
图4.674LS245的封装与引脚
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收) DIR=“1”,信号由A向B传输;(发送)当CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。
P0口与74LS245输入端相连,E端接地,保证数据线畅通。
8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。
在设计中,它主要起到了把AT89C51单片机芯片所处理和转化的数据传输到数码管中。
4.6显示电路
显示电路中的数码管是8位的,有16个引脚。
通过AT89C51芯片对送来的测量温度读数进行计算和转化,并将此结果送入数码管中,由数码管来显示,通过数码管可以清楚的看到DS18B20所测得的温度。
数码管的封装图如图4.7所示。
图4.7数码管的封装图
第5章软件设计
5.1主程序模块
主程序需要设置初始值和DS18B20的温度报警值,之后读取温度值,将该温度与所设置的温度比较。
如果该温度在所设温度的范围之内,则程序从头开始运行。
如果该温度在所设温度的范围之外,则报警器报警。
主程序流程图如图5.1所示。
图5.1主程序流程图
5.2程序说明
具体的程序代码及其说明(见注释语句)如下。
//-------------------------------------------------------------------
//说明:
本例将报警温度设为高:
70℃,低:
-20℃,当DS18B20感知到温度达//到次临界值时相应的LED闪烁,同时系统发出报警声。
//-------------------------------------------------------------------
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^6;
sbitBEEP=P3^7;
sbitHI_LED=P1^4;
sbitLO_LED=P1^5;
//共阴数码管段码及空白显示
ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
//温度小数位对照表
ucharcodedf_Table={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
//-------------------------------------------------------------------
//报警温度上下限,为进行正负数比较,此处设为char类型
//取值范围为-128~+127,DS18B20支持范围为-50~+125
//-------------------------------------------------------------------
charAlarm_Temp_HL[2]={70,-20};
ucharCurrentT=0;//当前读取的温度整数部分
ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值
ucharDisplay_Digit[]={0,0,0,0};//待显示的各温度数位
bitHI_Alarm=0,LO_Alarm=0;//高低温报警标志
bitDS18B20_IS_OK=1;//传感器正常标志
uintTime0_Count=0;//定时器延时累加
//-------------------------------------------------------------------
//延时
//-------------------------------------------------------------------
voidDelay(uintx)
{
while(--x);
}
//-------------------------------------------------------------------
//初始化DS18B20
//-------------------------------------------------------------------
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;Delay(8);
DQ=0;Delay(90);
DQ=1;Delay(8);
status=DQ;
Delay(100);
DQ=1;
returnstatus;
}
//-------------------------------------------------------------------
//读一字节
//-------------------------------------------------------------------
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;Delay(30);DQ=1;
}
returndat;
}
//-------------------------------------------------------------------
//写一字节
//-------------------------------------------------------------------
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
}
}
//-------------------------------------------------------------------
//读取温度值
//-------------------------------------------------------------------
voidRead_Temperature()
{
if(Init_DS18B20()==1)//DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC);//跳过序列号
WriteOneByte(0x44);//启动温度转换
Init_DS18B20();
WriteOneByte(0xCC);//跳过序列号
WriteOneByte(0xBE);//读取温度寄存器
Temp_Value[0]=ReadOneByte();//温度低8位
Temp_Value[1]=ReadOneByte();//温度高8位
Alarm_Temp_HL[0]=ReadOneByte();//报警温度TH
Alarm_Temp_HL[1]=ReadOneByte();//报警温度TL
DS18B20_IS_OK=1;
}
}
//-------------------------------------------------------------------
//设置DS18B20温度报警值
//-------------------------------------------------------------------
voidSet_Alarm_Temp_Value()
{
Init_DS18B20();
WriteOneByte(0xCC);//跳过序列号
WriteOneByte(0x4E);//将设定的温度报警器值写入DS18B20
WriteOneByte(Alarm_Temp_HL[0]);//写TH
WriteOneByte(Alarm_Temp_HL[1]);//写TL
WriteOneByte(0x7F);//12位精度
Init_DS18B20();
WriteOneByte(0xCC);//跳过序列号
WriteOneByte(0x48);//温度报警值存入DS18B20
}
//-------------------------------------------------------------------
//在数码管上显示温度
//-------------------------------------------------------------------
voidDisplay_Temperature()
{
uchari;
uchart=150;//延时值
ucharng=0,np=0;//负数标识及负号显示位置
charSigned_Current_Temp;//注意类型为char
//如果为负数则反取加1,并设置负号标识及负号显示位置
if((Temp_Value[1]&0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)Temp_Value[1]++;
ng=1;np=0xFD;//默认负号显示在左边第2位
}
//查表得到温度小数部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];
//获取温度整数部分(无符号)
CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);
//有符号的当前温度值,注意定义为char,其值可为-128~+127
Signed_Current_Temp=ng?
-CurrentT:
CurrentT;
//高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区//分正负比较)
HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?
1:
0;
LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?
1:
0;
//将整数部分分解为三位待显示数字
Display_Digit[3]=CurrentT/100;
Display_Digi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DS18B20 温度 报警器 设计 讲解
![提示](https://static.bdocx.com/images/bang_tan.gif)