1、基于单片机室内环境检测一、 设计任务本系统满足室内环境变量实行全面、实时、长期监测的要求,实现室内环境温湿度、 可燃气体浓度检测的自动化和智能化。系统以单片机为核心,以温度、湿度传感器,气敏 传感器作为测量元件,通过单片机与智能传感器相连,采集并存储智能传感器的测量数 据,经过分析处理将结果显示于 LCD液晶屏。在单片机系统中,还要实现超限报警和数据辅助存储功能。二、 方案设计2.1硬件设计在室内环境监测硬件设计上,由单片机 AT89C52控制整个系统的运作, MQ211气敏传感器模块实现监测室内可燃气体功能、 SHT11温湿度传感器模块实现监测室内的温度和湿度功能、按键模块实现设置报警上限功
2、能、 LCD液晶模块实现显示功能、蜂鸣器报警功能。这六大模块组成的原理图来实现家庭环境检测系统的各个功能。在该设计中,选用了 AT89C52单片机作为控制芯片。该芯片有丰富的内部资源,丰富的I/O接口,低电压,低功耗等优点,并且内置看门狗电路,支持串口程序烧录,使用 方便快捷,可以进行 C语言程序编写,易于实现。温湿度测量方面选用瑞士 SHT11芯片,该芯片内置 A/D转换芯片,管脚接线简单,测量精度高等优点,气敏传感器使用多气体测 量传感器 MQ211,其具有多种可燃气体的测试功能,简单高效。 A/D转换模块选用ADC0831具有接口电路简单,成本低等优点,该芯片为一路八位数转换芯片需求。环
3、境监 测系统硬件结构图如图 1.图1系统硬件结构图2.1.1芯片管脚连接模式,P2 口中P2.0、P2.1、P2.2作为控制信号输出口,分别接 LCD的RS R/W E控制 端;P2.3和P2.4分别接温湿度传感器 SHT11的SCK和 DATA P2.5、P2.6和P2.7接按键电路。P1 口的P1.1、P1.2分别接ADC0831的控制端,P1.4接报警器的蜂鸣器。图2STC89C52管脚分布图2.1.2晶振和复位电路时钟电路用于产生时钟信号,时钟信号是单片机内部各种微操作的时间基准。复位对单片机来说,是程序还没有开始执行,是在做准备工作。晶振电路和复位电路见图 3.pse*j ALLPC
4、存-R 2/-02 g/AM FPL .trA_6 K/J0/AIU FT 和AVTP? Q/ASP2P2iM,iOK 4/A12匸:C:a 14 p; 优3 WRXf-P3 tP3.g/WTPM.3/IHT?Pl/VW-? n 品巧 7jR0图3晶振和复位电路;:1 da fL2.1.3 气敏传感器MQ211型气敏元件是一种通用性较强的气敏元件,气敏传感器的敏感元件是气敏电阻器, 气敏电阻器的阻值随吸附气体的浓度变化而变化,禾U用者一特性检测气体浓度。气敏传感 器的连接如图4.艮14JOk图4气敏传感器的连接2.1.4温湿度传感器传感器SHT11将温度感测、湿度感测、信号变换、 A/D转换和
5、加热器等功能集成到一个芯片上,其内部结构如图 5所示。该芯片包括一个电容性聚合体湿度敏感元件和一个用能隙材料制成的温度敏感元件。这两个敏感元件分别将湿度和温度转换成电信号,该电信号首先进入微弱信号放大器进行放大,然后进入一个 14位的A/D转换器,最后经过二线串二雞申接口和CRC 校验命令代码*含义心XOOOll测量温度2xooiow测量湿度XDOlll.读内剖状态寄存器4X00110P与内部状态寄存器QXllllO复位命令心其他Q保留护图6温湿度传感器指令代码2.1.5 LCD显示模块设计在该设计中,LCD要显示温度、湿度、可燃气体是否超标的功能,所以使用了一块行列点阵数为128*64,每行
6、可以显示 8个字符,共显示 2行字的LCD名称Q型态电平匸功能描舟并卩串口 VCChP4模块哇Q电源地心时*卓对比度调节PVEEQW4液晶驱动电压祯PSBQIQH/1Q并口/串口选择朴RSTQIPE/LQ复位信号低RS(CS)*WH/LPH数据L指令Q片选低浦遨”R/W(SID)-IWH/LJH读L写,串行数据线E卫IQH/LP使育腊号a串行曰寸钟输卫DO-D 屏1/0*3H/l*-1数揚总线低四位QD4-DWI/O*3H/V数据总线高四位心空接门2W4背光正卫KIQ*背光员心图8LCD管脚名称和功能LCD的连接电路:当 LCD选择并口时,要把 8个数据送到芯片,而 LCD选择串口时, 只需要
7、把3个数据送到芯片。因为芯片的管脚丰富够用,所以 LCD的连接方式选择并口。LCD的连接方式如图9所示。2.1.6按键电路块图10是按键输入的典型电路,按键 S1、S2、S3断开时,端口 P2.5、P2.6、P2.7上的信号为高电平,按键 S1、S2、S3合上时,端口 P2.5、P2.6、P2.7上的信号为低电平。电阻起 到分压、限流作用。当按键电路设计成这种硬件连接时,按键可以采取中断的形式进行读取,也可以采用循环扫描的形式读取,为程序的编写提供了选择的余地。图10按键电路2.1.7报警电路设计图11,在本系统中,采用 P1.4 口为报警电路输出口,当有报警信号时,蜂鸣器鸣叫,提醒安全指标超
8、标或不正常,须采取安全措施改变室内环境质量,如配合智能建筑系统,可 实现自动化无人操作,方便又安全。PKO EPL.2P1 4XTAL2二燈I2.2软件设计在上述硬件基础上,编写系统程序,实现以下几项功能:(1) 通电时蜂鸣器响一声,LCD液晶显示室内温度、湿度、可燃气体浓度状态。(2) 当室内温度大于设定的温度、湿度 例如温度28度、湿度80%、检测到可 燃气体超标时,蜂鸣器报警。(3) 当第一次按设置键:温度值闪烁,这是可以通过按“ +”或者“一”按键设定温度上限值,4秒钟无键按下停止闪烁,按“ +”或者“一”设置温度下限 值;第二次按设置按键:湿度值闪烁,这时可以通过按“ +”或者“一”
9、设置湿度上限值,4秒钟无键按下停止闪烁,按“ +”或“一”设置湿度下限值;第三次按设置按键,退出设置状态。2.2.1软件系统设计系统的软件设计采用 c语言编程,软件结构为模块化结构,由主程序、自检程序、SHT11数据采集与处理程序、ADC0831数据采集处理程序、报警控制程序及显示程序等模块 组成,其软件模块结构如图 12所示。图12软件结构方框图2.2.2主程序设计2.2.3 LCD1602显示模块程序设计开始1-JF宦义醫脚11F设賢输入楔成送杲不地址2.2.4SHT11温湿度测量模块程序开始三、程序代码#in clude#in clude#i nclude#i nclude#i nclu
10、de#defi ne uchar un sig ned char#defi ne uint un sig ned intUn sig ned char TempBuffer5Uchar humibuffer4 。Uchar qitibuffer3Void main wendu_to_str( int i 。int TempBuffer5 。 for(i=0 。 i Tempbutteri=i 。Tempbutter0=(SHUOxts_zi 。 Tempbutter1=(SHUOxtg_zi 。 Tempbutter2=0xdf 。Tempbutter3= C。Tempbutter4= 0 。
11、Printf( “ %d” ,TempBufferi 。Printf( “n ”。Void main shidu_to_str(int i 。 for(i=0 。 i humibufferi=i 。humibuffer0=(SHUOxzz_zi 。 humibuffer1=(SHUOxsg_zi 。 humibuffer2= %。 humibuffer3= 0 。 printf( “ n ”。Void main qiti_to_str(int I 。 for(i=0 。 i qitibuffer0=b1 。 qitibuffer1=b2 。 qitibuffer2=b3 。printf( “
12、%d,” qitibufferi 。printf( “ n ”。Void show_LCD(LCD_Initial( 。 text_jishuan_temp11( data_pro( 。 wendu_to_str( 。Goto XY(6,1 。Print(TempBuffer 。Goto XY(0,1 。Print( “ wendu” 。 shidu_to_str( 。GotoXY(11,1 。Print( “ shidu ” 。GotoXY(17,1 。Print(humibuffer 。GotoXY(13,0 。Print(qitibuffer 。csh(P2.0=0 。main(csh(
13、 。 show_LCD(。 delay_n10us(100000 。LCD显示屏驱动程序1602.h#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#includesbit LcdRs=P2A0。sbit LcdRw=P2Al 。sbit LcdEn=P2A2 。sfr DBPort=0x80 。unsigned char LCD_Wait(voidLcdRs=0。LcdRw=1。 _nop_( 。LcdEn=1 。 _nop_( 。/while(DBPort&0x80 。LcdEn=0。return DBPort 。/向
14、LCD写入命令或数据#define LCD_COMMAND0 /Command#define LCD DATA 1 /DATA#define LCD_CLEAR_SCREEN 0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点Void LCD_Write(bit style,unsigned char inputLcdEn=0。LcdRs=style 。LcdRw=0。 _nop_( 。DBPort=input 。 _nop_( 。 / 注意顺序LcdEn=0。 _nop_( 。LCD_wait( 。/ 设置显示模式#define LCD_SHOW 0x04 /
15、 显示开#define LCD_HIDE 0x00 / 显示关#define LCD_CURSOR 0x02 / 显示光标#define LCD_NO_CURSOR 0x00 / 无光标#define LCD_FLASH 0x01 / 光标闪动#define LCD_NO_FLASH 0x00 / 光标不闪动 Void LCD_SetDisplay(unsigned char DisplayMode LCD_Write(LCD_COMMAND,0x08|DisplayMode 。/ 设置输入模式#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00/defau
16、lt#define LCD_MOVE0x01/ 画面可移动#define LCD_NO_MOVE0x00/defaultVoid LCD_SetInput(unsigned char InputModeLCD_Write(LCD_COMMAND,0x04|InputMode。/ 移动光标或屏幕#define LCD_CURSOR 0x02#define LCD_SCREEN 0x08#define LCD_LEFT 0x00#define LCD_RIGHT 0x04Void LCD_Move(unsigned char object,unsigned char directionif(obj
17、ect=LCD_CURSORLCD_Write(LCD_COMMAND,0x10|diriction 。 if(object=LCD_SCREENLCD_Write(LCD_COMMAND,0x18|diriction 。 / 初始化 LCDVoid LCD_Initial(LcdEn=0。LCD_Write(LCD_COMMAND,Ox38。LCD_Write(LCD_COMMAND,Ox38。LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSORLCD_Write(LCD_COMMAND, LCD_CLEAR_SCREENLCD_SetI nput(LCD_AC_UP|
18、LCD_NO_MOVEVoid GotoXY(unsigned char x,unsigned char yif(y=0LCD_Write(LCD_COMMAND,0x80|x。if(y=1LCD_Write(LCD_COMMAND,0x80|(x-0x40。Void Print(unsigned char *strwhile(*str!= 0 LCD_Write(LCD_DATA,*str 。 str+ 。Void LCD_LoadChar(unsigned char user8,unsigned char place Unsigned char i 。 LCD_Write(LCD_COMM
19、AND,0x40|(place*8 。for(i=0 。 i LCD_Write(LCD_DATA,useri 。#endif温湿度传感器驱动程序SHT11.h#include/头文件#include#include#include/Keil librarysbit DATA=P2A4。/数据sbit SCK=P2A3。/时钟#define TEMP_ML0x03/000 0001 1 温度命令#define HUMI_ML0x05/000 0010 1 湿度命令unsigned char error。/ 全局错误变量unsigned char ack。/ 全局错误变量/float temp_
20、zi 。/ 全局应答变量/float humi_zi 。/ 全局应答变量unsigned char temp_h。 / 全局应答变量unsigned char temp_LL。 / 全局应答变量unsigned char humi_h。unsigned char temp_LL#define uchar unsigned char / 定义一下方便使用#define unit unsigned int#define ulong unsigned longunsigned int recs=0 。 / 接收次数uchar TempBuffer5 。 uchar humibuffer4 。cons
21、t unsigned char SHUO15= ” 0123456789.%RH”。int xts_zi=0 。 / 温度值int xtg_zi=0 。 / 温度个位值int xtd_zi=0 。 / 温度点值int xss_zi=0 。 / 湿度值int xsg_zi=0 。 / 湿度个位值int xsd_zi=0 。 / 湿度点值sbit soud=P1A4 。/ 声音/ 基本驱动程序/ 系统初始化Void start(void /DATA=1。 SCK=0。_nop_(。SCK=1。 /DATA=0。 /_nop_(。SCK=0。 /_nop_( 。 _nop_( 。SCK=1。 /_n
22、op_(。DATA=1。 /_nop_(。SCK=0。 /Void sht_rest(void /启动/ 数据为 1 , SCK=0第一个脉冲数据跌落完成一个脉冲_nop_( 。再一个脉冲数据变为 1变为该脉冲复位unsigned char IDATA=1 SCK=0/数据为 1 时钟为 0fori=0 。i9。i+ ) 9SCK=1。SCK=0。Start/Unsigned char I 。ack=0。for(i=0x80 。 i0 。 i/=2 /if(i&valueDATA=1 。 /Else DATA=0。SCK=1。 /_nop_( 。 _nop_( 。 _nop_(SCK=0。DA
23、TA=1。 /SCK=1。return ack 。 /error=1个脉冲为复位启动写一个字节 返回应答信号释放数据总线写入值上升沿写入。 / 延时释放数据总线表示没有应答char read(/ 读一个字节返回应答信号Unsigned char I,val=0 temp_LL=0。释放数据总线/ 位移 8 位上升沿读入temp_h= 0 。DATA=1。 for0 。 i/=2 )/SCK=0。DATA=0。 /SCK=1。读应答信号应答为1,应答为0通过CPUT拉为应答第 9 个脉冲_nop_( 。 _nop_( 。 _nop_(/pulswith approx.5us释放数据总线释放数据总
24、线位移 8 位上升沿读入确定值不需要应答通过CPUT拉为应答9 个脉冲。 /pulswith approx.5us释放数据总线SCK=0。DATA=1。 /temp_h=val 。val=0 。/ 低 8 位DATA=1。 /for(i=0x80 。 i0 。 i/=2 /SCK=1。 /if(DATAval=(val|i / SCK=0。DATA=1。 /0 。 /SCK=1。 第_nop_( 。 _nop_( 。 _nop_( SCK=0。DATA=1。 /temp_LL=val return val 。/ 测量温度或者是湿度,返回校验值 text_a(unsigned char ml u
25、nsigned int I 。start( 。 / 启动if 。 / 复位write(ml 。 / 写入测温度/DATA=1 。/ 释放数据总线For(i=0。iif(DATA=Obreak。read( 。 / 度温度text_jishuan_temp(float aa=0,bb=0,temp zi 。int abcd=0 。aa=(floattemp_h*256+(floattemp_LL 。temp_zi=0.01*aa-40 。if (temp_zitemp_zi= -temp_zi 。temp_zi= temp_zi*10 。abcd=(int temp_zi 。xts_zi=abcd
26、/100 。abcd=abcd%100。xtg_zi=abcd/10 。abcd=abcd%10。xtd_zi=abcd/1 。text_jishuan_humi(float aa=0,bb=0,humi_ziint abcd=0 aa=(floattemp_h*256+(floattemp_LL 。baa*aa*2.8/1000000 。aa=0.0405*aa 。aa=aa-4-bb 。humi_zi= humi_zi*10 。abcd=(inthumi_zi 。xss_zi=abcd/100 。abcd=abcd%100。xsg_zi=abcd/10 。abcd=abcd%10。xsd_
27、zi=abcd/1 。text_jishuan_temp11(error=0 。ack=0。sht_rest( 。 / 复位 text_a(TEMP_ML。text_jishuan_temp( 。text_a(HUMI_ML 。 text_jishuan_humi( 。unsigned int wendu,shidu 。void delay_n10us(unit n / 延时 n 个 10us12M晶振uint i 。for(i=n 。 i0 。 i-_nop_( 。 _nop_( 。 _nop_( 。 _nop_( 。 _nop_( 。 _nop_( 。四、心得体会通过本次课程设计的学习与实践,我逐渐对单片机产生了兴趣,并且对温度气敏传感 器、 LED 显示器都有了一定的了解,在设计过程中通过图书馆、网上查