温度报警系统的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
温度报警系统的设计
1.设计思路
本设计是一种基于STC89C52的温度检测及报警系统。
该系统将单总线温度传感器DS18B20并接在控制器的一个端口上,对传感器温度进行采集,将采集到的温度值实时显示同时与设定值进行比较,当超出设定的上限温度时,通过蜂鸣器报警,并根据要求打开继电器或电风扇。
2.方案设计
采用技术成熟、操作简单、精确度高的温度传感器,在此,可以选用数字温度传感器DS18B20,根据它的特点和测温原理,很容易就能直接读取被测温度值并进行转换,这样就可以满足设计要求。
码管以串口并行输出方式传送数据实现温度显示。
图1总体设计框图
2.1主要器件的选择
STC89C52 是低电压,高性能 CMOS 8 位单片机,片内含 8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes 的随机存取数据存储器(RAM),器件采用高密度、非易失性存储技术生产,与标准 MCS-51 指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和 Flash 存储单元,功能强大 STC89C52 单片机适合于许多较为复杂控制应用场合。
STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0、P1、P2、P3,每一条I/O线都能独立地作输出或输入。
STC89C52 PDIP管脚封装,如图2所示。
图2 STC89C52单片机内部引脚封装图
STC89c52包含以下部分:
(1)一个8位微处理器CPU
(2)片内数据存储器RAM和特殊功能寄存器SFR
(3)片内程序存储器ROM
(4)两个定时/计数器T0、T1,可用作定时器,也可用以对外部脉冲进行计数
(5)四个8位可编程的并行I/O端口,每个端口既可作输入,也可作输出
(6)一个串行端口,用于数据的串行通信
(7)中断控制系统
(8)内部时钟电路
2.2 DS18B20温度传感器
(1) DS18B20的主要特征:
▲全数字温度转换及输出。
▲先进的单总线数据通信。
▲最高12位分辨率,精度可达土0.5摄氏度。
▲ 12位分辨率时的最大工作周期为750毫秒。
▲多样封装形式,适应不同硬件系统。
·
(2) DS18B20内部结构:
图3 DS18B20内部结构框图
温度传感器DS18B20的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图2.4所示。
2.3 蜂鸣器的报警原理(三极管驱动的蜂鸣器报警电路)
图4 蜂鸣器设计原理图
P1.0接三极管输入端。
当P1.0输出低电平时,三极管导通,压电式蜂鸣器两端获得的+5V电压而鸣叫:当P1.0输出高电平,三极管截止,蜂鸣器停止发音。
3.单元电路设计
3.1单片机电路图设计
本系统使用儿的基于单片机的温度计的设计所以首先设计单片机的最小系统,所谓最小系统是一个真正可用的单片机的最小配置系统。
由于本次设计所是用的stc89c52单片机片内不能集成始终电路所需的晶体振荡器,也没有复位电路,在构成最小系统时必须外接这些部件。
电路设计如下,其中电容为22PF ,晶振为12MHZ。
图5 单片机原理图
3.2温度传感器DS18B20电路图设计
主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图 3.4 所示。
其中,DQ 为数据输入/输出引脚,也可用作开漏单总线接口引脚,当被用在寄生电源工作方式下,可以向器件提供电源;GND为地信号;VDD为可选择的电源引脚,当工作于寄生电源时,此引脚必须接地。
其电路图6所示。
图6 DS18B20温度传感器设计图
3.3蜂鸣器电路图设计
压电式蜂鸣器约10mA的驱动电流,可以使用TTL系列集成电路7406或7407低电平驱动,这里我选用了一个三极管来做驱动。
P1.0接三极管输入端。
当P1.0输出低电平时,三极管导通,压电式蜂鸣器两端获得的+5V电压而鸣叫:当P1.0输出高电平,三极管截止,蜂鸣器停止发音。
图7 蜂鸣器设计原理图
4.软件设计
4.1流程图设计
图8 程序设计流程图
4.2程序设计
温度报警系统
端口说明
公共端是P2.0-P2.3,数码管显示用P0口ds18B20是P3.6,蜂鸣器P3.7, set按键是P3.1, 减法键是P3.2,加法键是P3.3
DS18B20.C
/******************************************************************
程序名称:DS18B20温度测量、报警系统
简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度
可设置上限报警温度、下限报警温度
即高于上限值或者低于下限值时蜂鸣器报警
默认上限报警温度为38℃、默认下限报警温度为5℃
报警值可设置范围:最低上限报警值等于当前下限报警值
最高下限报警值等于当前上限报警值
将下限报警值调为0时为关闭下限报警功能
******************************************************************/
#include <AT89X52.h>
#include "DS18B20.h"
#define uint unsigned int
#define uchar unsigned char //宏定义
#define SET P3_1 //定义调整键
#define DEC P3_2 //定义减少键
#define ADD P3_3 //定义增加键
#define BEEP P3_7 //定义蜂鸣器
bit shanshuo_st; //闪烁间隔标志
bit beep_st; //蜂鸣器间隔标志
sbit DIAN = P0^7; //小数点
uchar x=0; //计数器
signed char m; //温度值全局变量
uchar n; //温度值全局变量
uchar set_st=0; //状态标志
signed char shangxian=38; //上限报警温度,默认值为38
signed char xiaxian=5; //下限报警温度,默认值为38
uchar code LEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,}; /*****延时子程序*****/
void Delay(uint num)
{
while( --num );
}
/*****初始化定时器0*****/
void InitTimer(void)
{
TMOD=0x1;
TH0=0x4c;
TL0=0x00; //50ms(晶振11.0592M)
}
/*****定时器0中断服务程序*****/
void timer0(void) interrupt 1
{
TH0=0x4c;
TL0=0x00;
x++;
}
/*****外部中断0服务程序*****/
void int0(void) interrupt 0
{
EX0=0; //关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian<xiaxian)shangxian=xiaxian;
}
else if(DEC==0&&set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
/*****外部中断1服务程序*****/
void int1(void) interrupt 2
{
EX1=0; //关外部中断1
if(ADD==0&&set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
else if(ADD==0&&set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
}
}
/*****读取温度*****/
void check_wendu(void)
{
uint a,b,c;
c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差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;} //设置温度显示上限
}
/*****显示开机初始化等待画面*****/
Disp_init()
{
P0 = 0x40; //显示-
P2 = 0x08;
Delay(200);
P2 = 0x04;
Delay(200);
P2 = 0x02;
Delay(200);
P2 = 0x01;
Delay(200);
P2 = 0x00; //关闭显示
}
/*****显示温度子程序*****/
Disp_Temperature() //显示温度
{
P0 =0x39; //显示C
P2 = 0x08;
Delay(300);
P0 =LEDData[n]; //显示个位
P2 = 0x04;
Delay(300);
P0 =LEDData[m%10]; //显示十位
DIAN =1; //显示小数点
P2 = 0x02;
Delay(300);
P2 = 0x00; //关闭显示
}
Disp_alarm(uchar baojing) /*****显示报警温度子程序*****/
{
P0 =0x39; //显示C
P2 = 0x08;
Delay(200);
P0 =LEDData[baojing%10]; //显示十位
P2 = 0x04;
Delay(200);
if(set_st==1)P0 =0x76;
else if(set_st==2)P0 =0x38; //上限H、下限L标示
P2 = 0x01;
Delay(200);
P2 = 0x00; //关闭显示
}
void Alarm()/*****报警子程序*****/
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=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; //关闭蜂鸣器
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; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st) {Disp_alarm(xiaxian);}
}
}
}
/*****END*****/
5.小结
89S52 芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测控,性能稳定,精度教高,而且扩展性能很强大。
由于DS18B20的测量精度只有±0.5 度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正。
由于
DS18B20 是基于带隙结构的数字式温度传感器,PN 结增量电压正比于IC 绝对温度(PTAT),它的测温精度较高,但存在着一定的误差.不过,其误差在时间和外部环境变化的条件下,保持相当高的稳定性。