基于AT89C51单片机温度报警系统设计与制作.docx

上传人:b****5 文档编号:6826366 上传时间:2023-01-10 格式:DOCX 页数:17 大小:278.90KB
下载 相关 举报
基于AT89C51单片机温度报警系统设计与制作.docx_第1页
第1页 / 共17页
基于AT89C51单片机温度报警系统设计与制作.docx_第2页
第2页 / 共17页
基于AT89C51单片机温度报警系统设计与制作.docx_第3页
第3页 / 共17页
基于AT89C51单片机温度报警系统设计与制作.docx_第4页
第4页 / 共17页
基于AT89C51单片机温度报警系统设计与制作.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于AT89C51单片机温度报警系统设计与制作.docx

《基于AT89C51单片机温度报警系统设计与制作.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机温度报警系统设计与制作.docx(17页珍藏版)》请在冰豆网上搜索。

基于AT89C51单片机温度报警系统设计与制作.docx

基于AT89C51单片机温度报警系统设计与制作

一、摘要

我们介绍的是一种基于单片机控制的数字温度报警,本温度系统具有多功能性,即可以当数字温度计使用,显示当前环境温度,又可以作为报警器使用,设置报警温度,当温度不在设置范围内时,可以报警,并采取措施使温度下降。

该温度报警系统控制器使用单片机AT89C51,测温传感器使DS18B20,用2位共阳极LED数码管,实现温度显示,能准确达到以上要求。

二、设计方案

1、方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

2、方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

温度报警系统电路设计总体设计方框图如图1所示

LED显示

温度传感器器

蜂鸣器报警

小风扇转动

图1 总体设计方框图

 

三、模块功能分析

1、单片机主板电路

单片机AT89C51具有低电压供电和体积小等特点,该模块包括中央处理CPU-AT89C51、时钟电路及复位电路;

图2复位电路图3时钟电路

2、DS18B20温度传感器与单片机的接口电路

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。

该电路完成了信号的采集、转换和传输。

图4

3、上下限报警调整电路

分别调整温度的上下限报警设置,有“+“、”“-”、“确定”等键

图5上下限报警调整电路

4、温度显示电路

显示当前测得的温度,数码管采用74LS247驱动

图6温度显示电路

5、报警电路

当环境温度超过设定温度时,蜂鸣器鸣叫,红灯点亮,发生报警;当人员发现警报时,可按图8中的按钮,暂时中断蜂鸣器的鸣叫。

图7蜂鸣器、亮灯报警电路图8中断电路

6、控制电路

该电路的作用是:

当测量温度超过设定温度时,小风扇以下转动,加快仪器散热,使温度保持在设定温度以下。

图9控制电路

四、整体构造及功能

整体电路图如下:

图10整体电路图

实现的总体功能:

●实现对环境温度的测量和显示

●能通过按键设置报警温度

●温度超过设置值时,产生光声报警

●报警同时系统自带小风扇转动以降低温度

主程序

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。

这样可以在一秒之内测量一次被测温度,其程序流程见下图所示

 

 

附录:

源程序

/*******************************************************************/

/*温度报警器*/

/*******************************************************************/

#include

#include

#defineucharunsignedchar

#defineTubeP0//数码管端口

#defineKeyP1//键盘端口

sbitDQ=P1^4;//温度传感器DS18B20数据传输端

sbitBUZZER=P1^5;//蜂鸣器端口

sbitRUN=P1^6;//运行指示灯端口

sbitSET=P1^7;//设置指示灯端口

sbitFeng=P3^3;//风扇端口

bitStatus;//设置状态标志位

bitWarning;//警报标志位

bitInt;//外部中断标志位

ucharOP1L;//原P1端低4位状态

ucharNP1L;//现P1端低4位状态

ucharFinT;//最终测得温度

ucharLimT;//警报温度下限

ucharCount;//定时器计数

/*******************************************************************/

#include"Delay.h"

#include"Display.h"

#include"Initialize.h"

#include"Error.h"

#include"KeyScan.h"

#include"Measure.h"

#include"Interrupt.h"

/*******************************************************************/

/*主程序*/

/*******************************************************************/

voidmain()

{

Initialize();//初始化

do{//开机自检,跳过默认初始的85℃

Measure();

}while(FinT==0X55);

while

(1){

KeyScan();//键盘扫描

Measure();//获取测量温度

Display();//显示

}

}

 

/*******************************************************************/

/*初始化*/

/*******************************************************************/

voidInitialize()

{

Status=0;//初始化设置状态标志位

Warning=0;//初始化警报标志位

BUZZER=1;//初始化蜂鸣器状态

RUN=0;//初始化运行指示灯

SET=1;//初始化设置指示灯

Feng=1;//初始化风扇端口

OP1L=0X00;//初始化原P1低4位

NP1L=0X00;//初始化新P1低4位

LimT=0X1B;//初始化警报温度下限为27℃

Count=0X00;//初始化定时器计数单元

EA=1;//开总中断

EX0=1;//开外部中断0中断允许

IT0=1;//设置外部中断0为边沿触发方式

}

 

/*******************************************************************/

/*温度测量*/

/*******************************************************************/

voidInitDS18B20();//初始化DS18B20

voidWriteDS18B20(ucharch);//写DS18B20数据

ucharReadDS18B20();//读DS18B20数据

voidMeasure()

{

ucharTemH;//保存传感器发送数据高8位

ucharTemL;//保存传感器发送数据低8位

InitDS18B20();

WriteDS18B20(0XCC);//跳过ROM

_nop_();

InitDS18B20();

WriteDS18B20(0XCC);//跳过ROM

_nop_();

WriteDS18B20(0X44);//发送温度转换指令

Delay1ms(25);

Delay1ms(25);

Delay1ms(25);

Delay1ms(25);//等待1s转换

InitDS18B20();

WriteDS18B20(0XCC);//跳过ROM

WriteDS18B20(0XBE);//发送温度转换指令

TemL=ReadDS18B20();//读低位温度值

TemH=ReadDS18B20();//读高位温度值

Delay1ms

(2);

TemH=(TemH<<4)|(TemL>>4);//保留温度值整数部分

FinT=TemH;

if(FinT>LimT){//判断是否警报

Warning=1;

}

else{

Warning=0;

}

}

ucharReadDS18B20()//读DS18B20数据

{

ucharch;

ucharq;

for(q=0;q<8;q++){

ch=ch>>1;

DQ=0;

_nop_();

DQ=1;

_nop_();

_nop_();

_nop_();

_nop_();

if(DQ==1){

ch=ch|0X80;

}

else{

ch=ch&0X7f;

}

Delay15us(3);

DQ=1;

}

return(ch);

}

voidWriteDS18B20(ucharch)//写DS18B20数据

{

uchari;

for(i=0;i<8;i++)

{

DQ=0;

Delay15us

(1);

DQ=ch&0X01;

Delay15us(3);

DQ=1;

ch=ch>>1;

_nop_();

}

}

voidInitDS18B20()//初始化DS18B20

{

DQ=0;

Delay15us(33);//至少延时480us

DQ=1;

Delay15us(10);//至少延时100us

}

 

/*******************************************************************/

/*显示*/

/*******************************************************************/

voidDisplay()

{

ucharT;

if(Status==1){//判断状态

T=LimT;

}

else{

T=FinT;

}

T=T%10+T/10*16;//将2进制码转化为BCD码

Tube=T;//数码管显示

RUN=Warning;//运行指示灯显示

BUZZER=!

Warning||Int;//蜂鸣器

Feng=!

Warning;//风扇

SET=!

Status;//设置指示灯显示

Delay1ms(20);

}

/*******************************************************************/

/*键盘扫描*/

/*******************************************************************/

voidKeyScan()

{

NP1L=Key;//读取按键状态

NP1L=NP1L&0X0F;

NP1L=NP1L^0X0F;

if(NP1L!

=OP1L){

switch(NP1L){//判断按键

case0X01:

//按键为“设置”

Status=1;//进入设置状态

break;

case0X02:

//按键为“+1”

if(Status==1){//判断是否为设置状态

LimT++;//警报温度下限+1

LimT=LimT%100;//超过99清零

Delay1ms(255);

}

else{

Error();

}

break;

case0X04:

//按键为“-1”

if(Status==1){//判断是否为设置状态

LimT--;//警报温度下限-1

if(LimT<0){

LimT=0X63;//低于0变为99

}

Delay1ms(255);

}

else{

Error();

}

break;

case0X08:

//按键为“确认”

Status=0;//返回测温状态

break;

default:

//多键按下

Error();//出错复位

break;

}

NP1L=0X00;//重新初始化

}

}

 

/*******************************************************************/

/*中断服务*/

/*******************************************************************/

voidInt0(void)interrupt0

{

Int=1;//外部中断标志位置1

EX0=0;//关外部中断0中断允许

TMOD=0X01;//设置定时器0工作在模式1

TH0=0X3C;

TL0=0XB0;//为T0赋初值,令其定时50ms

Count=0X3C;//设置计数次数

ET0=1;//开T0中断允许

TR0=1;//开T0中断

}

/*******************************************************************/

voidTimer0(void)interrupt1

{

if(Count==0){//判断定时计数是否结束

ET0=0;//关T0中断允许

TR0=0;//关T0中断

Int=0;//外部中断标志位置0

EX0=1;//开外部中断0中断允许

}

else{

TL0=0XB0;//重新赋T0初值

TH0=0X3C;

Count--;//定时计数减1

}

}

/*******************************************************************/

/*延迟函数*/

/*******************************************************************/

voidDelay15us(ucharn)//延迟n*15us

{

do{

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

_nop_();

n--;

}while(n);

}

voidDelay1ms(uchardelay)//延迟delay*1ms

{

uchari;

while(delay--)

{

for(i=0;i<124;i++);

}

}

/*******************************************************************/

/*报错复位*/

/*******************************************************************/

voidError()

{

Tube=0XAA;//出错显示

BUZZER=0;//鸣蜂鸣器

RUN=1;//LED警报

Delay1ms(255);//延迟

Delay1ms(255);

Delay1ms(255);

Delay1ms(255);

Delay1ms(255);

(*(void(*)())0)();//软复位

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1