基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx

上传人:b****6 文档编号:6946177 上传时间:2023-01-13 格式:DOCX 页数:34 大小:310.28KB
下载 相关 举报
基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx_第1页
第1页 / 共34页
基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx_第2页
第2页 / 共34页
基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx_第3页
第3页 / 共34页
基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx_第4页
第4页 / 共34页
基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx

《基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx》由会员分享,可在线阅读,更多相关《基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx(34页珍藏版)》请在冰豆网上搜索。

基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述.docx

基于DS18B20和MQ2的单片机控制的温度烟雾报警系统综述

福建师范大学协和学院

传感器技术作品设计

作品名称:

单片机控制的温度烟雾报警系统

系别:

信息技术系

专业:

电子信息工程

班级:

1班

学号:

学生姓名:

 

2012年11月10日

摘要

__本次设计课题为基于单片机控制的温度烟雾报警系统。

在设计中包括硬件和软件设计两部分,其中硬件设计,包括单片机控制电路、温度传感器、烟雾传感器、驱动执行报警电路、显示控制电路等部分组成,处理器为STC89C52型单片机。

随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测与显示系统应用于诸多领域。

传统的温度检测以热敏电阻为温度敏感元件。

热敏电阻的成本低,需要外加信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。

与传统的温度计相比,这次设计的是基于DS18B20的数字温度计,它具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。

关键字:

单片机温度传感器报警

 

3核心器件介绍

3.1.单片机STC89C52介绍

3.2DS18B20介绍

1绪论

1.1作品研究背景及意义

自动控制领域中,温度检测与控制占有很重要的地位。

温度检测在工农业生产、科研和在人们的生活中得到广泛的运用。

目前,温度传感器正从模拟式向数字集成式方向飞速发出,单片机也是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好更方便的设施就需要从单片机技术入手,一切向着数字化、智能化方向发展。

本文就是基于此目的介绍基于单片机和数字温度传感器的温度报警设计。

1.2设计目的

•了解温度传感器DS18B20和烟雾传感器MQ-2的基本原理、性能与应用。

•熟悉单片机STC89C52工作方式和应用。

•通过实验提高对单片机的认识。

•掌握DS18B20和烟雾传感器MQ-2的接口方法及其输入程序的设计和调试方法。

•将所学的单片机原理及检测技术的知识运用于实践,解决实际问题.

•通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术了解电路参数的计算方法。

1.3预期实现功能

•1.实时监测温度并在液晶屏上显示。

•2.温度低于设定的低温警报值或高于设定的高温警报值将产生声光警报,并打开继电器开关,关闭外围电路电源。

•3监测到烟雾也将产生声光警报。

2设计方案

2.1功能框架图

本设计主要包括主控模块(STC89C52单片机),温度采集器(DS18B20),烟雾传感器(MQ-2),时钟模块,液晶显示器(LCD1602),报警器(蜂鸣器)和4个按键组成的一个完整系统。

2.2具体设计方案

2.2.1时钟和复位电路

单片机STC89C52使用的时钟电路比较简单,我们采用的是晶体振荡器产生时钟源。

XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2(X2)是来自反向振荡器的输出,分别接到单片机的19脚和18脚。

当按下按键S22时,VCC通过R22电阻给复位输入端口一个高电平,实现复位功能,即手动复位这样就不用在重起单片机电源。

上电复位就是VCC通过电阻R2和电容C构成回路,该回路是一个对电容C充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。

 

2.2.2液晶显示电路模块

2.2.5声音报警电路模块

Sbitfeng=P3.7;//定义蜂鸣器的引脚

Feng=1;//蜂鸣器关闭

Feng=0;//蜂鸣器打开

3核心器件介绍

3.1单片机STC89C52介绍

单片机STC89C52是8位高性能MCU,超低功耗:

掉电模式下典型功耗<0.1LLA,空闲模式下典型功耗2mA.正常工作模式下典型功耗47mA具有8kF1ash存储器、512kBRAM、2kE2pROM、降低EMI功能、ISP(在系统可编程)功能单片机内部的看门狗电路经过特殊处理.是真正的看门狗.可放心省去外部看门狗缺省为关闭.打开后无法关闭,单倍速和双倍速可反复设置。

单片机STC89C52和各个模块的接口主要是对STC89C52的I/O口进行约束,规定其为输出还是输入,输入主要是按键电路部分和时钟,输出则为报警和显示部分,其I/O分配如下图3.8所示。

图3.8单片机STC89C52I/O接口电路

3.2DS18B20介绍

DS18B20是DALLAS公司生产的一线式传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55摄氏度到+125摄氏度,可编程为9到12位A/D转换精度,测温分辨率可达0.0625摄氏度,被侧温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生。

CPU只需一根端口线就能与诸多DS18B20通信,占用问处理器的端口较少,可节省大量的引线和逻辑电路。

DS18B20主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH个TL、配置寄存器。

DS18B20中的温度传感器可完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625摄氏度/LSB形式表达,其中S为符号位。

例如+125摄氏度的数字输出为07DOH,+25.0625摄氏度的数字输出为0191H,-25.0625摄氏度的数字输出为FF6FH,-55摄氏度的数字输出为FC90H.

DS18B20采用一线通信接口。

因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。

主要首先提供以下功能命令之一:

⑴读ROM指令0X33,⑵ROM匹配指令0X55,⑶搜索ROM指令0XF0,⑷跳过ROM指令0XCC,⑸报警检查指令0XEC。

这些指令操作作用在没有一个器件的64位光刻ROM序列号。

图3.9DS18B20的两种封装形式

4.电路的制作与调试

4.1器件清单

元件清单

器材名称

型号

片数

固定电阻

10k/0.25W

10

固定电阻

4.7k/0.25W

1

固定电阻

5.1K/0.25W

1

固定电阻

1K/0.25W

2

蜂鸣器

1.5V

1

液晶显示器

LCD1602

1

IC插座

DIP8针

2

IC插座

DIP40

1

ISP插座

5*2插座

1

单排插座(排母)

2.54MM1*40

1

LED发光二极管

红色,黄色

2

单片机

STC89C52

1

直插三极管

2N-3904

1

USB下载器

STC89C52

1

杜邦线

连线

3

温度传感器

DS18B20

1

4.2.调试过程

(1)电路板插上电源,电源工作指示灯没有亮。

解决办法:

将万用表打到二极管图标的位置,检测电源线路是否有阻值,最后发现第一个电源线没有与焊盘焊在一起,导致电路板即使插上电源也没有电,最后将焊盘和电源线焊在一起,插上电源就有电了。

(2)电路板不能进行烧写。

解决办法:

用万用表检测电路,发现几个脚有虚焊,用锡将其焊好。

4.3实验总结

要完整的设计一个智能温度控制器,并且能有效的应用在工业化温度控制或置于某一环境温度控制中,还都需要提供电源、系统组装与调试等诸多方面的协调和配合。

本文只是初步的设计了智能温度控制器的核心部件,如温度采集、处理、显示、蜂鸣器的报警、运用外部按键设定警报值以及继电器的控制等。

然而,对于如何针对加热和制冷设备的如何实现,以及扩展到对湿度等其它环境要素的测量和控制,如何使它们同时集成在一个电路系统中,这些都还未得到有效的解决,值得进一步研究和探讨。

5.电路实物图

6.附录

电路仿真图:

硬件设计电原理图:

硬件设计PCB图:

源代码:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitLCD_RS=P2^0;

sbitLCD_RW=P2^1;

sbitLCD_EN=P2^2;

voidDelay_ms(uintxms);//延时函数声明

bitlcd_busy();//忙检查函数声明

voidlcd_wcmd(ucharcmd);//写指令寄存器IR函数声明

voidlcd_wdat(uchardat);//写指令寄存器DR函数声明

voidlcd_clr();//清屏函数声明

voidlcd_init();//LCD初始化函数声明

voidDelay_ms(uintxms)//延时函数

{

uinti,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

voiddelayNOP()

{

_nop_();

_nop_();

_nop_();

_nop_();

}

bitlcd_busy()//LCD忙碌检查函数

{

bitresult;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

result=(bit)(P0&0x80);

LCD_EN=0;

returnresult;

}

 

voidlcd_wcmd(ucharcmd)//写指令寄存器IR函数

{

while(lcd_busy());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=0;

}

voidlcd_wdat(uchardat)//写指令寄存器DR函数

{

while(lcd_busy());

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=0;

}

voidlcd_clr()//LCD清屏函数

{

lcd_wcmd(0x01);

Delay_ms(5);

}

 

voidlcd_init()//LCD初始化函数

{

Delay_ms(15);

lcd_wcmd(0x38);

Delay_ms(5);

lcd_wcmd(0x38);

Delay_ms(5);

lcd_wcmd(0x38);

Delay_ms(5);

lcd_wcmd(0x0c);

Delay_ms(5);

lcd_wcmd(0x06);

Delay_ms(5);

lcd_wcmd(0x01);

Delay_ms(5);

}

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P1^3;//ds18b20与单片机连接口

sbitRS=P2^5;

sbitRW=P2^6;

sbitEN=P2^7;

sbitK1=P3^2;//按键K1

sbitK2=P2^0;//按键K2

sbitK3=P2^1;//按键K3

sbitK4=P2^2;//按键K4

sbityanwu=P3^3;//烟雾接口

sbitLED1=P2^3;

sbitLED2=P2^4;

/*********温度警报值**********************/

unsignedcharFU1=0;//,TH1=0,TZ1=3,TL1=0;//高温负号标志百位十位个位

unsignedcharFU2=0;//,TH2=0,TZ2=3,TL2=0;//低温负号标志百位十位个位

uintTH=300;

uintTL=250;

sbitfeng=P3^7;//蜂鸣器接口

unsignedcharbfeng1,bfeng2;

unsignedcharcodestr1[]={"temp:

"};

unsignedcharcodestr2[]={"DS18B20OK"};

unsignedcharcodestr4[]={"SETTH:

"};

unsignedcharcodestr5[]={"SETTL:

"};

unsignedcharcodestr3[]={""};

unsignedcharcodemenu2_H[]={">H"};//温度过高时,第2行显示高温报警符号

unsignedcharcodemenu2_L[]={"

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

unsignedcharhhh=1;

/*************************警报值判断**************************/

voidpanduan()

{

if(tflag==0)

{

if(FU1==0)

if(TH>(tvalue))

{

bfeng1=0;

}

else

{

bfeng1=1;

}

else

{

bfeng1=0;

}

if(FU2==0)

if(TL

{

bfeng2=0;

}

else

{

bfeng2=1;

}

else

{

bfeng2=0;

}

}

else

{

if(FU2==0)

{

bfeng1=0;

}

else

if(TH

{

bfeng1=0;

}

else

{

bfeng1=1;

}

if(FU2==0)

{

bfeng2=1;

}

else

if(TL>tvalue)

{

bfeng2=0;

}

else

{

bfeng2=1;

}

}

if(bfeng1==1||bfeng2==1)

{

feng=0;

LED1=1;

}

else

{

feng=1;

LED1=0;

}

}

/*************************lcd1602程序**************************/

voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)

{unsignedinti,j;

for(i=0;i

for(j=0;j<100;j++);

}

voidwr_com(unsignedcharcom)//写指令//

{delay1ms

(1);

RS=0;

RW=0;

EN=0;

P0=com;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidwr_dat(unsignedchardat)//写数据//

{delay1ms

(1);;

RS=1;

RW=0;

EN=0;

P0=dat;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidlcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

voiddisplay(unsignedchar*p)//显示//

{

while(*p!

='\0')

{

wr_dat(*p);

p++;

delay1ms

(1);

}

}

init_play()//初始化显示

{lcd_init();

wr_com(0xc1);

display(str1);

wr_com(0x83);

display(str2);

}

/******************************ds1820程序***************************************/

voiddelay_18B20(unsignedinti)//延时1微秒

{

while(i--);

}

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{unsignedchari=0;

for(i=8;i>0;i--)

{DQ=0;

DQ=wdata&0x01;

delay_18B20(10);

DQ=1;

wdata>>=1;

}

}

read_temp()/*读取温度值并转换*/

{uchara,b;

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

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

voidds1820disp()//温度值显示

{ucharflagdat;

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:

-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

wr_com(0xc6);

wr_dat(flagdat);//显示符号位

wr_com(0xc7);

wr_dat(disdata[0]);//显示百位

wr_com(0xc8);

wr_dat(disdata[1]);//显示十位

wr_com(0xc9);

wr_dat(disdata[2]);//显示个位

wr_com(0xca);

wr_dat(0x2e);//显示小数点

wr_com(0xcb);

wr_dat(disdata[3]);//显示小数位

wr_com(0xcc);

wr_dat(0xdf);

wr_com(0xcd);

wr_dat('C');

panduan();

if(bfeng1==1)

{

wr_com(0xce);

display(menu2_H);

}

else

{

if(bfeng2==1)

{

wr_com(0xce);

display(menu2_L);

}

else

{

wr_com(0xce);

display(str3);

}

}

}

/********************主程序***********************************/

voidmain()

{

EA=1;

EX0=1;

IT0=1;

EX1=1;

IT0=1;

init_play();//初始化显示

feng=1;

LED1=0;

LED2=1;

while

(1)

{

read_temp();//读取温度

ds1820disp();//显示

}

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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