基于单片机的温湿度监测系统设计(程序)

发布者:EtherealHeart最新更新时间:2022-04-21 来源: eefocus关键字:单片机  温湿度监测系统 手机看文章 扫描二维码
随时随地手机看文章

#include

#include "1602.h"

#include "dht.h"

#include "2402.h"

 

//定义三个LED灯

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

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

sbit Led_shengwen=P1^4;        //升温灯

sbit Key_TH1 = P3^2;

sbit Key_TH2 = P3^3;

sbit Key_HH1 = P3^4;

sbit Key_HH2 = P3^5;

 

//定义标识

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

volatile bit FlagKeyPress = 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;  //温度上限和湿度上限

char * pSave;

U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2;

 

//定义变量

U16 RHCounter;

 

 

//数据初始化

void Data_Init()

{

   RHCounter = 0;

   Led_qushi = 1;

   Led_jiangwen = 1;

   Led_shengwen = 1;

   TH = 40;

   HH = 85;

   keyvalue = 0;

   keyTH1 = 1;

   keyTH2 = 1;

   keyHH1 = 1;

   keyHH2 = 1;

 

}

 

//定时器0初始化

void Timer0_Init()

{

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

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

    TL0 = 0x06;     

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

    TR0 = 1;        //启动定时器

}

 

//定时器0中断

void Timer0_ISR (void) interrupt 1 using 0

{

    TL0 = 0x06;

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

 

    //每2秒钟启动一次温湿度转换

    RHCounter ++;

    if (RHCounter >= 1000)

    {

       FlagStartRH = 1;

       RHCounter = 0;

    }

}

 

//存入设定值、

void Save_Setting()

{

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

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

   DELAY(500);

   pSave ++;

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

   DELAY(500);

   pSave =  (char *)&HH;

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

   DELAY(500);

   pSave ++;

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

   DELAY(500);

}

 

//载入设定值、

void Load_Setting()

{

   pSave =  (char *)&TH;

   *pSave++ = rdeeprom(0);

   *pSave = rdeeprom(1);

   pSave = (char *)&HH;

   *pSave++ = rdeeprom(2);

   *pSave = rdeeprom(3);

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

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

}

 

void KeyProcess(uint num)

{

   switch (num)

   {

      case 1:

         if (TH<99) TH++;

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

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

         break;

      case 2:

         if (TH>1) TH--;

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

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

         break;

      case 3:

         if (HH<99) HH++;

         L1602_char(2, 15, HH/10+48);

         L1602_char(2, 16, HH%10+48);

         break;

      case 4:

         if (HH>1) HH--;

         L1602_char(2, 15, HH/10+48);

         L1602_char(2, 16, HH%10+48);

         break;

      default:

         break;

   }

   Save_Setting();

}

 

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

* 名称 : Main()

* 功能 : 主函数

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

void main()

{

    U16 i, j, testnum;

 

    EA = 0;

 

    Timer0_Init();  //定时器0初始化

 

    Data_Init();

    EA = 1;

 

    L1602_init();

    L1602_string(1,1," Welcome to T&H   ");

    L1602_string(2,1," Control System!  ");

    //延时

    for (i=0;i<500;i++)

       for (j=0;j<1000;j++)

       {;}

    //清屏

    L1602_string(1,1,"                ");

    L1602_string(2,1,"                ");

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

    L1602_string(2,1,"Hum:    %  HH:");

    

    //载入温度上限和湿度上限设定值

    Load_Setting();

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

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

    L1602_char(2, 15, HH/10+48);

    L1602_char(2, 16, HH%10+48);

 

 

    while(1)

    {

       //温湿度转换标志检查

         if (FlagStartRH == 1)

         {

             TR0 = 0;

             testnum = RH();

              FlagStartRH = 0;

             TR0 = 1;

             //读出温湿度,只取整数部分

             humidity = U8RH_data_H;

             temperature = U8T_data_H;

              //显示温湿度

             L1602_int(1,5,temperature);

             L1602_int(2,5,humidity);    

        }

        //温湿度控制

        if (temperature > TH) Led_jiangwen = 0;

        else Led_jiangwen = 1;                    //降温

        if (humidity > HH) Led_qushi = 0;

        else Led_qushi = 1;                        //去湿

         

        //键盘查询,在弹起时响应

        if ((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;}

        else if ((Key_TH2)&&(keyTH2==0)) {FlagKeyPress = 1; keyvalue = 2;}

        else if ((Key_HH1)&&(keyHH1==0)) {FlagKeyPress = 1; keyvalue = 3;}

        else if ((Key_HH2)&&(keyHH2==0)) {FlagKeyPress = 1; keyvalue = 4;}

        if (FlagKeyPress == 1)

        {

           KeyProcess(keyvalue);

           FlagKeyPress = 0;           

        }

        if (!Key_TH1) keyTH1 = 0;

        else keyTH1 = 1;

        if (!Key_TH2) keyTH2 = 0;

        else keyTH2 = 1;

        if (!Key_HH1) keyHH1 = 0;

        else keyHH1 = 1;

        if (!Key_HH2) keyHH2 = 0;

        else keyHH2 = 1;

    }    

}

关键字:单片机  温湿度监测系统 引用地址:基于单片机的温湿度监测系统设计(程序)

上一篇:基于单片机的室内环境参数自控系统设计
下一篇:基于单片机的简易电子琴系统设计(程序)

推荐阅读最新更新时间:2024-11-11 10:14

51单片机-继电器
继电器控制方式: * 单片机I/O口控制端 * 继电器控制端 * 光耦控制端 * 在原理图中TX-3那部分,用单片机控制继电器把P35与JDQ连接在一起,如果B极是低电平,那么VCC的电流流过B,电流流过C极,通过继电器的线圈,指针从常闭端打到常开端。对应上边继电器左边绿色的那三个中间的是中间端,一个常开端,一个常闭端。平时中间端和常闭端是导通的,一控制继电器吸合,中间端和常开端导通。 NPN与PNP的区别 NPN和PNP主要就是电流方向和电压正负不同,说得 专业 一点,就是 极性 问题。 NPN 是用 B E 的电流(IB)控制 C E 的电流(IC),E极电位最低,且正常放大
[单片机]
51<font color='red'>单片机</font>-继电器
at89s52单片机引脚图,at89s52引脚说明
  本文为您介绍 at89s52 单片机引脚图及引脚说明,at89S52 特点及其功能。at89S52,高性能的8位单片机。   AT89S52 是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。      AT89S52引脚图   AT89S52具有如下特点
[单片机]
at89s52<font color='red'>单片机</font>引脚图,at89s52引脚说明
Arduino单片机使用和开发问题记录
1、将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00” 网上查遇到这个问题的人比较多,有说驱动问题的,有说IDE设置问题的。具体到我遇到的这个情况,原因是板子上插了RF24无线传输模块(也许线还没有插对),拔掉以后再上传程序就正常了。 2、nRF24L01+无线透传使用问题 Arduino官网上似乎推荐Mirf这个库,遇到一个问题,接收端运行几分钟后停止响应;试了另外一个RF24库,遇到传输不稳定的问题,一时没有解决,还是回到Mirf了,之前的停止响应问题没有再出现。 这个论坛关于无线透传的讨论不少,虽然用arduino的不多。 Mi
[单片机]
Arduino<font color='red'>单片机</font>使用和开发问题记录
怎样制作AVR单片机ISP下载线
下面介绍利用Protel99se电路绘图软件和热转印技术制作这种下载线的方法和步骤。 一、设计ISP下载线 PCB文件利用Protel99se绘带0《自带AVR单片机ISP下载线》一文中的原理图1(为方便制作,可省略该图中的VDl)。并将图中各元件按附表所述进行封装选择。 原理图绘制完毕后,依次点击原理图编辑器中的Tools(工具)/Up-date PCB(更新原理图)菜单,自动生成下载线PCB文件。在编辑下载线PCB文件时,可先按图1所示规划PCB板的大小和布局PCB板上的元件,然后让系统自动布线(为减小PCB尺寸,采用双面布线),最后对自动布线作适当调整,经过手动调整布线后的PCB板如图2所示。 二、分图层打印 P
[单片机]
怎样制作AVR<font color='red'>单片机</font>ISP下载线
汽车电子CAN FD控制芯片MCU接口电路设计
CAN总线技术不仅涉及汽车电子和轨道交通,还涉及医疗器械、工业控制、智能家居和机器人网络互连,这些行业对CAN产品的稳定性和抗干扰能力都有很高的要求。 上篇我们讲了在汽车CAN FD上,数据出错可能导致数据位被错误地解析为填充位,或者填充位被错误地解析为数据位,使数据位和填充位的个数发生变化,CAN FD采用了差分信号传输数据,通信的可靠性很高,错误位个数达到8的概率几乎为0。 那么秉承着与其后期解决不如前期规避的设计思路,就能设计出满足行业应用,规避奇葩问题的干扰,设计出符合汽车、交通运输、医疗器械、工业控制、智能家居和机器人网络互连的高可靠性CAN产品。 拿车身域控制芯片来举例,车身域主要负责车身各种功能的控制。随
[嵌入式]
汽车电子CAN FD控制芯片<font color='red'>MCU</font>接口电路设计
MCS_51单片机与8155H的接口设计
另一种可编程的接口芯片8155,Intel公司研制的8155不仅具有两个8位的I/O端口(A口、B口)和一个6位的I/O端口(C口),而且还可以提供256 B的静态RAM存储器和一个14位的定时/计数器。8155和单片机的接口非常简单,目前被广泛应用。 1.  8155的结构和引脚 8155有40个引脚,采用双列直插封装,其引脚图和组成框图如下图所示。 我们对8155的引脚分类说明如下: (1) 地址/数据线AD0~AD7(8条):是低8位地址线和数据线的共用输入总线,常和51单片机的P0口相连,用于分时传送地址数据信息,当ALE=1时,传送的是地址。 (2) I/O口总线(22条):PA0~PA7、PB0~PB7分
[单片机]
MCS_51<font color='red'>单片机</font>与8155H的接口设计
基于51单片机的简易时钟设计
功能: 1、使用 单片机 内部定时器实现时分秒计时 2、能够设置闹钟时间 3、闹钟时间到,蜂鸣器响 4、使用LCD1602显示时间 部分程序: #include reg51.h #include lcd1602.h #define uchar unsigned char #define uint unsigned int sbit beep=P3^2;//蜂鸣器 sbit k1=P1^0;//按钮 sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit k5=P1^4; sbit k6=P1^5; sbit k7=P1^6; sbit k8=P1^7; uchar shi=11,fen=5
[单片机]
基于51<font color='red'>单片机</font>的简易时钟设计
下一代汽车微控制器
意法半导体致力于帮助汽车行业应对电气化和数字化的挑战,不仅提供现阶段所需的解决方案,未来还提供更强大的统一的MCU平台开发战略,通过突破性创新支持下一代车辆架构和软件定义汽车的开发。 下面就让意法半导体微控制器、数字IC和射频产品部(MDRF)总裁Remi EL-OUAZZANE揭秘ST下一代汽车微控制器的战略部署。 电动化和数字化正在给汽车行业带来深刻巨变。尽管最近一些汽车厂商缩减了汽车电动化计划,但是我们仍然认为,经济实惠的混合动力和电动汽车未来将主导汽车市场,未来汽车将是软件定义的汽车,采用以太网作为主要的车载总线协议。无线下载(OTA)软件更新确保汽车功能得到不断改善,无缝集成新功能,因此,OTA将是决定终端用户的汽车
[汽车电子]

推荐帖子

那位高手会做单片机MIDI录播系统
那位高手会做单片机MIDI录播系统,就是可以先录外部输入到单片机的MIDI信号数据后存储起来,录好后可由单片机进行播放MIDI信号输出。会的可联系QQ/微信:533918那位高手会做单片机MIDI录播系统
mikecom 单片机
比较器输出方波的上升沿是斜的原因?
用的LM2903比较器,之前输出正常,现在测出来上升沿是斜的,请问是什么原因呢?比较器输出方波的上升沿是斜的原因?这个是开漏输出的吧?上拉电阻太小了比较器是OC输出型,要接上拉电阻才能输出电源轨。而电路中存在容性环节,与上拉电阻共同构成RC回路,故上升沿的波形必然表现为RC曲线。容性环节越大,上拉电阻阻值越高,RC曲线自然就越平缓。想让上升沿陡直,减小上拉电阻阻值。 这是推挽输出吧,不是推挽输出需要接入上拉电阻吗我刚注意到截图不完整。上拉电阻您说的是R12那
好难好难123 电路观察室
【求助】关于延时的问题!
我用C写延时子程序,请问怎么样才可以算出延时了多久呀!好像430讲时序方面也讲的很少,哪位高手有这方面的资料或程序,可否借光参考一下。【求助】关于延时的问题!通过“软件仿真”可以看到执行周期。再按执行频率算出实际执行时间。请问lsdfae03“软件仿真”哪里可以看到执行周期啊!我没找到啊写常规的延时程序建议用汇编写这样就免得重新编译后延时常数改变 引用: 请问lsdfae03“软件仿真”哪里可以看到执行周期啊!我没找到啊
硬件工程师 微控制器 MCU
Wi-Fi 架构以及 Wi-Fi 标准的未来发展
当今Wi-Fi产品的通用架构及其支持的功能,包括从Wi-Fi4(802.11n)到最新的Wi-Fi6(802.11ax)的硬件要求。Wi-Fi6E(6GHz802.11ax),IEEE在下一代标准802.11be中寻找的功能,如何解决未来产品中的这些挑战。这些一定都是大家想了解的,那么Wi-Fi产品的通用架构有哪些呢?可以看一下,Qorvo是怎么介绍的。Wi-Fi架构以及Wi-Fi标准的未来发展Wi-Fi架构以及Wi-Fi标准的未来
alan000345 RF/无线
遇到这个问题,你觉得可信不?
器件:曾烧坏过模拟部分的F28035SPITXBUF写入0x5000输出0x47c6又将波特率改低后,写入0x55aa,它输出0x7777(用示波器看的结果)近来一直在做F28035带ADS8332,调了好久也不成功。原来做过的,是可以工作的,找了好久的原因,也没有找到,下午就仔细地看SPI的输出波形,突然发现问题。如上。本器件,使用GPIO口带LCD,正常。SPI的CLOCK输出正常,它难道把SPI部分SPI部分也烧坏了?遇到这个问题,你觉得可信不?芯片工作电流,温度有
dontium 微控制器 MCU
【花雕动手做】有趣好玩的音乐可视化系列小项目(19)--通体光纤灯
偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。上回项目17,第一次接触光导纤维,还整了50米长,实验的结果一般般。光纤只是端面亮,亮一点,光量太少了。这次搜寻到一种侧面亮的光导纤维(我给它起名叫做通体光纤),不同品种,规格是直径1.5mm,一下子收了500厘米长,
eagler8 DIY/开源硬件专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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