基于单片机的室内环境检测word文档良心出品docx.docx
- 文档编号:28209587
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:67
- 大小:309.38KB
基于单片机的室内环境检测word文档良心出品docx.docx
《基于单片机的室内环境检测word文档良心出品docx.docx》由会员分享,可在线阅读,更多相关《基于单片机的室内环境检测word文档良心出品docx.docx(67页珍藏版)》请在冰豆网上搜索。
基于单片机的室内环境检测word文档良心出品docx
一、设计任务
本系统满足室内环境变量实行全面、实时、长期监测的要求,实现室内环境温湿度、可
燃气体浓度检测的自动化和智能化。
系统以单片机为核心,以温度、湿度传感器,气敏传感
器作为测量元件,通过单片机与智能传感器相连,采集并存储智能传感器的测量数据,经过
分析处理将结果显示于LCD液晶屏。
在单片机系统中,还要实现超限报警和数据辅助存储功
能。
二、方案设计
2.1硬件设计
在室内环境监测硬件设计上,由单片机(AT89C52)控制整个系统的运作,MQ211气敏
传感器模块实现监测室内可燃气体功能、SHT11温湿度传感器模块实现监测室内的温度和湿
度功能、按键模块实现设置报警上限功能、LCD液晶模块实现显示功能、蜂鸣器报警功能。
这六大模块组成的原理图来实现家庭环境检测系统的各个功能。
在该设计中,选用了AT89C52单片机作为控制芯片。
该芯片有丰富的内部资源,丰富
的I/O接口,低电压,低功耗等优点,并且内置看门狗电路,支持串口程序烧录,使用方便
快捷,可以进行C语言程序编写,易于实现。
温湿度测量方面选用瑞士SHT11芯片,该芯片
内置A/D转换芯片,管脚接线简单,测量精度高等优点,气敏传感器使用多气体测量传感器
MQ211,其具有多种可燃气体的测试功能,简单高效。
A/D转换模块选用ADC0831,具有接口
电路简单,成本低等优点,该芯片为一路八位数转换芯片需求。
环境监测系统硬件结构图如
图1.
图1系统硬件结构图
2.1.1芯片管脚连接
在该设计电路中,用单片机
I/O
口中的
P1口作为
LCD液晶屏的数据口,采用并口数据
传输模式,
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.
图3晶振和复位电路
2.1.3气敏传感器
MQ211型气敏元件是一种通用性较强的气敏元件,气敏传感器的敏感元件是气敏电阻器,
气敏电阻器的阻值随吸附气体的浓度变化而变化,利用者一特性检测气体浓度。
气敏传感器
的连接如图4.
图4气敏传感器的连接
2.1.4温湿度传感器
传感器SHT11将温度感测、湿度感测、信号变换、A/D转换和加热器等功能集成到一个
芯片上,其内部结构如图5所示。
该芯片包括一个电容性聚合体湿度敏感元件和一个用能隙
材料制成的温度敏感元件。
这两个敏感元件分别将湿度和温度转换成电信号,该电信号首先
进入微弱信号放大器进行放大,然后进入一个14位的A/D转换器,最后经过二线串行数字
接口输出数字信号。
图5温湿度传感器内部结构
图6温湿度传感器指令代码
图7温湿度传感器电路
2.1.5LCD显示模块设计
在该设计中,LCD要显示温度、湿度、可燃气体是否超标的功能,所以使用了一块行列
点阵数为128*64,每行可以显示8个字符,共显示2行字的LCD。
图8LCD管脚名称和功能
LCD的连接电路:
当LCD选择并口时,要把8个数据送到芯片,而LCD选择串口时,
只需要把3个数据送到芯片。
由于芯片的管脚丰富够用,所以LCD的连接方式选择并口。
LCD
的连接方式如图9所示。
图9LCD连接电路
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口为报警电路输出口,当有报警信号时,蜂鸣器鸣叫,提醒
安全指标超标或不正常,须采取安全措施改变室内环境质量,如配合智能建筑系统,可实现自动化无人操作,方便又安全。
图11报警电路
2.2软件设计
在上述硬件基础上,编写系统程序,实现以下几项功能:
(1)通电时蜂鸣器响一声,LCD液晶显示室内温度、湿度、可燃气体浓度状态。
(2)当室内温度大于设定的温度、湿度(例如温度28度、湿度80%)、检测到可燃
气体超标时,蜂鸣器报警。
(3)
当第一次按设置键:
温度值闪烁,这是可以通过按“
+”或者“—”按键设定
温度上限值,4秒钟无键按下停止闪烁,
按“+”或者“—”设置温度下限值;
第二次按设置按键:
湿度值闪烁,这时可以通过按“
+”或者“—”设置湿度
上限值,4秒钟无键按下停止闪烁,按“
+”或“—”设置湿度下限值;第三
次按设置按键,退出设置状态。
2.2.1软件系统设计
系统的软件设计采用C语言编程,软件结构为模块化结构,由主程序、自检程序、SHT11
数据采集与处理程序、ADC0831数据采集处理程序、报警控制程序及显示程序等模块组成,
其软件模块结构如图12所示。
图12软件结构方框图
2.2.2主程序设计
2.2.3LCD1602显示模块程序设计
2.2.4SHT11温湿度测量模块程序
三、程序代码
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
UnsignedcharTempBuffer[5];
Ucharhumibuffer[4];
Ucharqitibuffer[3];
Voidmainwendu_to_str()
{inti;
intTempBuffer[5];
for(i=0;i<5;i++)
Tempbutter[i]=i;
Tempbutter[0]=(SHUO[xts_zi]);
Tempbutter[1]=(SHUO[xtg_zi]);
Tempbutter[2]=0xdf;
Tempbutter[3]=
’C’;
Tempbutter[4]=
’\0’;
Printf(“%d”,TempBuffer[i]);
Printf(“\n”);
}
Voidmainshidu_to_str()
{inti;
for(i=0;i<4;i++)
humibuffer[i]=i;
humibuffer[0]=(SHUO[xzz_zi]);
humibuffer[1]=(SHUO[xsg_zi]);
humibuffer[2]=’%’;
humibuffer[3]=’\0’;
printf(“\n”);
}
Voidmainqiti_to_str()
{intI;
for(i=0;i<3;i++)
qitibuffer[0]=b1;
qitibuffer[1]=b2;
qitibuffer[2]=b3;
printf(“%d,”qitibuffer[i]);
printf(“\n”);
}
Voidshow_LCD()
{
LCD_Initial();
text_jishuan_temp11();
data_pro();
wendu_to_str();
GotoXY(6,1);
Print(TempBuffer);
GotoXY(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();
show_LCD();
delay_n10us(100000);
}
LCD显示屏驱动程序
1602.h
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
#include
sbitLcdRs=P2^0;
sbitLcdRw=P2^1;
sbitLcdEn=P2^2;
sfrDBPort=0x80;
unsignedcharLCD_Wait(void)
{
LcdRs=0;
LcdRw=1;_nop_();
LcdEn=1;_nop_();
//while(DBPort&0x80);
LcdEn=0;
returnDBPort;
}
//向LCD写入命令或数据
#defineLCD_COMMAND
0//Command
#defineLCDDATA1
//DATA
#defineLCD_CLEAR_SCREEN0x01
//
清屏
#defineLCD_HOMING0x02//
VoidLCD_Write(bitstyle,unsignedcharinput)
{
光标返回原点
LcdEn=0;
LcdRs=style;
LcdRw=0;_nop_();
DBPort=input;_nop_();//
注意顺序
LcdEn=1;_nop_();//
注意顺序
LcdEn=0;_nop_();
LCD_wait();
}
//设置显示模式
#defineLCD_SHOW
0x04
//
显示开
#defineLCD_HIDE0x00
//
显示关
#defineLCD_CURSOR
0x02
//
显示光标
#defineLCD_NO_CURSOR0x00//
无光标
#defineLCD_FLASH
0x01
//
光标闪动
#defineLCD_NO_FLASH
0x00
//
光标不闪动
VoidLCD_SetDisplay(unsignedcharDisplayMode)
{
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
}
//设置输入模式
#defineLCD_AC_UP
0x02
#defineLCD_AC_DOWN
0x00
//default
#defineLCD_MOVE
0x01//
画面可移动
#defineLCD_NO_MOVE
0x00
//default
VoidLCD_SetInput(unsignedcharInputMode)
{
LCD_Write(LCD_COMMAND,0x04|InputMode);
}
//移动光标或屏幕
#defineLCD_CURSOR
0x02
#defineLCD_SCREEN
0x08
#defineLCD_LEFT
0x00
#defineLCD_RIGHT
0x04
VoidLCD_Move(unsignedcharobject,unsignedchardirection)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|diriction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|diriction);
}
//初始化LCD
VoidLCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
}
VoidGotoXY(unsignedcharx,unsignedchary)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
VoidPrint(unsignedchar*str)
{
while(*str!
=’\0’)
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
VoidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace)
{
Unsignedchari;
LCD_Write(LCD_COMMAND,0x40|(place*8));
for(i=0;i<8;i++)
LCD_Write(LCD_DATA,user[i]);
}
#endif
温湿度传感器驱动程序
SHT11.h
#include
//
头文件
#include
#include
#include
//Keillibrary
sbitDATA=P2^4;
//
数据
sbitSCK=P2^3;
//
时钟
#defineTEMP_ML
0x03
//000
0001
1
温度命令
#defineHUMI_ML
0x05
//000
0010
1
湿度命令
unsignedcharerror;//
全局错误变量
unsignedcharack;
//
全局错误变量
//floattemp_zi;
//
全局应答变量
//floathumi_zi;
//
全局应答变量
unsignedchartemp_h;//
全局应答变量
unsignedchartemp_LL;//
全局应答变量
unsignedcharhumi_h;
unsignedchartemp_LL
#defineucharunsignedchar//
定义一下方便使用
#defineunitunsignedint
#defineulongunsignedlong
unsignedintrecs=0;//
接收次数
ucharTempBuffer[5];ucharhumibuffer[4];
constunsignedcharSHUO[15]=
”0123456789.%RH”;
intxts_zi=0;//
温度值
intxtg_zi=0;//
温度个位值
intxtd_zi=0;//
温度点值
intxss_zi=0;//
湿度值
intxsg_zi=0;//
湿度个位值
intxsd_zi=0;//
湿度点值
sbitsoud=P1^4;//
声音
//基本驱动程序
//系统初始化
Voidstart(void)
//
启动
{
DATA=1;SCK=0;
//
数据为1,SCK=0
_nop_();
SCK=1;
//
第一个脉冲
DATA=0;
//
数据跌落
_nop_();
SCK=0;
//
完成一个脉冲
_nop_();_nop_();_nop_();
SCK=1;
//
再一个脉冲
_nop_();
DATA=1;
//
数据变为1
_nop_();
SCK=0;
//
变为该脉冲
}
Voidsht_rest(void)
//
复位
{
unsignedcharI;
DATA=1;SCK=0;
//
数据为1时钟为0
for(i=0;i<9;i++
)
//9
个脉冲为复位
{SCK=1;
SCK=0;
}
Start();
//
启动
}
charwrite(unsignedcharvalue)//
写一个字节
返回应答信号
{
UnsignedcharI;
ack=0;
for(i=0x80;i>0;i/=2)
//
释放数据总线
{if(i&value)DATA=1;
//
写入值
ElseDATA=0;
SCK=1;
//
上升沿写入
_nop_();_nop_();_nop_();//
延时
SCK=0;
}DATA=1;
//
释放数据总线
SCK=1;
returnack;
//error=1
表示没有应答
}
charread()//读一个字节返回应答信号
{
UnsignedcharI,val=0;
temp_LL=0;
temp_h=0;
DATA=1;//释放数据总线
for(i=0x80;i>0;i/=2)//位移8位
{SCK=1;
//
上升沿读入
if(DATA)val=(val|i)
//
确定值
SCK=0;
}
DATA=0;
//
读应答信号应答为
1,应答为0通过CPU下拉为应答
SCK=1;
第9个脉冲
_nop_();_nop_();_nop_();
//pulswithapprox.5us
SCK=0;
DATA=1;
//
释放数据总线
temp_h=val;
val=0;
//低8位
DATA=1;
//
释放数据总线
for(i=0x80;i>0;i/=2)
//
位移8位
{SCK=1;
//
上升沿读入
if(DATA)val=(val|i)
//
确定值
SCK=0;
}
DATA=1;//0;
//
不需要应答通过CPU下拉为应答
SCK=1;
第9个脉冲
_nop_();_nop_();_nop_();
//pulswithapprox.5us
SCK=0;
DATA=1;
//
释放数据总线
temp_LL=val
returnval;
}
//测量温度或者是湿度,返回校验值
text_a(unsignedcharml)
{
unsignedintI;
start();
//
启动
write(ml);
//
写入测温度
if(ack==1)
{
sht_rest();
//
复位
write(ml);
//
写入测温度
}
//DATA=1;//释放数据总线
For(i=0;i<65535;i++)if(DATA==0)break;
read();//度温度
}
text_jishuan_temp()
{
floataa=0,bb=0,tempzi;
intabcd=0;
aa=(float)temp_h*256+(float)temp_LL;
temp_zi=0.01*aa-40;
if(temp_zi<0)
{
temp_zi=-temp_zi;
}
temp_zi=temp_zi*10;
abcd=(int)temp_zi;
xts_zi=abcd/100;
abcd=abcd%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 室内环境 检测 word 文档 良心 出品 docx