51单片机的二氧化碳、温湿度检测系统

发布者:Chunjie2022最新更新时间:2020-09-23 来源: 51hei关键字:51单片机  二氧化碳  温湿度检测系统 手机看文章 扫描二维码
随时随地手机看文章

基于51单片机的二氧化碳、温湿度检测系统设计。采用LCD1602显示,CO2传感器使用MH-Z19B,温湿度传感器使用DHT11

制作出来的实物图如下:
 

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
 


单片机源程序如下:

/********************************** (C) COPYRIGHT *******************************

* File Name        : main.C

* Author                :

* License                : MIT

* Version                : V1.0

* Date                        : 2019/04/12

* Description                : 51温湿度二氧化碳检测

*******************************************************************************/

#include

#include "1602.h"

#include "dht.h"

#include "2402.h"


#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long

       

//定义三个LED灯

sbit Led_qushi = P1^0;                  //去湿灯

sbit Led_jiangwen = P1^1;                //降温灯

sbit led_CO2 = P1^2;        //二氧化碳控制灯

//定义蜂鸣器

sbit fmq = P2^3;        //蜂鸣器

//定义设置键、调整键

sbit Key_TH1 = P3^0;//温度上限值调整按键

sbit Key_TH2 = P3^1;

sbit Key_HH1 = P3^2;//湿度上限值调整按键

sbit Key_HH2 = P3^3;

sbit shezhi  = P2^7;//设置键

sbit Key_CH1 = P2^6;//二氧化碳上限值调整按键

sbit Key_CH2 = P2^5;


//二氧化碳发送指令

uchar  code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};

uchar  date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};


//定义标识

volatile bit FlagStartRH = 0;  //开始温湿度转换标志

volatile bit FlagKeyPress = 0; //有键按下

volatile bit fmqt = 0;

volatile bit fmqh = 0;

volatile bit fmqc = 0;

//定义温湿度传感器用外部变量

extern U8  U8FLAG,k;

extern U8  U8count,U8temp;

extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

extern U8  U8comdata;

extern U8  count, count_r;

U16 temp;

S16 temperature, humidity;

S16 idata TH, HH, ch;  //温度上限和湿度上限//二氧化碳上限值

char * pSave;

U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2, keyCH1, keyCH2;

unsigned char moshi=0;

//定义变量

U16 RHCounter;


/************************************

    延时子程序

        延时时间(xms*1)ms

*************************************/

void delayms(uint xms)

{

        uint x,y;

        for(x=xms;x>0;x--)

                for(y=110;y>0;y--);

}

/*******************************************************************************

*  功    能          :  串口发送

*  注意事项          :  

*******************************************************************************/

void send(uchar dat)         //发送一字节   

{

  SBUF=dat;

  while(!TI);

  TI=0;

}

/*******************************************************************************

*  功    能          :  数据初始化程序

*  注意事项          :  

*******************************************************************************/

void Data_Init()

{

   RHCounter = 0;

   Led_qushi = 1;

   Led_jiangwen = 1;

   led_CO2 = 1;

   TH = 40;  //温度初始上限值

   HH = 85;  //湿度初始上限限制

         ch = 25;  //二氧化碳初始上限值

   keyvalue = 0;

   keyTH1 = 1;

   keyTH2 = 1;

   keyHH1 = 1;

   keyHH2 = 1;

         keyCH1 = 1;

         keyCH2 = 1;

}


//定时器0初始化

void Timer0_Init()

{

        ET0 = 1;        //允许定时器0中断

        TMOD = 1;       //定时器工作方式选择

        TL0 = 0x06;     

        TH0 = 0xf8;     //定时器赋予初值

        TR0 = 1;        //启动定时器

}


//存入设定值、

void Save_Setting()

{

   pSave =  (char *)&TH;          //地址低位对应低8位,高位对应高8位

   wrteeprom(0, *pSave);          //存温度上限值TH低8位

   DELAY(300);

   pSave ++;

   wrteeprom(1, *pSave);          //存温度上限值TH高8位

   DELAY(300);

   pSave =  (char *)&HH;

   wrteeprom(2, *pSave);          //存湿度上限值RH低8位

   DELAY(300);

   pSave ++;

   wrteeprom(3, *pSave);          //存湿度上限值RH高8位

   DELAY(300);

         pSave =  (char *)&ch;

   wrteeprom(4, *pSave);          //存CO2上限值RH低8位

   DELAY(300);

   pSave ++;

   wrteeprom(5, *pSave);          //存CO2上限值RH高8位

   DELAY(300);

}


//载入设定值、

void Load_Setting()

{

   pSave =  (char *)&TH;

   *pSave++ = rdeeprom(0);

   *pSave = rdeeprom(1);

   pSave = (char *)&HH;

   *pSave++ = rdeeprom(2);

   *pSave = rdeeprom(3);

         pSave = (char *)&ch;

   *pSave++ = rdeeprom(4);

   *pSave = rdeeprom(5);

   if ((TH>99)||(TH<0)) TH = 40;

   if ((HH>99)||(HH<0)) HH = 85;

         if ((ch>50)||(ch<0)) ch = 25;

}

//按键扫描程序

void Key_set_scan()

{

  if(shezhi==0)

          {

           delayms(10);

                if(shezhi==0)

                {  

                   while(!shezhi);

                   L1602_init(); //初始化液晶

                   moshi++;

                   if(moshi >= 2)moshi = 0;

                   if(moshi == 0)

                   {

                                L1602_string(1,1,"Te:   C  ");

                                L1602_string(1,9,"Hu:   %  ");

                                L1602_string(2,1,"PPM:   ");            

                   }

                   else if(moshi == 1)

                   {

                                L1602_string(1,1,"TH:");

                                L1602_string(1,9,"HH:");

                                L1602_string(2,1,"CH:");

                                L1602_string(2,8,"0");  

                                L1602_string(2,9,"0");

                   }                                            

                }

        }

}       

//按键加减设定值

void KeyProcess(uint num)

{                       

   switch (num)

   {

      case 1:

             if (TH<99) TH++;

             L1602_char(1, 5, TH/10+48);

             L1602_char(1, 6, TH%10+48);

             break;

          case 2:

             if (TH>1) TH--;

             L1602_char(1, 5, TH/10+48);

             L1602_char(1, 6, TH%10+48);

             break;

          case 3:

             if (HH<99) HH++;

             L1602_char(1, 13, HH/10+48);

             L1602_char(1, 14, HH%10+48);

             break;

          case 4:

             if (HH>1) HH--;

             L1602_char(1, 13, HH/10+48);

             L1602_char(1, 14, HH%10+48);

             break;

         case 5:

             if (ch<50) ch++;

             L1602_char(2, 6, ch/10+48);

             L1602_char(2, 7, ch%10+48);

             break;

         case 6:

             if (ch>1) ch--;

[1] [2] [3]
关键字:51单片机  二氧化碳  温湿度检测系统 引用地址:51单片机的二氧化碳、温湿度检测系统

上一篇:单片机+VB上位机温湿度检测制作
下一篇:Sdcc编译环境下中断函数的编写

推荐阅读最新更新时间:2024-11-06 17:53

51单片机实现判断数据尾来接收一串数据的串口通用程序框架
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200703 ---- @ModifiedTime: 20200710 ----
[单片机]
<font color='red'>51单片机</font>实现判断数据尾来接收一串数据的串口通用程序框架
基于51单片机实现的液位控制器设计
0 引 言 随着微电子工业的迅速发展,单片机控制的智能型控制器广泛应用于电子产品中,为了使学生对单片机控制的智能型控制器有较深的了解。经过综合分析选择了由单片机控制的智能型液位控制器作为研究项目,通过训练充分激发学生分析问题、解决问题和综合应用所学知识的潜能。另外,液位控制在高层小区水塔水位控制,污水处理设备和有毒,腐蚀性液体液位控制中也被广泛应用。通过对模型的设计可很好的延伸到具体应用案例中。 1 系统设计方案比较说明 对于液位进行控制的方式有很多,而应用较多的主要有2种,一种是简单的机械式控制装置控制,一种是复杂的控制器控制方式。两种方式的实现如下: (1)简单的机械式控制方式。其常用形式有浮标式、电极式等,这种控
[单片机]
基于<font color='red'>51单片机</font>实现的液位控制器设计
51单片机 晶振与复位常用典型电路
1.内部振荡典型电路。 理论上来说,振荡频率越高表示单片机运行速度越快,但同时对存储器的速度和印刷电路板的要求也就越高。如同木桶原理。同时单片机性能的好坏,不仅与CPU运算速度有关,而且与存储器的速度、外设速度等都有很大关系。因此一般选用6~12MHZ。并联谐振电路对电容的值没有严格要求,但会影响振荡器的稳定、振荡器频率高低、起振快速性等。所以一般C1、C2选值20~100pF,在60~70pF时振荡器有较高的频率稳定性。陶瓷封装电容可以进一步提高温度稳定性。 内部振荡典型电路 2.上电复位与按键复位典型电路。 (摘自百度知道的解答)51单片机是高电平复位,所以先看给单片机加5V电源(上电)启动时的情况:这时电容充电
[单片机]
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[应用]
51单片机中断控制寄存器
51单片机中断控制寄存器有4个:TCON(定时器控制寄存器),SCON(串行口控制寄存器),IE(中断允许控制寄存器),IP(中断优先级控制寄存器)。 51单片机中断系统: TCON(定时器控制寄存器): IE(中断允许控制寄存器): IP(中断优先级控制寄存器): SCON(串行口控制寄存器): TMOD(定时计数器工作方式控制寄存器):
[单片机]
<font color='red'>51单片机</font>中断控制寄存器
大神教你快速上手:标准80C51单片机模拟I2C总线的主机程序
I2C总线协议程序 在做程序是我在网上找的是周立功的程序,感觉还不错顺便转载;在使用的过程中一定要注意时序、时间的问题。 “i2c.h文件” //I2C总线综合发送函数,向从机发送多个字节的数据 I2C读写EEPROM流程图 bit I2C_Puts( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ); //I2C总线综合接收函数,从从机接收多个字节的数据 bit I2C_Gets ( unsigned char SlaveAddr, unsigned int SubAddr
[单片机]
大神教你快速上手:标准80C<font color='red'>51单片机</font>模拟I2C总线的主机程序
51单片机-定时器工作模式
1.两种“试管” 这种“试管”有65535个刻度的型号,也有255个刻度的型号,不过我们的导管水流流速是永远不变的。 如果我们用的是大试管(65535个刻度),那么溢出时间我们可以控制的长一些,也就是定时时间可以多一点。我们要是想定时36个单位刻度的时间,那就先往试管装好65500个刻度的水量先,这样等到水位到达65535那个刻度时,再加一个刻度就溢出了,这时溢出的就是36个单位刻度的时间。 “试管”每次水溢出,试管里的水就会消失不见(归0),如果我们还想定时36个单位刻度的时间,还需要重新把65500个刻度的水量再次装好给“试管”。 如果我们用的是小试管(255个刻度),虽然它的定时时间远远没有大试管的定时时间长,
[单片机]
<font color='red'>51单片机</font>-定时器工作模式
51单片机串口应用实例(汇编)
一、 实验题目 猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片机,对应的按键key1-key3,发送数据之后,另一边人员猜测对应的HEX码,并按下对应的按键,若按下正确的按键,则LED灯闪烁,按下不正确的按键,则蜂鸣器响一下报错,程序可以一直执行到猜中停止,此时按下key4清空复位运行数据,等待下一个串口发送的数据进行下一次猜数字。 二、 设计方案及电路 设计方案: 串口通过定时器1产生9600波特率,接收中断里面处理接收数据,主循环里面对接收数据进行判断,根据不同的HEX码转换到不同的按键判断任务,通过扫描的方式读取KEY1-3,判断读取的值,如果与HEX码对应的按键不同,则跳转到蜂鸣器报警
[单片机]
<font color='red'>51单片机</font>串口应用实例(汇编)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved