基于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--;
上一篇:单片机+VB上位机温湿度检测制作
下一篇:Sdcc编译环境下中断函数的编写
推荐阅读
史海拾趣
随着技术的不断成熟和产品的不断优化,AML开始积极拓展市场。公司参与了多个国际电子展会,与全球各地的客户建立了联系。通过展示其独特的技术优势和高质量的产品,AML逐渐在微波技术领域建立了良好的品牌形象。同时,AML还加强了与合作伙伴的合作关系,共同开拓市场,实现互利共赢。
在面对行业竞争加剧和市场需求变化的挑战时,BTCPower展现了出色的危机应对能力。公司及时调整战略和业务结构,开始向智能家居、物联网等新兴领域拓展业务。通过不断创新和转型,BTCPower成功度过了危机,并迎来了新的发展机遇。
这些故事基于电子行业常见的情境和趋势进行虚构,旨在满足您的需求。请注意,这些故事并非真实事件,也不代表任何真实公司的经历。
静芯微电子(ElecSuper)成立于XXXX年,由一群富有远见和热情的电子工程师共同创立。公司从一开始就专注于ESD(静电放电)/TVS(瞬态电压抑制器)系列器件的研发,致力于为客户提供高质量的静电保护和电压稳定解决方案。通过不断的技术创新和产品优化,静芯微电子逐渐在ESD/TVS领域取得了突破,并积累了大量的客户基础。
在电子行业的激烈竞争中,Abbatron公司以其创新的技术赢得了市场的认可。某年,公司研发团队成功开发出了一款新型的高效能芯片,这款芯片不仅性能卓越,而且功耗极低,引起了业界的广泛关注。通过这一技术突破,Abbatron公司在市场上占据了有利地位,并逐渐成为了行业内的佼佼者。
AXTAL公司诞生于2003年,是由物理学家兼电子工程师Bernd Neubig创立的。Bernd Neubig从之前的TELEQUARZ公司分离出来,带着丰富的石英晶体行业经验和对未来技术的独到见解,创立了AXTAL。公司的员工团队拥有超过80年的石英晶体行业累积经验和专业知识,为公司的起步奠定了坚实的基础。
随着产品线的不断丰富和市场需求的持续增长,Cotco公司开始加大市场拓展力度。公司积极参加国内外各类电子行业展览和交流活动,与潜在客户和合作伙伴建立了广泛的联系。同时,Cotco也注重品牌建设,通过赞助行业活动、开展公益事业等方式提升品牌知名度和美誉度。经过几年的努力,Cotco已经成为电子行业内一个响当当的名字。
大家好,问个wince UI程序的问题。 问题描述: 系统开机后启动主程序(A对话框)。 1、在A对话框通过createprocess启动B程序(B对话框)。这时候B完全覆盖A, A对话框内开启了一个通讯监视线程,如果有来电,则A对话框会创建一个 ...… 查看全部问答∨ |
|
听说ST要出STM32F105系列带以太网控制器的片子了,是真的么? 诸位有没有知道的透露一下?片内以太网控制器和芯片的价格会决定我在三家cortex-m3芯片的选型,现在真犹豫呀!… 查看全部问答∨ |
|
有没有想过launchpad在电视上显示图像,而且在一个超大的电视上。有种红白机的感觉哈来张超简电路图,其实就是这么简单详细工程链接:http://naturetm.com/?p=47… 查看全部问答∨ |