当前位置:文档之家› 传感器课程设计

传感器课程设计

地下室火灾报警器学院:信息工程学院班级:13普本测控学号:姓名:目录摘要 (1)一、绪论 (2)1.1 课题描述 (2)1.2 方案设计 (2)1.3 方案比较: (2)1.4 基本工作原理及框图 (3)二、相关芯片、传感器及硬件电路设计 (4)2.1 STC89C52RC芯片 (4)2.2 DS18B20 温度传感器 (5)2.3 LCD1602字符型液晶 (6)2.4 光敏电阻 (7)三、系统软件设计[2] (9)3.1温度传感器控制程序 (9)3.2 液晶屏控制程序 (13)3.3主程序“main.c” (15)四、总结 (21)五、参考文献 (22)地下室火灾报警器摘要本设计是用于地下室的火灾报警,利用火灾发生时产生的剧烈光强,还有高温,进行感光感温报警。

同时如果地下室存放的是一些温度敏感的物品,也可以通过设置进行温度过高/过低报警。

用到的传感器主要有温度传感器DS18B20和光电传感器光敏电阻。

关键词:DS18B20,光敏电阻,STC89C52,LCD1602一、绪论1.1 课题描述地下室常作为人们的杂物间使用,或者充当饭店的酒窖功能,里面经常摆放着很多易燃物品,由于地下室经常潮湿和经常飘散的灰尘会使普通的烟雾报警器误报[1]。

所以设计此种地下室火灾报警器。

1.2 方案设计方案一:火灾发生的时候会有光亮,会使昏暗的地下室光强出现变化,故采用光敏电阻设计此报警器;方案二:火灾发生的时候会产生大量热量,会使阴冷的地下室温度变化,故采用温度传感器设计此报警器;方案三:由于火灾发生时产生光和热,同时采用光敏电阻和温度传感器级联设计此报警器。

1.3 方案比较:方案一只采用光敏电阻,电路设计比较简单,但是如果地下室入口没有密封好,或者地下室开有透光窗,外界光强变化时,容易出现报警器误报;方案二采用温度传感器设计,电路上和方案三相当,但是如果地下室密封性好,地下室的一些容易发酵的酒水或者其他粮食蔬菜之类的发酵产生的大量热量,也会使报警器出现误报;方案三综合光强变化和温度变化,电路设计上只比方案二多一个光敏传感器,但是却同时具备了光强和温度传感。

如果地下室密封性好,温度升高的时候并没有光照变化,避免误报;如果地下室密封性不好或者开有透光窗,光强变化的时候,发酵产生的热量及时的散出地下室,报警器也不会误报。

只有火灾时候瞬间产生高温不会及时散去,而且有大量光照,报警器才会工作。

综合以上方案,故采用方案三。

1.4 基本工作原理及框图1.4.1 工作原理:温度传感器测温,在lcd1602上实时显示温度。

当温度超过设置的标准温度时,打开外部中断。

如果没有中断,主程序继续检测温度报警开关K1是否打开,如果温度报警开关关闭,则程序返回开始位置继续测温。

如果温度报警开关打开,则出现提示音“地下室温度过高,请及时通风”。

在温度过高时,同时出现了光照,光敏电阻阻值减小,电压拉低,则出现外部中断,提示音“地下室有火情”。

1.4.2程序流程图:主程序:中断处理程序:1.4.3框图:按键1:设置报警温度+;按键2:设置报警温度-;按键3:设置每次加减的大小(1或者5);按键4:退出设置;开关1:打开/关闭温度报警;温度报警:用LED灯亮表示;火灾报警:用蜂鸣器响表示;二、相关芯片、传感器及硬件电路设计2.1 STC89C52RC芯片STC89C52RC是STC公司生产的一款8051内核芯片,内部含有Flash EEPROM,为CMOS产品,内部有8KB的程序存储空间,512B的RAM。

因为本设计应用于火灾报警,因此要选用温度范围-40℃至+85℃的工业级产品。

外部晶振最高可接入40MHz,双列直插式封装。

需要为维持51单片机运行搭建最小系统,硬件连接如图。

2.2 DS18B20 温度传感器使用DS18B20单线数字温度传感器具有以下优点:(1)和微处理器连接时,仅需要一个I/O口就可实现。

单总线具有经济性好、抗干扰能力强、使用方便等优点;(2)测温范围宽,测量精度高:DS18B20测温范围为-55℃到+125℃;在-10℃至+85℃范围内,精度为±0.5℃。

(3)测量参数可配置:DS18B20测量分辨率可通过程序设定9-12位。

(4)DS18B20体积小、适用电压宽。

DS18B20连接如图:测温电路实图:2.3 LCD1602字符型液晶LCD1602是一种专门用来显示字母、数字、符号的点阵型液晶模块。

它是由若干个5x7或者5x11的点阵字符位组成,一共可显示2行,每行可显示16个字符,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。

LCD1602的电路图如图液晶连接实物图:2.4 光敏电阻光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的一种电阻器,又称为光电导探测器,入射光强,电阻减小,入射光弱,电阻增大。

光敏电阻部分的电路如图:总电路图如图:总电路实图:三、系统软件设计[2]3.1温度传感器控制程序3.1.1头文件名“ds18b20.h”#ifndef _DS18B20_H_#define _DS18B20_H //定义ds18b20.h#include <reg52.h>#ifndef uchar#define uchar unsigned char#endif //定义uchar为类型unsigned char#ifndef uint#define uint unsigned int#endif //定义uint 为类型unsigned intsbit DSIO = P2^3; //将P2^3命名为DSIOvoid TempDelay1ms(); //声明一个延时1ms的函数void TempDelay100ms(); //声明一个延时100ms的函数uchar Ds18b20Init(); //声明DS18B20的初始化函数void Ds18b20WriteByte(uchar dat); //声明一个函数将一个8位的二进制数写入DS18B20uchar Ds18b20ReadByte(); //声明一个函数读取DS18B20的一个8位二进制数void Ds18b20ChangTemp(); //声明一个函数写入温度转换命令到DS18B20void Ds18b20ReadTempCom(); //声明一个函数发送读取温度命令到DS18B20int Ds18b20ReadTemp(); //声明一个函数读取温度并返回#endif3.1.2源文件名“ds18b20.c”#include"ds18b20.h"void TempDelay1ms(){uchar a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void TempDelay100ms(){uchar a,b,c;for(c=19;c>0;c--)for(b=20;b>0;b--)for(a=130;a>0;a--);}uchar Ds18b20Init(){uint i;DSIO=0; //拉低总线i=70;while(i--); //延时DSIO=1; //释放总线while(DSIO){i++;if(i>5)return 0; //初始化失败}return 1; //初始化成功}void Ds18b20WriteByte(uchar dat){uint i,j;for(j=0;j<8;j++){DSIO=0; //拉低总线i++; //延时DSIO=dat&0x01; //从最低位开始送数据到ds18b20i=6;while(i--); //延时DSIO=1; //释放总线dat>>=1; //数据移位,准备送下一位}}uchar Ds18b20ReadByte(){uchar byte,bi;uint i,j;for(j=8;j>0;j--){DSIO=0; //拉低总线i++; //延时DSIO=1; //释放总线i++;i++; //延时bi=DSIO; //读ds18b20传到总线的数据,从最低位开始byte=(byte>>1)|(bi<<7); //移位,准备读取下一位i=4;while(i--); //延时}return byte; //返回读取到的数据}void Ds18b20ChangTemp(){Ds18b20Init(); //初始化TempDelay1ms(); //延时Ds18b20WriteByte(0xcc); //跳过ROM操作Ds18b20WriteByte(0x44); //发送温度转换命令TempDelay100ms(); //延时}void Ds18b20ReadTempCom(){Ds18b20Init(); //初始化TempDelay1ms(); //延时Ds18b20WriteByte(0xcc); //跳过ROM操作Ds18b20WriteByte(0xbe); //发送读取温度命令}int Ds18b20ReadTemp(){uint temp=0;uchar tmh,tml;Ds18b20ChangTemp(); //发送温度转换命令Ds18b20ReadTempCom(); //发送读取温度命令tml=Ds18b20ReadByte(); //读取温度(共16位),先读低8位tmh=Ds18b20ReadByte(); //读取温度高8位temp=tmh;temp<<=8;temp|=tml; //将16位温度数据保存到16位变量tempreturn temp; //返回温度值}3.2 液晶屏控制程序3.2.1头文件名“lcd1602.h”#ifndef _LCD1602_H_#define _LCD1602_H_ //定义lcd1602.h#include<reg51.h>#ifndef uchar#define uchar unsigned char //定义uchar为类型unsigned char#endif#ifndef uint#define uint unsigned int //定义uint 为类型unsigned int#endif#define GPIO_LCD P1 //定义GPIO_LCD替换P1,作为lcd1602的输入sbit RS=P2^0; //声明RS为I/O口P2^0sbit RW=P2^1; //声明RW为I/O口P2^1sbit E=P2^2; //声明E为I/O口P2^2void LcdDelay5ms(); //声明一个延时5ms的函数void LcdWriteCom(uchar com); //声明一个函数给lcd1602写入命令void LcdWriteData(uchar dat); //声明一个函数给lcd1602写数据void LcdInit(); //声明一个函数lcd1602初始化#endif3.2.2源文件名“lcd1602.c”#include"lcd1602.h"void LcdDelay5ms(){uchar a,b;for(b=19;b>0;b--)for(a=130;a>0;a--);}void LcdWriteCom(uchar com){RS=0; //操作命令RW=0; //写操作E=0; //关闭使能GPIO_LCD=com; //命令送到P1口LcdDelay5ms(); //延时(大于40ns)E=1; //开使能LcdDelay5ms(); //延时(大于150ns)E=0; //写命令结束,关闭使能}void LcdWriteData(uchar dat){RS=1; //操作数据RW=0; //写操作E=0; //关闭使能GPIO_LCD=dat; //将数据送到P1口LcdDelay5ms(); //延时(大于40ns)E=1; //开使能LcdDelay5ms(); //延时(大于150ns)E=0; //写数据结束,关闭使能}void LcdInit(){LcdWriteCom(0x38); //设置显示模式(8位总线,双行显示,5*7点阵字符)LcdWriteCom(0x0c); //显示开关控制(整屏显示开,不显示光标)LcdWriteCom(0x06); //设置输入模式,读/写一个字符,地址指针加1,整屏显示不动LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据存储器地址(第一行第一位)}3.3主程序“main.c”#include <reg51.h>#include "lcd1602.h"#include "ds18b20.h"sbit Key1=P2^7;sbit Key2=P2^6;sbit Key3=P2^5;sbit Key4=P2^4;sbit K1=P3^0;sbit LED=P3^6;sbit BZ=P3^7;int temp100;/*温度显示函数*/void TempDisplay(int temp) {int a;uchar datas[]={0,0,0,0,0};float tp;a=temp;if(temp<0){LcdWriteCom(0x86);LcdWriteData('-');a-=1;a=~a;tp=a;a=tp*0.0625*100+0.5;}else{LcdWriteCom(0x86);LcdWriteData('+');tp=a;a=tp*0.0625*100+0.5;}temp100=a;datas[0]=a/10000;datas[1]=a%10000/1000;datas[2]=a%1000/100;datas[3]=a%100/10;datas[4]=a%10;LcdWriteCom(0x87);LcdWriteData(datas[0]+'0');LcdWriteData(datas[1]+'0');LcdWriteData(datas[2]+'0');LcdWriteData('.');LcdWriteData(datas[3]+'0');LcdWriteData(datas[4]+'0');}void main(){/*初始化*/uchar i,step,set;uchar code st[]="STD:";uchar code wd[]="TEMP:";uchar code sp[]="STEP:";uchar sets[]={0,0,0};int temp;Ds18b20Init();Ds18b20ChangTemp();LED=0;BZ=0;LcdInit();EA=1;//中断允许EX0=0;//外部中断0关set=24;//默认报警温度step=1;//默认每次加/减温度的步长P2|=0xf0;//按键IO写1,准备读取按键状态K1=1;//报警开关IO口写1,准备读取报警开关状态/*进入报警温度设置,Key1(报警温度加),Key2(报警温度减),Key3(每次加/减d 步长1或者5),Key4退出设置,按复位键重新进入设置*/ while(Key4){LcdWriteCom(0xc0);for(i=0;i<4;i++){LcdWriteData(st[i]);}//显示字符stdLcdWriteCom(0xc8);for(i=0;i<5;i++){LcdWriteData(sp[i]);}//显示字符stepsets[0]=set/100;sets[1]=set%100/10;sets[2]=set%10;LcdWriteCom(0xc4);for(i=0;i<3;i++){LcdWriteData('_');}//std的温度闪烁LcdDelay5ms();LcdWriteCom(0xc4);for(i=0;i<3;i++){LcdWriteData(sets[i]+'0');}//显示std的设定温度LcdDelay5ms();LcdDelay5ms();LcdDelay5ms();LcdDelay5ms();LcdDelay5ms();LcdWriteCom(0xce);LcdWriteData(step+'0');//显示步长if(Key1==0){LcdDelay5ms();if(Key1==0){if(set<100)set+=step;elseset=24;}while(!Key1);}if(Key2==0){LcdDelay5ms();if(Key2==0){if(set>24)set-=step;elseset=100;}while(!Key2);}if(Key3==0){LcdDelay5ms();if(Key3==0){switch(step){case(1):step=5;break;case(5):step=1;break;}}while(!Key3);}}/*进入测温程序*/while(1){temp=Ds18b20ReadTemp();LcdWriteCom(0x80);for(i=0;i<5;i++){LcdWriteData(wd[i]);}LcdWriteCom(0x8e);LcdWriteData('C');TempDisplay(temp);if(temp100>(set*100)){IT0=1;//外部中断0电平触发EX0=1;//外部中断0开if(K1==1){LED=1;}}else{LED=0;}}}/*光照中断函数*/void HZ() interrupt 0{BD=1;while(1);}四、总结此地下室火灾报警器可以对一般明火火情及时反应工作,但是像其他火灾报警器一样,对于阴燃火情发现不及时。

相关主题