您的当前位置:首页正文

数字温度计带温度报警

来源:华拓网
一.系统功能要求

1.能够监测电脑工作温度,并实时显示; 2.可以根据需要设定温控范围;

3.根据传感器传输的数据实时启动制冷芯片的工作; 4.电脑工作温度降到正常工作范围后停止制冷。

二.功能分析及主要元器件确定

从系统功能要求可知,此系统的难度不大,系统主要任务可以归纳为几项:实时温度检测内容显示,按键设置,制冷单元启动。下面针对各项功能进行分析设计并选定主要元器件。

1.单片机选择

本设计是一个电脑用只能降温系统,系统运行环境较好,有交流电源,没有强电磁干扰,系统功能对单片机性能要求不高,常见单片机AT89C51/52即可满足要求。

2.制冷功能设计

利用温度传感器输出信号作为制冷模块的控制信号,当环境温度超出预设温度上限时启动制冷模块,实现对环境温度的控制。

3.温度检测功能设计

温度检测的原理有模拟检测和精密数字检测。家庭环境温度适宜且范围较窄,采用数字温度传感器更适合。精密数字温度传感器也有多种型号,常用的DS18B20数字温度传感器,采用一线总线,且在一线总线上可以挂接多个传感器,能检测-55~+125℃范围内温度,在-10~85℃范围内检测精度0.5℃。因而采用DS18B20数字温度传感器。

三.主要元器件性能介绍

1.AT89C51单片机

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

2.DS18B20数字温度传感器

1)主要特性

 一线总线,只需要一线与MCU通信。

      

一线总线上可挂接多个芯片构成分布式温度传感器网络。

每个芯片都有一个唯一的64位序列号,挂接在一线上的多个芯片依据序列号区别。 检测温度范围-55~+125℃,在-10~85℃范围内检测精度0.5℃。 温度转换分辨率9位到12位可编程。 12位分辨率A/D转换时间最大750ms。 待机模式0功率消耗。 电源电压3.0~5.5v

2)DS18B20引脚布置

如图5所示,各引脚功能名称如下

  

DQ:一线通信线,用于数据输入和输出。 Vcc:电源电压。 GND:电源地。

表5 DS18B20的引脚图 3)温度检测

DS18B20的核心功能是直接到数字的温度传感器,通过向DS18B20发送转换命令[44H],开始一次温度转换,转换需要一定时间才能完成,转换时间的长度与转换分辨率有关。DS18B20的转换分辨率可配置为9~12位,默认值为12位,不同的分辨率对应的转换时间不同。配置寄存器的结构如图6所示,分辨率的位数由R1和R0的组合决定,其余为无关位,分辨率位数及其对应转换时间如表7所示,通过向DS18B20发送设置命令[4EH],可以设置配置寄存器中R1与R0的值,选择不同的分辨率。 0 R1 0 0 1 1

表7 分辨率与转换时间

R1 R0 1 1 1 1 1 表6 分辨率配置寄存器结构

R0 0 1 0 1 分辨率/位 9 10 11 12 最大装换时间/ms 93.75 187.5 375 750 温度转换结果的数字值,以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.25 图8 温度数据寄存器结构 二进制数字值 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000 表9 温度值的计算示例

通过向DS18B20发送读温度命令[BEH],可以读取这两字节的温度值,读取时先读取的一字节为低字节。

十六进制数字 07D0H 0550D 0191H 00A2H 0008H 0000H FFF8H FF5EH FF6FH FC90H 温度值 +125`C=111 1101.0000 +85`C=101 0101.0000 +25.0625`C=001 1001.0001 +10.125`C=000 1010.0010 +0.5`C=000 0000.1000 0`C=000 0000.0000 -0.5`C=-000 0000.1000 -10.125`C=-000 1010.0010 -25.0625`C=-001 1001.0001 -55`C=-011 0111.0000 1/8 1/16 4)操作命令

通过一线总线访问DS18B20的协议包括:初始化、ROM操作命令、内存RAM操作命令。

1)初始化:在对DS18B20进行任何操作之前,必须首先初始化DS18B20。初始化序列包括一个发送到DS18B20的复位信号和紧跟着由DS18B20返回的应答信号,表明芯片已准备好接受或发送数据。如果单片机没有接收到来自DS18B20的应答,则不能进行对DS18B20下一步操作。

2)ROM操作命令:DS18B20内部有64位8字节ROM,记录着每个DS18B20芯片全球唯一的序列号,依据序列号,就可以对挂接在一线总线山的多个DS18B20进行区分。针对64位ROM的操作命令有5个。读ROM命令[33H]:为区分挂接在一线总线上的多个DS18B20,必须预先知道每个芯片的各自序列号。通过发送读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 3 4 5 6 7 8 内容 温度值低字节 温度值高字节 TH/用户字节1 TL/用户字节2 配置 保留 保留 保留 CRC校验值 表10 暂存器分布结构

读暂存器命令[BEH]:读命令用来读取温度值,温度值存放在2字节内存中,读取时第一次读取的是温度低字节,第二次读取的是温度高字节。也可以连续读出暂存器的所有9字节,通常,只读出存放温度值的头两字节。

温度转换命令[44H]:转换命令用来启动一次温度转换,将当前的物理温度转换位数字值。根据配置的分辨率不用,转换一次所需要的转换时间不同,在读取温度钱,要等待本次温度转换结束,才能读出正确的当前温度值。因此在编程时,要首先调用温度转换命令启动温度转换,然后延时相应于分辨率的转换时间再来读温度值。

3.制冷芯片

热电制冷又称温差电制冷,由于目前热电制冷采用的材料都是半导体材料,因此热电制冷也被称为半导体制冷。它是塞贝克效应的逆效应帕尔帖效应在制冷技术方面的应用,是一种新型制冷方式。

如图1 所示,其原理是通过半导体材料的温差效应,使直流电通过由两种不同半导体材料串联成的电偶时,在电偶对的两端将吸收或放出热量。如果在放热端安装散热装置,吸热端就能通过热量输送制成简单方便的新型制冷器;当改变直流电方向时,又能达到制热的效果。热电制冷系统仅包括冷端、热端、电源、电路等,即它不需要制冷剂。其次其工质是在固体中传导的电子,无工质泄漏,且无机械运动,无噪声,体积小,可靠性强。半导体制冷片热惯性非常小,制冷制热时间很快,在热端散热良好冷端空载的情况下,通电不到一分钟,制

冷片就能达到最大温差。第三,其冷量调节范围宽,冷热转换快。因此,在某些地方,有着压缩式制冷机无法替代的作用。第四,半导体制冷片是电流换能型片件,通过输入电流的控制,可实现高精度的温度控制,再加上温度检测和控制手段,很容易实现遥控、程控、计算机控制,便于组成自动控制系统。第五,半导体制冷片的单个制冷元件对的功率很小,但组合成电堆,用同类型的电堆串、并联的方法组合成制冷系统的话,功率就可以做的很大,因此制冷功率可以做到几毫瓦到上万瓦的范围。目前,半导体热电堆制冷、发电技术已经在国防、医疗、科研、通讯、航海、农业、动力以及工业生产等各领域得到了广泛的应用。在日常生活方面也应用于空调、冷热两用箱、饮水机、电子信箱等。在实验室装置方面应用于冷阱、冷箱、冷槽、电子低温测试装置、各种恒温、高低温实验仪片。在医疗方面应用于冷力、冷合、白内障摘除片、血液分析仪等。在军事方面应用于导弹、雷达、潜艇等方面的红外线探测、导航系统。在专用装置方面:石油产品低温测试仪、生化产品低温测试仪、细菌培养箱、恒温显影槽、电脑等。但是,由于半导体材料,电源和热端散热等方面的影响,热电制冷与常规的压缩制冷相比,仍然存在着制冷效率低等问题。

四.硬件设计

依据以上主要元件原理,以及各元件对数据总线,I/O口、外部中断、内存

等资源的占用,合理分配资源。原理图见附录一。

五,程序设计

所有的程序都已在keil系统中编写,调试编写,调试通过,利用开发板将程序下载到AT89C51中,经过电路板的运行,证明系统能够运行并能实现预期的功能。(程序见附录二)

参考文献:

[1]《模拟电子技术基础》,童诗白,华成英著,北京:高等教育出版社,2000

年;

[2]《C程序设计》,谭浩强著,北京:清华大学出版社,2005年; [3]《数字电子技术基础》,阎石著,北京:高等教育出版社,2005年; [4]《电子电路设计》,刘征宇著,福建:福建科学技术出版社,2004年; [5]《单片机C语言入门》,孙春亮著,北京:人民邮电出版社,2008年; [6]《单片机原理及应用》,李建忠著,西安:西安电子科技大学,2002年; [7]《Keil Cx51 V7.0 单片机高级语言编程与uVision2应用实践》 徐爱钧 彭

秀华编著,北京:电子工业出版社,2006年; 附录一:

附录二:

#include #define uint unsigned int

#define uchar unsigned char //宏定义 #define SET P3_1 #define DEC P3_2 #define ADD P3_3 #define BEEP P3_6 #define ALAM P1_2 bit shanshuo_st;

//定义调整键 //定义减少键

//定义增加键 //定义蜂鸣器

//定义灯光报警

//定义DS18B20总线I/O

#define DQ P3_7 bit beep_st; sbit DIAN = P0^5; uchar x=0; signed char m;

//闪烁间隔标志 //蜂鸣器间隔标志 //小数点

//计数器 //温度值全局变量 //温度值全局变量 //状态标志

//上限报警温度,默认值为38 //下限报警温度,默认值为38

uchar n; uchar set_st=0; signed char shangxian=38; signed char xiaxian=5;

//uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};

//============================================================================================

//====================================DS18B20=================================================

//============================================================================================ /*****延时子程序*****/ void Delay_DS18B20(int num) {

while(num--) ; }

/*****初始化DS18B20*****/ void Init_DS18B20(void) {

unsigned char x=0;

DQ = 1; //DQ复位

Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低

Delay_DS18B20(80); //精确延时,大于480us

DQ = 1; //拉高总线

Delay_DS18B20(14);

x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); }

/*****读一个字节*****/ unsigned char ReadOneChar(void) {

unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ)

dat|=0x80;

Delay_DS18B20(4); }

return(dat);

}

/*****写一个字节*****/

void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } }

/*****读取温度*****/

unsigned int ReadTemperature(void) {

unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 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); }

//=====================================================================================

//=====================================================================================

//=====================================================================================

/*****延时子程序*****/ void Delay(uint num) {

while( --num ); }

/*****初始化定时器0*****/ void InitTimer(void) { }

/*****读取温度*****/ void check_wendu(void) {

uint a,b,c;

c=ReadTemperature()-5; a=c/100; b=c/10-a*10; m=c/10;

//获取温度值并减去DS18B20的温漂误差 //计算得到十位数字 //计算得到个位数字 //计算得到整数位 //计算得到小数位 //设置温度显示上限 //设置温度显示上限

TMOD=0x1;

TH0=0x3c;

TL0=0xb0; //50ms(晶振12M)

n=c-a*100-b*10; if(m<0){m=0;n=0;} if(m>99){m=99;n=9;}

}

/*****显示开机初始化等待画面*****/

void Disp_init(void) { P0 = ~0x80; //刚开机时数码管显示 -- -- -- --

P2 = 0x7F; Delay(500); P2 = 0xDF; Delay(500); P2 = 0xF7; Delay(500); P2 = 0xFD;

Delay(500);

P2 = 0xFF; //关闭显示

}

/*****显示温度子程序*****/

void Disp_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;

//显示小数点 //显示个位

//关闭显示

}

/*****显示报警温度子程序*****/ void Disp_alarm(uchar baojing) { P0 =~0x98; //显示C

P2 = 0x7F;

Delay(300); P2 = 0xFF;

P0 =~LEDData[baojing%10];

//显示十位

P2 = 0xDF;

Delay(300); P2 = 0xFF;

P0 =~LEDData[baojing/10]; //显示百位 P2 = 0xF7; Delay(300); P2 = 0xFF;

if(set_st==1)P0 =~0xCE;

else if(set_st==2)P0 =~0x1A; //上限H、下限L标示 P2 = 0xFD;

Delay(300);

P2 = 0xff; //关闭显示

}

/*****报警子程序*****/ void Alarm() {

if(x>=10){beep_st=~beep_st;x=0;}

if((m>=shangxian&&beep_st==1)||(mALAM=1;

//蜂鸣器停

//灯光灭

}

/*****主函数*****/ void main(void)

{

uint z;

InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1;

ET0=1; //开启定时器0 IT0=1; IT1=1;

check_wendu(); check_wendu(); for(z=0;z<300;z++) {

Disp_init(); }

//检测温度 //显示开机画面

while(1) {

if(SET==0) {

Delay(2000); do{}while(SET==0); set_st++;x=0;shanshuo_st=1; if(set_st>2)set_st=0; }

if(set_st==0)

{

EX0=0; //关闭外部中断0 EX1=0; //关闭外部中断1 check_wendu();

Disp_Temperature(); //显示温度 Alarm(); //报警检测 }

else if(set_st==1) {

BEEP=1; //关闭蜂鸣器 ALAM=1;

EX0=1; //开启外部中断0 EX1=1; //开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }

else if(set_st==2)

{

BEEP=1; //关闭蜂鸣器 ALAM=1;

EX0=1; //开启外部中断0 EX1=1; //开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} } } }

/*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 {

TH0=0x3c; TL0=0xb0; x++;

//设置键键下

}

/*****外部中断0服务程序*****/ void int0(void) interrupt 0 {

EX0=0; //关外部中断0 if(DEC==0&&set_st==1) {

do{

Disp_alarm(shangxian); }

while(DEC==0);

shangxian--;

if(shangxianelse if(DEC==0&&set_st==2) {

do{ Disp_alarm(xiaxian);

}

while(DEC==0);

xiaxian--;

if(xiaxian<0)xiaxian=0; } }

/*****外部中断1服务程序*****/ void int1(void) interrupt 2 {

EX1=0; //关外部中断1 if(ADD==0&&set_st==1) {

do{

}

Disp_alarm(shangxian);

while(ADD==0); shangxian++;

if(shangxian>99)shangxian=99; }

else if(ADD==0&&set_st==2) { do{

Disp_alarm(xiaxian); }

while(ADD==0);

xiaxian++;

if(xiaxian>shangxian)xiaxian=shangxian; } }

因篇幅问题不能全部显示,请点此查看更多更全内容