数字温度计带温度报警.docx
《数字温度计带温度报警.docx》由会员分享,可在线阅读,更多相关《数字温度计带温度报警.docx(20页珍藏版)》请在冰豆网上搜索。
数字温度计带温度报警
\系统功能要求
1.能够监测电脑工作温度,并实时显示;
2.可以根据需要设定温控范围;
3.根据传感器传输的数据实时启动制冷芯片的工作;
4.电脑工作温度降到正常工作范围后停止制冷。
2.功能分析及主要元器件确定
从系统功能要求可知,此系统的难度不大,系统主要任务可以归纳为几项:
实时温度检
测内容显示,按键设置,制冷单元启动。
下面针对各项功能进行分析设计并选定主要元器件。
1.单片机选择
本设计是一个电脑用只能降温系统,系统运行环境较好,有交流电源,没有强电磁干扰,
系统功能对单片机性能要求不高,常见单片机AT89C51/52即可满足要求。
2.制冷功能设计
利用温度传感器输出信号作为制冷模块的控制信号,当环境温度超出预设温
度上限时启动制冷模块,实现对环境温度的控制。
3.温度检测功能设计
温度检测的原理有模拟检测和精密数字检测。
家庭环境温度适宜且范围较窄,采用数字
温度传感器更适合。
精密数字温度传感器也有多种型号,常用的DS18B20数字温度传感器,
采用一线总线,且在一线总线上可以挂接多个传感器,能检测-55〜+125C范围内温度,在
-10〜85C范围内检测精度0.5C。
因而采用DS18B20数字温度传感器。
3.主要元器件性能介绍
1.AT89C51单片机
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节内部RAM32个I/O
口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振
荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
VCC
p慎0/two]
Pi>.
PO.2/MD2)
Pl),J;代D計PH/(A[MI
PX5/(AD?
)Pftb;(AIMIFi>/(.wn
Fa/vpp
mu
ECU知MS⑷
fflIAT89C5I的创出排的
2.DS18B20数字温度传感器
1)主要特性
一线总线,只需要一线与MCU!
信。
一线总线上可挂接多个芯片构成分布式温度传感器网络。
每个芯片都有一个唯一的64位序列号,挂接在一线上的多个芯片依据序列号区别。
检测温度范围-55〜+125C,在-10〜85C范围内检测精度0.5C。
温度转换分辨率9位到12位可编程。
12位分辨率A/D转换时间最大750ms。
待机模式0功率消耗。
电源电压3.0〜5.5v
2)DS18B2C引脚布置
如图5所示,各引脚功能名称如下
DQ:
一线通信线,用于数据输入和输出。
Vcc:
电源电压。
GND电源地。
表5DS18B20的引脚图
3)温度检测
DS18B20的核心功能是直接到数字的温度传感器,通过向DS18B20发送转换命令[44H],开始
一次温度转换,转换需要一定时间才能完成,转换时间的长度与转换分辨率有关。
DS18B20
的转换分辨率可配置为9〜12位,默认值为12位,不同的分辨率对应的转换时间不同。
配置寄存器的结构如图6所示,分辨率的位数由R1和R0的组合决定,其余为无关位,分辨率位数及其对应转换时间如表7所示,通过向DS18B20发送设置命令[4EH],可以设置配置寄
存器中R1与R0的值,选择不同的分辨率。
0
R1
R0
1
1
1
1
1
表6分辨率配置寄存器结构
R1
R0
分辨率/位
最大装换时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
表7分辨率与转换时间
温度转换结果的数字值,以2字节长度存放在DS18B20的暂存器第一、第二字节内,以12
位分辨率为例。
其结构如图8所示。
温度值以补码形式存放,寄存器第二字节为温度值的高
字节,高字节的高5位S表示符号位。
S=0表明温度为正值,此时实际温度值就是寄存器的
数据值。
S=1表明温度为负值,此时实际温度值的绝对值为:
按位取反+1.寄存器低字节(第
一字节)的低4位,表示温度的小数位。
分辨率不同,温度转换时小数位包含的有意义位数不同,9位分辨率小数位只有2的负一次位有意义,其余位为0,精确到0.5C,12位分辨率小数位4位都有意义,精确到0.0625'C.两个字节中的2~6--2~0表示温度的整数部分。
由两字节二进制计算温度值的示例如表9所示
S
S
S
S
S
64
32
16
8
4
2
1
0.5
0.2
1/8
1/1
5
6
图8温度数据寄存器结构
二进制数字值
十六进制数字
温度值
0000011111010000
07D0H
+125'C=1111101.0000
0000010101010000
0550D
+85'C=1010101.0000
0000000110010001
0191H
+25.0625'C=0011001.0001
0000000010100010
00A2H
+10.125'C=0001010.0010
0000000000001000
0008H
+0.5'C=0000000.1000
0000000000000000
0000H
0'C=0000000.0000
1111111111111000
FFF8H
-0.5'C=-0000000.1000
1111111101011110
FF5EH
-10.125'C=-0001010.0010
1111111001101111
FF6FH
-25.0625'C=-0011001.0001
1111110010010000
FC90H
-55'C=-0110111.0000
表9温度值的计算示例
通过向DS18B20发送读温度命令[BEH],可以读取这两字节的温度值,读取时先读取的一字节为低字节。
4)操作命令
通过一线总线访问DS18B20勺协议包括:
初始化、ROM操作命令、内存RAM操乍命令。
1)初始化:
在对DS18B20进行任何操作之前,必须首先初始化DS18B20初始化序列包括
一个发送到DS18B20的复位信号和紧跟着由DS18B20返回的应答信号,表明芯片已准备好接受或发送数据。
如果单片机没有接收到来自DS18B20的应答,则不能进行对DS18B20下一步
操作。
2)ROM操作命令:
DS18B20内部有64位8字节ROM记录着每个DS18B20芯片全球唯一的
序列号,依据序列号,就可以对挂接在一线总线山的多个DS18B20进行区分。
针对64位ROM
的操作命令有5个。
读ROM命令[33H]:
为区分挂接在一线总线上的多个DS18B2Q必须预
先知道每个芯片的各自序列号。
通过发送读ROM命令,DS18B20返回64位序列号。
在读取
序列号时,一线总线上只能有一个DS18B20匹配ROM命令[55H]:
在对同一总线上多个
DS18B20的某个特定进行RAM操作时,必须首先发送该芯片的64位序列号,只有序列号完
全一致的芯片才能接受后续的RAM操作。
应用此命令时首先发送匹配命令,接着发送特定的
4位序列号。
跳过ROM命令[CCH]:
当一线总线上只有一个DS18B20时,由于不可能产生混
淆就没有必要再发送匹配ROM命令,为省时就发送一个跳过序列号匹配命令。
当总线挂接多
个芯片,不能跳过序列号匹配过程,即必须先选择特定的芯片。
搜索ROM命令[F0H]:
此命令搜索总线上挂接芯片的数量并获取各个芯片的序列号。
当总线上只有一个芯片时,用读ROM命令来获取其64位序列号,当总线上有多个芯片时,必须用
搜索命令。
但此命令的执行过程非常繁琐,最好应用读ROM命令分别读取序列号。
3)RAM操作指令
DS18B20内部有9字节暂存器RAM记录着当前转换的温度值,对芯片的配置设置等内容,如表10为暂存器分布结构。
其中重要的第一字节和第二字节,存放转换的温度值,第三、四、五存放用户对芯片的设置值。
针对RAM的操作命令有6个,其中重要的有3个。
写暂存器命令[4EH]:
该命令用来写用户的配置参数到DS18B20中,用户配置参数为3字节,
执行此命令时必须完整写入3字节内容。
字节序号
内容
0
温度值低字节
1
温度值高字节
2
TH/用户字节1
3
TL/用户字节2
4
配置
5
保留
6
保留
7
保留
8
CRC校验值
表10暂存器分布结构
读暂存器命令[BEH]:
读命令用来读取温度值,温度值存放在2字节内存中,读取时第一次
读取的是温度低字节,第二次读取的是温度高字节。
也可以连续读出暂存器的所有9字节,
通常,只读出存放温度值的头两字节。
温度转换命令[44H]:
转换命令用来启动一次温度转换,将当前的物理温度转换位数字值。
根据配置的分辨率不用,转换一次所需要的转换时间不同,在读取温度钱,要等待本次温度
转换结束,才能读出正确的当前温度值。
因此在编程时,要首先调用温度转换命令启动温度
转换,然后延时相应于分辨率的转换时间再来读温度值。
3.制冷芯片
热电制冷又称温差电制冷,由于目前热电制冷采用的材料都是半导体材料,因此热电制冷也被称为半导体制冷。
它是塞贝克效应的逆效应帕尔帖效应在制冷技术方面的应用,是-种新型制冷方式。
如图1所示,其原理是通过半导体材料的温差效应,使直流电通过由两种不同半导体材料串联成的电偶时,在电偶对的两端将吸收或放出热量。
如果在放热端安装散热装置,吸热端就能通过热量输送制成简单方便的新型制冷器;当改变
直流电方向时,又能达到制热的效果。
热电制冷系统仅包括冷端、热端、电源、电路等,即它不需要制冷剂。
其次其工质是在固体中传导的电子,无工质泄漏,且无机械运动,无噪声,体积小,可靠性强。
半导体制冷片热惯性非常小,制冷制热时间很快,在热端散热良好冷端空载的情况下,通电不到一分钟,制冷片就能达到最大温差。
第三,其冷量调节范围宽,冷热转换快。
因此,在某些地方,有着压缩式制冷机无法替代的作用。
第四,半导体制冷片是电流换能型片件,通过输入电流的控制,可实现高精度的温度控制,再加上温度检测和控制手段,很容易实现遥控、程控、计算机控制,便于组成自动控制系统。
第五,半导体制冷片的单个制冷元件对的功率很小,但组合成电堆,用同类型的电堆串、并联的方法组合成制冷系统的话,功率就可以做的很大,因此制冷功率可以做到几毫瓦到上万瓦的范围。
目前,半导体热电堆制冷、发电技术已经在国防、医疗、科研、通讯、航海、农业、动力以及工业生产等各领域得到了广泛的应用。
在日常生活方面也应用于空调、冷热两用箱、饮水机、电子信箱等。
在实验室装置方面应用于冷阱、冷箱、冷槽、电子低温测试装置、各种恒温、高低温实验仪片。
在医疗方面应用于冷力、冷合、白内障摘除片、血液分析仪等。
在军事方面应用于导弹、雷达、潜艇等方面的红外线探测、导航系统。
在专用装置方面:
石油产品低温测试仪、生化产品低温测试仪、细菌培养箱、恒温显影槽、电脑等。
但是,由于半导体材料,电源和热端散热等方面的影响,热电制冷与常规的压缩制冷相比,仍然存在着制冷效率低等问题。
4.硬件设计
依据以上主要元件原理,以及各元件对数据总线,I/O口、外部中断、内存等资源的占用,合理分配资源。
原理图见附录一。
五,程序设计
所有的程序都已在keil系统中编写,调试编写,调试通过,利用开发板将程序下载到AT89C5仲,经过电路板的运行,证明系统能够运行并能实现预期的功能。
(程序见附录二)
参考文献:
[1]《模拟电子技术基础》,童诗白,华成英著,北京:
高等教育出版社,2000
年;
[2]《C程序设计》,谭浩强著,北京:
清华大学出版社,2005年;
[3]《数字电子技术基础》,阎石著,北京:
高等教育出版社,2005年;
[4]《电子电路设计》,刘征宇著,福建:
福建科学技术出版社,2004年;
[5]《单片机C语言入门》,孙春亮著,北京:
人民邮电出版社,2008年;
[6]《单片机原理及应用》,李建忠著,西安:
西安电子科技大学,2002年;
[7]《KeilCx51V7.0单片机高级语言编程与uVision2应用实践》徐爱钧彭秀华编著,北京:
电子工业出版社,2006年;
附录一:
k—
4
\
■-
1
■
r
-
T
T
B00S
ik■
F3;ra=
I—I—
k
-U-rL->
附录二:
#include
#defineuintunsignedint#defineucharunsignedchar#defineSETP3_1#defineDECP3_2
#defineADDP3_3
#defineBEEPP3_6#defineALAMP1_2#defineDQP3_7bitshanshuo_st;
bitbeep_st;sbitDIAN=P0A5;ucharx=0;
signedcharm;
ucharn;
ucharset_st=0;
signedcharshangxian=38;signedcharxiaxian=5;
//宏定义
//定义调整键
//定义减少键
//定义增加键
//定义蜂鸣器
//定义灯光报警
//定义DS18B20总线I/O
//闪烁间隔标志
//蜂鸣器间隔标志
〃小数点
//计数器
//温度值全局变量
//温度值全局变量
//状态标志
//上限报警温度,默认值为38
〃下限报警温度,默认值为38
code
//ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};uchar
LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xD
C,0x9B,0x8B};
//=====================================================================
〃====================================DS18B20==========================
//=====================================================================/*****延时子程序*****/
voidDelay_DS18B20(intnum)
{
while(num--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
Delay_DS18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
Delay_DS18B20(80);//精确延时,大于480us
DQ=1;//拉高总线
Delay_DS18B20(14);
x=1则初始化失败
x=DQ;〃稍做延时后,如果x=0则初始化成功,
Delay_DS18B20(20);
}
/*****^读^个字^节*****/unsignedcharReadOneChar(void){
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****•写.个字^节*****/voidWriteOneChar(unsignedchardat){
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}
/*****
读取温度*****/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(OxCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(OxCC);//跳过读序号列号的操作
WriteOneChar(OxBE);//读取温度寄存器
a=ReadOneChar();〃读低8位
b=ReadOneChar();//读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
//=====================================================================
//=====================================================================
//=====================================================================
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;//50ms(晶振12M)
}
/*****
读取温度*****/
voidcheck_wendu(void)
{
uinta,b,c;
c=ReadTemperature()-5;
a=c/100;
b=c/10-a*10;
m=c/10;
n=c-a*100-b*10;
if(m<0){m=0;n=0;}
if(m>99){m=99;n=9;}
}
/*****显示开机初始化等待画面*****/
voidDisp」nit(void)
{
P0=~0x80;//刚开机时数码管显示
P2=0x7F;
Delay(500);
P2=0xDF;
Delay(500);
P2=0xF7;
Delay(500);
P2=0xFD;
Delay(500);
P2=0xFF;//关闭显示
}
/*****显示温度子程序*****/
voidDisp_Temperature(void)〃显示温度
{
P0=~0x98;//显示C
P2=0x7F;
Delay(300);
P2=0xFF;
P0=~LEDData[n];
//显示个位
P2=0xDF;
Delay(300);
P2=0xFF;
P0=~LEDData[m%10];
〃显示十位
DIAN=0;
//显示小数点
P2=0xF7;
Delay(300);
P2=0xFF;
P0=~LEDData[m/10];
//显示百位
P2=0xFD;
Delay(300);
P2=0xFF;
//关闭显示
}
/*****显示报警温度子程序*****/
voidDisp_alarm(ucharbaojing)
{
P0=~0x98;//显示C
P2=0x7F;
Delay(300);
P2=0xFF;
P0=~LEDData[baojing%10];//显示十位
P2=OxDF;
Delay(300);
P2=0xFF;
P0=~LEDData[baojing/1O];//显示百位
P2=0xF7;
Delay(300);
P2=0xFF;
if(set_st==1)P0=~0xCE;
elseif(set_st==2)P0=~0x1A;//上限H、下限L标示
P2=0xFD;
Delay(300);
〃关闭显示
P2=0xff;
}
/*****扌报警子程^序*****/voidAlarm(){
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m}else
{voidmain(void)
{
uint乙
InitTimer();//初始化定时器
EA=1;//全局中断开关
TR0=1;
ET0=1;//开启定时器0
IT0=1;
IT仁1;
check_wendu();〃检测温度
check_wendu();
for(z=0;z<300;z++)//显示开机画面
{
Disp_init();
}
while
(1)
{
if(SET==O)〃设置键键下
{
Delay(2000);
do{}while(SET==0);
set_st++;x=O;shanshuo_st=1;if(set_st>2)set_st=0;
}
if(set_st==0)
{
EXO=O;//关闭外部中断0
EX仁0;//关闭外部中断1
check_wendu();
Disp_Temperature();//显示温度
Alarm();〃报警检测
}
elseif(set_st==1)
{
BEEP=1;II关闭蜂鸣器
ALAM=1;
EX0=1;II开启外部中断0
EX1=1;II开启外部中断1
if(x