基于单片机控制的数字温度计Word文档下载推荐.docx
《基于单片机控制的数字温度计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的数字温度计Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
1引言………………………………………………………………………………1
2总体设计方案……………………………………………………………………1
3计组成及原理分析…………………………………………………………………1
3.1显示驱动电路……………………………………………………………………2
3.2DS18B20原理分析………………………………………………………………2
4总结与体会………………………………………………………………………5
参考文献……………………………………………………………………………6
附录一程序流程图……………………………………………………………7
附录二总体电路图……………………………………………………………8
序清单……………………………………………………………………8
基于单片机控制的数字温控器
应教081王俊阁
摘要:
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
关键词:
单片机数字控制温度计DS18B2074HC245
1.引言
随着人们生活水平的提高,现在的很多地方都用到了与电有关的器件,而这些器件又大都与温度有关,例如:
烧开水的锅炉需要测温度、家庭用的电磁炉需要测温度等等;
所以数字温度计也普遍存在于人们的生活当中,而本电路就是结合这种思路和参考一些资料所设计的电路,这种电路可以和方便的用在我们生活当中,给人们的生活带来很大的方便。
2.总体设计方案
2.1设计思路
温度只要在所设定的上下温度界限内,就会在显示设备中精确的显示出来,如果温度超过了所设定的温度界限,就发出报警声。
能够及时向温度监控人员发出温度超限信息。
便于温控人员及时的调整与控制。
另外此温度控制器操作简单,体积小,灵敏度高,精度高。
2.2总体设计方框图如图1所示
图1总体设计方框图
3.设计组成及原理分析
3.1显示电路
本电路采用串行口显示,利用74HC245来驱动,数码管显示,74HC245的外围引脚图如图2所示。
74HC164是串行输入并行输出的移位寄存器,并带有清除端,其中Q0-Q7为并行输出端,MR为清除端,当它为零电平时使74HC164清零,A、B为串行输入端,CLK为时钟脉冲输入端,在脉冲的上升沿实现移位。
当CLK=0、MR=1时,74HC164保持原来的数据状态。
图中外接4片74HC245作为4位LED显示器的静态连接口,74HC245的低电平输出电流为8MA,可直接驱动共阳极LED。
采用软件译码向74HC245输出字型码,由于显示器是静态的主程序可不必扫描显示器。
从而节省很多的时间。
图2显示电路
3.2温度传感器工作原理
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等感温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
■独特的单线接口仅需要一个端口引脚进行通信
■多个DS18B20可以并联在惟一的三线上,实现多点组网功能
■无须外部器件
■可通过数据线供电,电压范围为3.0~5.5V
■零待机功耗
■温度以9或12位数字
■用户可定义的非易失性温度报警设置
■报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件,负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
图3DS1820外形封装图
DS18B20采用3脚PR-35封装或8脚SOIC封装,其外形封装图如图3所示。
其各引脚的功能说明如表1所示。
DS18B20的内部结构图如图5所示,它有三个主要的数据部件
(1)64位激光(aseredROM)
(2)温度灵敏元件
(3)非易失性温度告警触发器TH和TL。
器件从单线的通信线取得其电源,在信号线为高电平的时间周期内,能量贮存在内部的电容器中在单信号线为低电平的时间期内断开此电源。
直到信号线变为高电平重新接上寄生电容电源为止作为另一种可供选择的方法。
DS1820也可用外部5V电源供电。
表1DS18B20各管脚说明
引脚
8脚SOIC
PR35
符号
说明
5
1
GND
地
4
2
DQ
单线运用的数据输入/输出引脚:
漏极开路见“寄生电源”一节
3
VDD
可选VDD引脚。
有关连接的细节见“寄生电源”一节
DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
主要首先提供以下功能命令之一:
1)读ROM,2)ROM匹配,3)搜索ROM,4)跳过ROM,5)报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。
一个控制功能指挥指示DS18B20的演出测温。
测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。
温度报警触发器TH和TL都有一字节EEPROM的数据。
如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。
在片上还载有配置字节以理想的解决温度数字转换。
写TH,TL指令以及配置字节利用一个记忆功能的指令完成。
通过缓存器读寄存器。
所有数据的读,写都是从最低位开始。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构表2所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;
当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制值勤。
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式。
单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
其复位时序如图6所示
图6DS18B20复位时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
其读时序如图7所示。
图7DS18B20读时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
其时序图如图8所示。
图8DS18B20写时序
4总结与体会
经过将近三周的单片机实习,在指导老师和同学的帮助下,我确实学到了不少平时在课堂上所学不到的知识。
这样的实习不论是对我们的理论知识还是实践能力都有很大的帮助,经过这些实习可以使我们能更快更准确的掌握专业方面的理论知识。
我们这次的设计是基于单片机控制的数字温度计,虽然说我们已经学习过单片机课程,但是对于单片机这个词还是有些陌生。
并不是太清楚单片机的功能和性能方面的知识,为了使自己设计的题目更加合理,我可以说是在图书馆查阅了很多有关单片机和温度传感器方面的知识,也对别人设计的相关题目进行了参考和分析。
就拿我们设计中的温度传感器的驱动电路来说,虽然说我们所查阅的资料上有很多关于检测温的电路,有集成电路的,场效应管的,再就是我们本章使用的DS1820。
刚开始的时候看到这些电路觉得这些电路都不错,都挺符合自己所设计的要求,经过自己仔细分析和同学探讨,得到的结论是,虽然说资料上的驱动电路在理论分析上是行的通的,如果把它拿到实际的电路中,可以看到它并不一定能起到我们所要达到的目的。
由于这些原因,我们几个最终决定用DS1820,用DS1820不仅能满足测量温度方面的需求,同时还能直接转换为数字量。
我感觉这次实习我们得到更多的是,对办任何事情我们都要先经过认真细致的观察和分析,才能确定我们到底该如何去做它,要不然,只会是事倍功半,耽误我们的办事效率。
我觉得这个方面的经验是最宝贵的,也是我们在毕业后,进入社会所必须的能力。
我们也只有具备了这个基本的能力后,才不至于在以后的生活,学习和工作中误入歧途,对自己和对他人造成不必要的损失。
总之,通过这次实习,我真正学到了很多东西,真正体会到了理论联系实际的重要性。
我想如果在平时多搞几次这样的实习,那我们的知识会掌握的更多,更牢固。
最后,衷心感谢辅导老师的指导和同学的帮助!
参考文献:
[1]周航慈著.单片机应用程序设计基础.北京:
电子工业出版社,1997年7月
[2]朱承高.电工及电子技术手册[M].北京:
高等教育出版社,1990
[3]阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
[4]廖常初.现场总线概述[J].电工技术,1999.6
[5]李广弟编著.单片机应用程序设计基础.北京:
北京航空航天大学出版社,1994年6月
附录一:
图9程序流程图
附录二
图10总体电路图
程序清单:
#include<
reg51.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P1^1;
//定义端口DQ
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
ucharCurrentT=0;
ucharTemp_Value[]={0x00,0x00};
ucharDisplay_Digit[]={0,0,0,0};
ucharDS18B20_IS_OK=1;
/**********************************************************************************/
voidDelay(uintnum)//延时函数
{
while(--num);
}
ucharInit_DS18B20(void)//初始化ds1820
ucharx;
DQ=1;
//DQ复位
Delay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
Delay(90);
//精确延时大于480us
//拉高总线
x=DQ;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
Delay(100);
DQ=1;
returnx;
ucharReadOneByte()//读一个字节
uchari=0,dat=0;
DQ=1;
_nop_();
for(i=8;
i>
0;
i--)
DQ=0;
//给脉冲信号
dat>
>
=1;
DQ=1;
_nop_();
if(DQ)
dat|=0x80;
Delay(30);
return(dat);
voidWriteOneByte(uchardat)//写一个字节
uchari;
{
DQ=dat&
0x01;
Delay(5);
dat>
=1;
}
voidRead_Temperature()//读取并显示温度
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC);
//跳过读序号列号的操作
WriteOneByte(0x44);
//启动温度转换
Init_DS18B20();
//跳过读序号列号的操作
WriteOneByte(0xBE);
//读取温度寄存器
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
voidDisplay_Temperature()
uchari;
uchart=150;
ucharng=0,np=0;
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=0x08;
}
Display_Digit[0]=df_Table[Temp_Value[0]&
0x0f];
CurrentT=((Temp_Value[0]&
0xf0)>
4|((Temp_Value[1]&
0x0f)<
<
4));
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)
Display_Digit[3]=10;
np=0x08;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0x04;
}
for(i=0;
i<
30;
i++)
P0=DSY_CODE[Display_Digit[0]];
P2=0x01;
Delay(t);
P2=0x00;
P0=(DSY_CODE[Display_Digit[1]])&
0x7f;
P2=0x02;
P0=DSY_CODE[Display_Digit[2]];
P2=0x04;
;
P0=DSY_CODE[Display_Digit[3]];
P2=0x08;
if(ng)
P0=0xbf;
P2=np;
}
voidmain()
Read_Temperature();
Delay(50000);
while
(1)
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
else
P0=P2=0xff;