基于51单片机智能环境监测
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.使用DHT11检测温湿度,MQ-2与ADC0832模数转换器检测烟雾,HC-SR501检测人体;
2.LCD1602显示温湿度、烟雾信息;
3.按键设定温湿度上下限、烟雾上限值,打开/关闭人体检测;
4.超过设定范围发生对应的声光报警;
5.打开人体检测时,检测到人体就会报警;
演示视频:
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="Tos3fqvJ-1732084140738" src="https://player.bilibili.com/player.html?aid=1354231478"></iframe>基于51单片机温湿度、烟雾浓度、人体检测报警
添加图片注释,不超过 140 字(可选)
程序
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include "0832.h"
/***微信公众号:木子单片机********/
#define uchar unsigned char
#define uint unsigned int
#include "eeprom52.h"
sbit DATA = P3^7; //温湿度
sbit E=P2^5; //1602使能引脚
sbit RS=P2^7; //1602数据/命令选择引脚
sbit RW=P2^6;
sbit K1=P1^3;//设置键
sbit K2=P1^4;//加
sbit K3=P1^5;//减
sbit K4=P1^7; //人体
sbit K5=P1^6; //布防撤防按键
sbit LED1=P3^0; //烟雾报警
sbit LED2=P3^2; //温度上限
sbit LED3=P3^3; //温度下限
sbit LED4=P3^4; //湿度上限
sbit LED5=P3^5; //湿度下限
sbit LED6=P3^6; //红外报警
sbit alarm=P3^0; //蜂鸣器
uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
uchar Mode,humidity,temperature,smog;
bit BJ_LED1=0,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1;
bit bdata FlagStartRH;
uchar flag ;//记录当前设置状态
uint count;
//定时器0初始化
void Timer0_Init()
{
ET0 = 1; //允许定时器0中断
TMOD = 0x11; //定时器工作方式选择
TL0 = 0xFF;
TH0 = 0x4B; //定时器赋予初值
TH1=0xdc;
TL1=0x00;
ET1=0;
TR0 = 0; //启动定时器
}
//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
uchar RHCounter;
TL0 = 0xFF;
TH0 = 0x4B; //定时器赋予初值
RHCounter++;
if (RHCounter >= 15)
{
FlagStartRH = 0;
RHCounter = 0;
}
}
void Delay1(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DATA)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DATA)U8temp=1;
U8FLAG=2;
while((DATA)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==0)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=0;
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----温湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
uchar RH(void)
{
//主机拉低18ms
DATA=0;
Delay1(180); //原来为5
DATA=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DATA=0;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DATA) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DATA)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DATA)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DATA=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
return 0;
}
else //传感器不响应
{
return 0;
}
}
/********************************************************************
* 文件名 : 液晶1602显示.c
* 描述 : 该程序实现了对液晶1602的控制。
***********************************************************************/
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++);
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_1602com(uchar del)
{
P0 = del;
RS = 0;
E = 0;
delay();
E = 0;
delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_1602dat(uchar del)
{
P0 = del;
RS = 1;
E = 1;
delay();
E = 0;
delay();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
write_1602com(0x38);
write_1602com(0x0c);
write_1602com(0x06);
write_1602com(0x01); //清屏要放在最后
}
void display()
{
write_1602com(0x83);
write_1602dat(temperature%100/10+0x30);
write_1602dat(temperature%100%10+0x30);
write_1602com(0x8c);
write_1602dat(humidity%100/10+0x30);
write_1602dat(humidity%100%10+0x30);
write_1602com(0xc3);
write_1602dat(smog%100/10+0x30);
write_1602dat(smog%100%10+0x30);
write_1602com(0x85);
write_1602dat(0xdf);
}
void display_1()
{
write_1602com(0x83);
write_1602dat(TH%100/10+0x30);
write_1602dat(TH%100%10+0x30);
write_1602com(0x8c);
write_1602dat(TL%100/10+0x30);
write_1602dat(TL%100%10+0x30);
write_1602com(0xc3);
write_1602dat(HH%100/10+0x30);
write_1602dat(HH%100%10+0x30);
write_1602com(0xcc);
write_1602dat(HL%100/10+0x30);
write_1602dat(HL%100%10+0x30);
}
void write_string(uchar * str)
{
while( * str)
{
write_1602dat(* str);
str++;
}
}
/***按键函数***/
void KEY()
{
if(K1==0)
{
Delay1(200);
if(K1==0)
{
flag++;
if(flag==1)
{
write_1602com(0x80);
write_string("TH: C TL: C");
write_1602com(0xc0);
write_string("HH: % HL: % ");
write_1602com(0x85);
write_1602dat(0xdf);
write_1602com(0x8e);
write_1602dat(0xdf);
display_1();
write_1602com(0x84);
write_1602com(0x0f);
}
else if(flag==2)
write_1602com(0x8d);
else if(flag==3)
write_1602com(0xc4);
else if(flag==4)
write_1602com(0xcd);
else if(flag==5)
{
write_1602com(0xc0);
write_string(" ");
write_1602com(0x80);
write_string("Sg: mg/m3 ");
write_1602com(0x83);
write_1602dat(SM/10+0x30);
write_1602dat(SM%10+0x30);
write_1602com(0x84);
}
else
{
write_1602com(0x80);
write_string("Te: C Hu: % ");
write_1602com(0xc0);
if(bufang==0)
write_string("Sg: mg/m3 B");
else
write_string("Sg: mg/m3 ");
write_1602com(0x85);
write_1602dat(0xdf);
display();
write_1602com(0x0c);
flag=0;
write_eeprom();
}
while(!K1);
}
}
if(K2==0)
{
Delay1(200);
if(K2==0)
{
switch (flag)
{
case 1: TH++;if(TH>99) TH=0;if(TH<=TL) TH=TL+1; write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
case 2: TL++;if(TL>98) TL=0; if(TL>=TH) TL=TH-1; write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
case 3: HH++;if(HH>99) HH=0; if(HH<=HL) HH=HL+0;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
case 4: HL++;if(HL>98) HL=0; if(HL>=HH) HL=HH-0; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
case 5: SM++;if(SM>9) SM=0; write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
}
while(!K2);
}
}
if(K3==0)
{
Delay1(200);
if(K3==0)
{
switch (flag)
{
case 1: TH--;if(TH>99) TH=99; if(TH<=TL) TH=TL+0; write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
case 2: TL--;if(TL>99) TL=98;if(TL>=TH) TL=TH-0; write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
case 3: HH--;if(HH>99) HH=99; if(HH<=HL) HH=HL+1; write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
case 4: HL--;if(HL>99) HL=98;if(HL>=HH) HL=HH-1; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
case 5: SM--;if(SM>99) SM=9; write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
}
while(!K3);
}
}
if(K5==0)
{
Delay1(200);
if(K5==0&&flag==0)
{
if(bufang==2||bufang==1)
{
bufang=0;
count=0;
TR1=0;
write_eeprom();
write_1602com(0xcf);
write_1602dat(' ');
}
else
{
TR1=0;
write_1602com(0xcf);
write_1602dat('Z');
bufang=2;
}
while(K5==0);
}
}
}
void Onealarm()
{
alarm=0;
}
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
色环电阻:10K、2.2K、5.1;
LCD1602液晶显示器;
16P排母;16P排针;
模数转换芯片:ADC0832;
8脚IC座;MQ传感器;
5mm发光二极管;
DC电源插座;蜂鸣器;
直插瓷片电容:104、30P;
直插电解电容:10uf;
9脚排阻;晶振:12MHZ;
数字温湿度管:DHT11;
HC-SR501红外热释电模块;
NPN三极管;PNP 三极管;
按键6X6X5MM;自锁开关;
导线:若干;
添加图片注释,不超过 140 字(可选)
流程图:
添加图片注释,不超过 140 字(可选)
设计资料
01仿真图
本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!
添加图片注释,不超过 140 字(可选)
02原理图
本系统原理图采用Altium Designer19设计,具体如图!
添加图片注释,不超过 140 字(可选)
03程序
本设计使用软件keil5版本编程设计!具体如图!
添加图片注释,不超过 140 字(可选)
04设计报告
一万六千字设计报告,具体如下!
添加图片注释,不超过 140 字(可选)
05设计资料
资料获取请关注同名公众号,全部资料包括程序(含注释)、仿真源文件 、AD原理图、任务书、开题报告、设计报告、流程图、实物图、元件清单等。具体内容如下,全网最全! !
添加图片注释,不超过 140 字(可选)
可以关注下方公众号!
点赞分享一起学习成长。
标签:10,1602com,温湿度,51,write,单片机,0x30,sbit,1602dat From: https://blog.csdn.net/2401_82402501/article/details/143911068