首页 > 其他分享 >基于51单片机温湿度、烟雾浓度、人体检测报警

基于51单片机温湿度、烟雾浓度、人体检测报警

时间:2024-11-24 19:01:48浏览次数:6  
标签:10 1602com 温湿度 51 write 单片机 0x30 sbit 1602dat

基于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

相关文章

  • MTS-Dansyl|cas:355115-41-2|丹磺酰胺基乙基甲烷硫代磺酸酯
    MTS-Dansyl(丹磺酰胺基乙基甲烷硫代磺酸酯)是一种化学物质,以下是关于它的详细介绍:一、基本信息英文名称:MTS-Dansyl;DansylamidoethylMethanethiosulfonate;2-(5-Dimethylaminonaphth-1-ylsulfonamido)ethylMethanethiosulfonateCAS号:355115-41-2分子式:C15H20N2O4S3分子量:388.53外......
  • 51c大模型~合集78
    我自己的原文哦~  https://blog.51cto.com/whaosoft/12642335#LTX-VideoRTX4090可跑、完全开源,最快视频生成模型问世,实测一言难尽开源AI视频社区又一个重量级选手下场。这个周末,押注开源人工智能视频的初创公司Lightricks,有了重大动作。该公司推出了最快的视频......
  • 51c~TensorRT~合集1
    我自己的原文哦~  https://blog.51cto.com/whaosoft/11744302一、TensorRT-LLM~最佳部署实践TensorRT-LLM(LargeLanguageModel)部署实践的详细介绍TRT-LLM简单再介绍TensorRT-LLM的介绍前几篇中已提到,就不过多赘述了。这里列一个TensorRT-LLM的功能和定位:trt-llm功......
  • 51c~CUDA~合集2
     我自己的原文哦~  https://blog.51cto.com/whaosoft/12403901一、如何优雅地测量GPUCUDAKernel耗时?​背景Rainlin:如何优雅地测量GPUCUDAKernel耗时?(一)中介绍了常用的测量gpu耗时方法,而实际应用中,还会遇到其他的问题,比如:为什么同样的输入,测量的耗时存在较大差距?怎样......
  • 代码随想录算法训练营第二十五天|LeetCode491.递增子序列、46.全排列、47.全排列II、3
    前言打卡代码随想录算法训练营第49期第二十五天  ○(^皿^)っHiahiahia…首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今......
  • (附源码)基于ssm的法律公益服务系统的设计与实现-计算机毕设31518
    基于ssm的法律公益服务系统的设计与实现目 录摘要1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2 法律公益服务系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析......
  • 盛世公司客服系统hj8828,vipS针对嵌入式STM32单片机的开发环境配置
    针对嵌入式【hj8828.vip】STM32单片机的开发环境配置薇【Lgj88288】,以下分别针对Windows和Mac系统提供详细的教学步骤。一、Windows系统配置教学选择开发软件Windows系统上有多种工具组合可供选择,包括单纯使用Keil进行库函数、HAL库以及寄存器的开发,也可以通过STM32CubeMX配......
  • 【041】基于51单片机篮球计分器【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+4*4矩阵键盘+LCD1602液晶显示+按键设置+蜂鸣器。1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,以LCD1602液晶显示屏显示信息;2、采用4*4矩阵键盘进行人机交互,方便快捷;3、具有比赛加减分,比赛节数设置,比赛时间倒计时,24......
  • 基于51单片机数字频率计的设计
    基于51单片机数字频率计(仿真+程序+原理图+PCB+设计报告)功能介绍具体功能:1.用74HC08和74HC393处理输入频率信号;2.LCD1602显示频率和周期;3.按键可以切换显示Vpp;​演示视频:基于51单片机频率计仿真—LCD1602 添加图片注释,不超过140字(可选)程序#include<reg51.h>......
  • 第51篇 Cookie和Session的简单介绍
    前言Cookie是一种由服务器发送到用户浏览器并存储在客户端的小型数据块,通常用于标识用户会话和保持状态信息。Session则是服务器端存储的与特定用户会话相关的状态信息,它通过Cookie中的SessionID与客户端建立关联。这两者共同构建了传统Web应用中用户身份验证的基础。1.Cookie......