湖州师范学院 课程设计总结报告
课程名称 系统设计与实践 项目名称 基于STC89C52的室内火、 气安全检测装置
专 业 电子信息工程 班 级 20130824 姓 名 学 号 指导教师 报告成绩
信息与工程学院 二〇一六年一月六日
《系统设计与实践训练》任务书
基于STC89C52的室内火、气安全检测装置
一、设计任务
采用STC89C52单片机、DS18B20和烟雾、气体传感器MQ-2等设计室内火灾、有毒气体泄露等多功能检测装置;
二、设计要求
(1)能检测火灾事故,并报警。
(2)能检测烟雾、有毒气体泄露事故,并报警。
(3)能实时显示室内温度值,并通过键盘设置温度报警上下限值。 (4)其它功能(自由发挥)
三、元器件清单
类型 单片机 温度传感器 运算放大器 烟雾传感器 底座 数码管 三极管 晶振 电容 型号 STC89C52RC(40脚DIP封装) DS18B20(DIP封装) LM358 MQ-2 DIP40 DIP8 共阳3连体 8550 12MHZ 30PF 22UF 10K、 1K 4.7K 470 103、102 轻触按键 5V蜂鸣器 红,绿色 数量 1 1 1 1 1 1 8 1 4 2 10 10 10 10 各2个 10 1 6 20个 20根 1 电阻 电位器 按键 蜂鸣器 发光二极管 排针 排线 万能板 2
《基于STC89C52的室内火、气安全检测装置》
系统设计与实践总结报告
一.系统设计目标
1. 使用温度传感器和烟雾传感器把环境温度和烟雾的浓度情况检测出来,显示温
度。
2. 设置温度上下限报警,烟雾报警:利用发光二极管,蜂鸣器等报警 二.系统总体方案设计
温度 DS18B20温度传感器 单 片 机 STC89C52 声光报警 烟雾 气体传感器MO—2 数码管显示 处理电路(比较器) 按键 三.系统详细设计 3.1 单片机最小系统
89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器, 一个5中断源两个优先级的中断结构,一个双工的串行口, 片上震荡器和时钟电路。
1
STC89C52管脚功能图
引脚说明:
·VCC:电源电压 ·GND:地
·P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。
·P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
·P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓冲能驱动4个TTL逻辑门电路。当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX @ DPTR)时,P2口送出高8位地址数据。在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。当利用8位地址线访问外部数据存储器时(例MOVX @R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
·P3口:P3是一带有内部上拉电阻的8位双向的I/O端口。P3口的输出缓冲能驱动4个TTL逻辑门电路。当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P3口同时具有AT89C51的多种特殊功能,具体如下表1所示: 端口引脚 P3.0 P3.1 第二功能 RXD (串行输入口) TXD(串行输出口) 2
P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 INT0 (外部中断0) INT1(外部中断1) T0(定时器0) T1(定时器1) WR(外部数据存储器写选通) RD(外部数据存储器都选通) 表1 P3口的第二功能
·RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
·ALE/PROG:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。当在Flash编程时还可以作为编程脉冲输出(PROG)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
·PSEN:程序存储允许时外部程序存储器的读选通信号。当AT89C52执行外部程序存储器的指令时,每个机器周期PSEN两次有效,除了当访问外部数据存储器时,
PSEN将跳过两个信号。
·EA/VPP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,EA必须同GND相连接。需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
当执行内部编程指令时,EA应该接到VCC端。
·XTAL1:振荡器反相放大器以及内部时钟电路的输入端。 ·XTAL2:振荡器反相放大器的输出端。
在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合D触发器CD4013,分频器CD4060,模拟转换开关CD4051,计数器74LS90等数字处理芯片,主要控制两大硬件模块,量程切换以及显示模块。下面还将详细说明。
3
3.2 气体检测模块
气体传感器MQ-2
MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
MQ-2气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。
MQ-2气敏元件的结构和外形如图3-2-1所示(结构 A 或 B), 由微型Al2O3陶瓷管、SnO2 敏感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加热器为气敏元件提供了必要的工作条件。封装好的气敏元件有6只针状管脚,其中4个用于信号取出,2个用于提供加热电流。基本电路如图3-2-2。
1 2 3 4 5 6 部件 气体敏感层 电极 测量电极引线 加热器 陶瓷管 防爆网 材料 二氧化锡 金(Au) 铂(Pt) 镍铬合金(Ni-Cr) 三氧化二铝 100目双层不锈钢(SUB316) 7 8 9 卡环 基座 针状管脚 镀镍铜材(Ni-Cu) 胶木或尼龙 镀镍铜材(Ni-Cu)
4
图3-2-1结构和外形
图3-2-2 MQ-2基本电路
信号调理及放大整形模块, LM358芯片
LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
特性:内部频率补偿;直流电压增益高(约100dB);单位增益频带宽(约1MHz);电源电压范围宽:单电源(3—30V);双电源(±1.5 一±15V);低功耗电流,适合于电池供电,低输入偏流,低输入失调电压和失调电流;共模输入电压范围宽,包括接地;差模输入电压范围宽,等于电源电压范围;输出电压摆幅大(0 至Vcc-1.5V)。
图3-2-3 LM358
5
3.3 温度检测模块
DS18B20工作原理
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图3-3-1所示。
图3-3-1 DS18B20内部结构图
64位ROM的位结构如图3-3-2所示。开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。非易失性温度报警器触发器TH和TL,可通过软件写入户报警上下限。
图3-3-2 64位ROM结构图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3-3-3所示。头2个字节包含测得的温度信息,第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义热图3-3-4所示。低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出
6
厂时该位被设置为0,用户不要改动,R1和R0决定温度转换得精度位数,即用来设置分辨率。
图3-3-3 高速暂存RAM结构图
图3-3-4 配置寄存器
由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要,系统对DS18B20的各种操作必须按协议进行.操作协议为:初始化DS18B20→发ROM功能命令→发存储器操作命令→处理数据.
图3-3-5 DS18B20测温原理图
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源.另一种是寄生电源供电方式,如图3-3-6所示.单片机端口接单线总线,为为保证有效DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉.
7
图3-3-6 DS18B20采用寄生电源的电路图
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us.采用寄生电源供电方式时Vdd和GND端均接地.由于单线制只有一根线,因此发送接口必须是三态的 3.4 数码管驱动模块 (电路图, 描述)
图3-4数码管驱动模块电路图
3.5按键部分设计
图3-5 按键部分电路图
8
3.6总的电路图
VCCU1VCCVCCP1.01P1.12P1.23P1.3 4P1.45P1.56P1.67P1.78RST9P3.010P3.111P3.212P3.313P3.414P3.515P3.616P3.717XT118XT21920P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RST/VPDP0.7RXD/ P3.0EA /VPPTXD /P3.1ALE/PROGTNT0 /P3.2PSENTNT1 /P3.3P2.7T0/P3.4P2.6T1/P3.5P2.5WR /P3.6P2.4RDP3.7P2.3XTAL2P2.2XTAL1P2.1VSSP2.0STC89C52VCCQ?PNPQ1VCC8550R?470R?1KR?1KR?1K4039383736353433323130292827262524232221工作指示灯KEY11kR1C122UFRSTR21KP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7S2P1.0S3P1.1S4P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0470R?R?RRES2?RRES2?RRES2?RES2R?470470abcdC330PFXT1Y112MXT2C230PFP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0P1.2S5P1.3V? com3 com1com2D?LEDQ?PNP efghQ?PNP1KR12VCCD?1AB6232HH5R?4R10103102LM358AR?1P0.0R1310KP1.4R41kLSP1.5P1.6P1.7VCCJ3P0.1123R134.7KDS18B203AB烟雾传感器VCC
图3-6电路原理图
四.软件设计 4.1主程序流程图
图4.1主程序流程图
9
4.2按键子程序流程图
图4.2 按键子程序流程图
六.参考文献 主要参考文献:
[1] 周立功.ARM&WinCE实践与实验:基于S3C2410[M]北京:北京航空航天大学出版社,
2007.
[2] 李朝青.PC机及单片机数据通信技术[M].北京:北京航空航天大学出版社,2000
[3] 马春华,于莉莉.SMS方式远程监控软件的设计与实现[J].广东通信技术,2003,23
(4):39-41. [4] 肖冬荣,殷传军.鲁棒GMC 控制及其工程应用[J]微计算机信息2007,30(3):21-23
10
附录:
(1) main.c
#include extern uchar flag; sbit Yanwu=P0^0; sbit Warn=P1^4; ucharcode num[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xc6,0xc7,0x89}; uchar disbuf[3]; uint Wendu=0,t_h=40,t_l=1; void delay_ms(int ms) //延时1ms子程序 { char i; while (ms--) { for(i = 110; i > 0; i--); //延时1秒钟 } } void delay(uint s) { uint n,m; for(n=0;n P1=0XDF;//第一位 P2=num[disbuf[0]]; delay(1); P2=0XFF; //消隐 P1=0XBF;//第二位 P2=num[disbuf[1]]; 11 delay(1); P2=0XFF;//消隐 P1=0X7F;//第三位 P2=num[disbuf[2]]; delay(1); P2=0XFF; } void main() { P2 = 0x00; P1 = 0x00; delay_ms (2000); while(1) { keyscan(); Wendu=Get_Tmp(); if((Wendu Warn=0; } else Warn=1; if(mode==0) { disbuf[0]=Wendu/1000%10; disbuf[1]=Wendu/100%10; disbuf[2]=10;//C } if(mode==1) { disbuf[1]=t_l/10%10; disbuf[2]=t_l%10; disbuf[0]=11;//L if(flag==1) { t_l++; if(t_l==20) t_l=0; flag=0; } } if(mode==2) { 12 disbuf[1]=t_h/10%10; disbuf[2]=t_h%10; disbuf[0]=12;//H if(flag==1) { t_h++; if(t_l==80) t_l=30; flag=0; } } display(); } } (2) keyscan.c #include \"keyscan.h\" #define uint unsigned int #define uchar unsigned char uchar mode=0; uchar flag; void keyscan() { static uchar keybuff[2]; static uchar key_Time_Num; keybuff[1]=keybuff[0]; keybuff[0]=P1&0x03; if(keybuff[0]!=keybuff[1]) { return ; } if(keybuff[0]==0x03) { key_Time_Num=0; } if((keybuff[0]==0x02)&&(key_Time_Num==0)) { mode++;mode%=3; key_Time_Num=1; } if((keybuff[0]==0x01)&&(key_Time_Num==0)) { 13 flag=1; key_Time_Num=1; } } (3) keyscan.h #ifndef _KEYSCAN_H_ #define _KEYSCAN_H_ #include #define uchar unsigned char #define uint unsigned int extern uchar mode,jia,jian; extern bit set_lh; void keyscan(void); extern void delay(uint ii); #endif (4) DS18B20.c #include /****************变量定义*************************************************/ uint temp; //测得室温 //////////////////////ds18b20温度传感器//////////////////////////////// void delay6(unsigned char i) { while(--i); } //DS18B20初始化 void Init_Ds18b20(void) { DQ = 1; //DQ复位,不要也可行。 delay6(1); //稍做延时 DQ = 0; //单片机拉低总线 delay6(250); //精确延时,维持至少480us 14 DQ = 1; //释放总线,即拉高了总线 delay6(100); //此处延时有足够,确保能让DS18B20发出存在脉冲。 } //读取一个字节的数据 //读数据时,数据以字节的最低有效位先从总线移出 uchar Read_One_Byte() { uchar i = 0; uchar dat = 0; for(i=8;i>0;i--) { DQ = 0; //将总线拉低,要在1us之后释放总线 //单片机要在此下降沿后的15us内读数据才会有效。 _nop_(); //至少维持了1us,表示读时序开始 dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。 DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay6(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 if(DQ) //控制器进行采样 { dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 } delay6(10); //此延时不能少,确保读时序的长度60us。 } return (dat); } //写一字节的数据函数 void Write_One_Byte(uchar dat) { uchar i=0; for(i=8;i>0;i--) { DQ=0; _nop_(); DQ =dat&0x01; delay6(10); DQ=1; dat >>= 1; 15 delay6(1); } } //获取室温 uint Get_Tmp() { float tt; uchar a,b; Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0x44); //温度转换指令 Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0xbe); //读暂存器指令 a = Read_One_Byte(); //读取到的第一个字节为温度LSB b = Read_One_Byte(); //读取到的第一个字节为温度MSB temp = b; //先把高八位有效数据赋于temp temp <<= 8; //把以上8位数据从temp低八位移到高八位 temp = temp|a; //两字节合成一个整型变量 tt = temp*0.0625; //得到真实十进制温度值 //因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表的是0.0625度 temp = tt*100+0.5; //放大(100倍) //这样做的目的将小数点后第一位也转换为可显示数字 //同时进行一个四舍五入操作。 return temp; } (5) DS18B20.h #ifndef __DS18B20_H__ #define __DS18B20_H__ #include #define uint unsigned int #define uchar unsigned char //////////////////////////////////////////////////////////////////////////////////////////// /*****************************端口定义**********************************/ 16 sbit DQ=P0^1; uint Get_Tmp(void); #endif 17 因篇幅问题不能全部显示,请点此查看更多更全内容void display() {