精华内容
下载资源
问答
  • 大学生课设专用,基于C51单片机温湿度监控报警系统实现超温,高湿度报警,选用DHT11传感器,适合简单的大学生课设单片机自主设计程序
  • 51单片机温湿度C程序

    2013-08-20 13:57:22
    来自原互联网的温湿度相关代码,做过一些更改过,基于1602液晶屏显示,SHT10传感器。
  • 基于单片机温湿度系统的设计,里面有PCB原理图,程序,以及相关论文,编程语言是C语言,适合单片机学习,以供参考。
  • 本文给大家分享了51单片机 温湿度传感器DHT11代码。
  • 51单片机温湿度报警器 仿真
  • 本文通过使用STC89C52单片机、DHT11传感器模块、1602...DHT11数字温湿度传感器把采集到的温湿度数据传给单片机,经过单片机的处理后准确的显示到液晶屏上,并对温湿度设置上下限, 超过设定范围则报警。 附件为C代码。
  • 单片机温湿度控制系统设计 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 基于51单片机 温湿度传感器 加OLED 显示
  • STC89C51单片机温湿度DHT11检测仪(环境检测仪)程序与proteus仿真,课程设计优秀作品,亲测可用,欢迎下载!!! STC89C51单片机温湿度DHT11检测仪(环境检测仪)程序与proteus仿真,课程设计优秀作品,亲测可用,...
  • 基于单片机温湿度测试仪设计.pdf
  • 系统硬件设计:系统通过集成数字式温湿度传感器检测环境的温度值和湿度值,将环境的温度和湿度转换成数字量,并将结果传送给单片机,通过数码管显示温湿度的值,通过键盘输入要调的温湿度,进而控制温湿度
  • 基于89c52单片机温湿度检测,实时检测温度和是湿度,并在数码管上显示,预定阈值,超过阈值报警
  • 51单片机温湿度监控

    2011-04-22 22:15:22
    很全面的一份有关单片机温湿度监控的设计资料,里面包含的内容很多
  • 本文通过使用STC89C52单片机、DHT11传感器模块、1602液晶显示屏模块以及继电器控制模块,简单明了的实现的温湿度的控制要求。DHT11数字温湿度传感器把采集到的温湿度数据传给单片机,经过单片机的处理,准确的显示到...
  • DHT11数字温湿度传感器把采集到的温湿度数据传给单片机,经过单片机的处理后准确的显示到液晶屏上,并对温湿度设置上下限, 超过设定范围则报警。硬件电路图: 3、部分代码 #include //调用单片机头文
  • 通过Proteus内置组件完成的51单片机实现的温湿度和光照和二氧化碳的Proteus仿真程序,附加代码。
  • 51单片机温湿度测控系统设计

    千次阅读 2020-04-11 10:59:17
    标题:51单片机温湿度测控系统设计 一,器材目录 51单片机最小系统板,DHT11温湿度传感器三个(求取平均温湿度),继电器,水泵,排气扇,加热片,PNP三极管8550(驱动继电器工作),LCD1602显示温湿度值,发光二极管...

    标题:51单片机温湿度测控系统设计

    一,器材目录
    51单片机最小系统板,DHT11温湿度传感器三个(求取平均温湿度),继电器,水泵,排气扇,加热片,PNP三极管8550(驱动继电器工作),LCD1602显示温湿度值,发光二极管。
    二,实现要求
    三个温湿度传感器DHT11采集温湿度显示到LCD1602上,通过四个按键实现屏幕切换设置恒温值,温度上下限,湿度上下限,K1具有设置和确定功能,K2增加,K3减少,K4返回,如果温度低于设定恒温值时,调用PID算法控制加热设备,温度高于设定恒温值时,停止加热,如果当前温湿度高于或者低于所设置的温湿度上下限时,蜂鸣器报警提示,并且开启相应的除湿或加湿设备工作,当按键设定完恒温值,温湿度上下限时,可以随时查看所设定值的大小。
    三,PROTEUS仿真电路图
    由于在仿真中找不到水泵,排气扇,加热片这些器件,直接用发光二极管替代!
    在这里插入图片描述四,DHT11温湿度传感器接

    展开全文
  • 51单片机DHT11温湿度系统程序设计程序原理图仿真
  • 单片机温湿度控制技术及其在石化炼油行业的应用.pdf
  • 51单片机温湿度控制

    2021-09-14 18:40:16
    51单片机温湿度控制,温度达到范围led灯和继电器没有运作,请问是什么地方出了问题?谢谢大家! #include <reg52.h> #include <intrins.h> #include <absacc.h> #include <math.h> //包含头文件 #define uchar ...
  • 用eclipse做的,通过WiFi连接51单片机温湿度检测烟雾报警程序,适合学生学习,有兴趣的都可以下载来看看
  • 51单片机温湿度报告

    千次阅读 2020-02-13 15:29:24
    1前言 本项目是测控技术与仪器及相关专业集中实践性环节系列之一,是学习完...本次实训的主要目的是为了使得同学们能够合理的运用所学知识,能够简单的运用单片机使得其能够通过同学们的程序编辑达到既定的目标...

    1前言

    本项目是测控技术与仪器及相关专业集中实践性环节系列之一,是学习完《单片机原理及应用》课程后,并在进行相关课程设计基础上进行的一次综合练习,让我们初步学会设计一个小型单片机应用系统,能够基本掌握单片机应用系统的软硬件设计及调试的方法,培养我们工程设计能力和实践创新能力。
    本次实训的主要目的是为了使得同学们能够合理的运用所学知识,能够简单的运用单片机使得其能够通过同学们的程序编辑达到既定的目标,在运用中学习。提高同学们的实际运用能力。还有就是让同学们能够熟练的运用所学习的各种运用软件如能够运用Proteus软件绘制系统硬件图及模拟图,能够熟练使用Keil 51的运用软件对程序工程的建立、调试、下载等等。更主要的是培养同学们的合作意识,使得同学们能够相互交流、相互帮助共同完成本次实训。

    2实训项目及实训环境要求

    2.1实训项目

    本次实训项目的名称:温湿度检测系统。其主要是基于51单片机硬件的支持下通过程序编辑及模块的运用达到检测外界温湿度的目的,具体要求如下所示:

    对环境的温湿度进行实时的监测,采用数码管方式显示,并且可以通过串口与PC通讯。PC不仅可以接收单片机的监测数据,同时还能设置单片机的报警温度。

    以上要求可以理解为在实训中需要将外部温湿度模块通过连接线连接到51单片机的一个引脚上。然后通过控制程序编辑,在程序中写入蜂鸣器、数码管、LED灯及温湿度模块的驱动程序,通过串口得到温湿度模块上检测到的内容显示在数码管上,并且能够通过PC上位机设置温湿度报警值,使得程序运行后能够通过检测到的温度是否进行报警的判断。本项目是一个单片机运用的基本内容,通过对电路的简化甚至可以作为一个小型的家用化的室内温湿度的检测小设备。在其上可以增加时间功能,更是加大了其的可实用性。

    2.2实训环境要求

    本次实训对环境的要求较为简单, 只需要一台PC机在其上有安装Proteus及Keil 51软件即可。单片机开发板使用的是重庆粤嵌公司提供的,开发板使用的是STC80C52 的芯片,其他的硬件都是直接安装在上面的需要的只是我们将温湿度传感模块插上即可。

    3.实训内容

    3.1单片机的基本知识及训练

    3.1.1单片机的I/O接口

    单片机在现代社会中使用得越来越多,因它的高可靠性、高性价比、低电压、低功耗等特点,更是广泛运用于工业控制系统、通讯设备等高科技行业。在本次课程设计中主要使用的是基于STC89C52RC芯片的51系列单片机,其I/O接口主要有4个,每个I/O接口含8个引脚高电平有效。

    本项目使用的单片机主要硬件设备主要有共阴极数码管、LED灯、蜂鸣器、温湿度检测模块等,将这些硬件互相结合,运用程序相互调用即可完成一个较为复杂的程序设计。

    3.1.2单片机内部运用

    单片机具有强大功能的原因是因为在其内部具有超高速的运算处理功能如中断、计数器、定时器等,运用这些功能就能进行各种的程序处理及计算。主要内容如下:

    计数器/定时器:计数器和定时器都是单片机内部的技术单元,他们都是通过硬件电路中的晶体振荡电路来产生作用的,在单片机中晶体振荡器主要有3中类型分别是6M、12M、11.0592M,一般都是使用的11.0592M的晶体振荡器,其每次时间间隔为9us所以若需要计时1s左右则需进行计数接近10000次。定时器工工作方式如下:

    表3.1 定时器的工作模式

    M1

    M0

    设置定时器的工作方式

    0

    0

    13位定时器

    0

    1

    16位定时器, 2^16 -1 = 65535

    1

    0

    8位自动重装定时器,

    1

    1

    2个8位计数器

    中断处理:单片机在处理事件A时,突然出现事件B需要单片机立即去执行,单片机就会放下事件A,先执行事件B,执行完成后,再返回事件A去执行;这个过程叫中断,执行这个任务的叫中断系统(结构)。产生中断事件请求的叫中断源:

    1)单片机有5个中断源:外部中断(0,1), 定时器中断(0, 1),
    串口中断

    2)外部中断触发条件:EA:中断总控制开关。EA=1时,开启,EA=0,关闭。

    中断方式如下所示:

    图3.1中断原理图

    3.2数码管显示器及训练

    数码管显示训练是本次课程实训的第一个训练课程,此训练使用的数码管为3组,一组有8个LED灯组成,全为共阴极数码管,代号为a的为最低位LED管,dp为最高位的LED管运用时其不断显示刷新,利用人的视觉暂停的特点显示动态效果。在数码管显示设计时,首先需要确定所需显示的字符的LED显示组合,如需显示数字1时就需要使用对应的16进制0x06,其他的数字或字母显示以此类推。具体过程如下:

    首先确定显示数据多少及具体数据的16进制代码。

    打开定时器0计时确定多少时间进行一次变换。

    打开数码管接口。

    设置计算位数当计到最后一个时回到第一个数,实现循环显示。

    具体程序见附录一。

    数码管硬件电路图如下所示:

    图3.2数码管硬件连接图

    3.3单片机的串行通讯及训练

    现阶段传统的通讯方式分为单工方式、半双工方式、全双工方式,具体如下所示:

    单工方式:只允许数据按照一个固定的方向传送,即以方只能作为发送站,另一方只能作为接受站。

    半双工方式:数据能双向,但是不能同时双向传送每次只能有一个站发送,另一个接受,通信双方可以轮流的进行发送和接收。

    全双工方式:允许同时进行发送和接收数据。

    图3.3单工串行图

       图3.4半双工串行图
    

    图3.5全双工串行图

    在本项目中使用的串口通讯方式为全双工,其可以再上位机接收单片机传送的数据的同时,发送数据到单片机中进行设置的处理,其具体结构示意图如下:

    图3.6串行接口图

    单片机串口工作方式选择如下表:

    表3.1 串口的工作方式

    SM0

    SM1

    工作方式

    0

    0

    方式0,用于拓展并行IO口

    0

    1

    方式1,用于10位异步收发,使用最多,波特率可变

    1

    0

    方式2,11位异步收发,波特率固定

    1

    1

    方式3,11位异步收发,波特率可变

    串口数据的传输是借助与单片机中的USB串口来传输的,数据通过串口时会经过CH340这种芯片,它的作用就是将数据信号经过一系列的变化后在通过USB接口传回电脑进行对比。其具体电路如下:

    图3.7串口及供电硬件电路图

    在串行通讯训练中主要实现的就是通过上位机的串口助手,传输数据给单片机使得,通过对数据的传输来控制LED灯的亮灭,具体程序见附录二。

    3.4温湿度模块测试训练

    本项目使用的温湿度检测模块为DHT11,其是一种价格便宜,易于使用的温湿度测量二合一传感器。它具有超小体积、极低功耗等特点。其具体参数如下:

    电源供电电压3-5.5V。

    温度测量量程0-50度,误差正负两度左右。

    湿度量程:20-90%RH,误差在正负5%左右。

    采样周期约为1s一次。

    DHT11在工作时需先将电平拉低18ms然后在拉高20到40us以此来表示信号传输的开始,也就是提醒单片机是否准备好接受信号的一种手段具体如下图:

    图3.8DHT11温湿度模块工作原理图

    具体程序代码见附录三。

    3.5温湿度检测系统综合设计与调试

    3.5.1系统框图

    图3.9的系统框图

    3.5.2硬件电路

    本项目在实训前几天的基础之上,将所有的训练综合在一起,相互嵌套,互相配合及完成,本项目的最终目的。硬件方面在以上部分以有所涉及,但并不全面以下为其余硬件电路。

    蜂鸣器

    蜂鸣器主要功能就是发出声音,低电平有效,在本设计中主要作用就是当测量值到达所设预警值是能够报警提示,其硬件接口为P0.7。蜂鸣器硬件接口图如下:

    图3.10蜂鸣器接口图

    2.晶振电路

    晶振电路主要是使得单片机能够精确的计算时间的硬件设施,在本项目中使用的定时器1就是基于晶振电路而运行的,其电路图如下:

    图3.11 晶振电路图

    3.复位电路

    单片机中复位电路是最基础,也是重要的电路,其优先级最高,任何情况下都是优先考虑他的启动。复位电路图如下:

    图3.12复位电路图

    3.5.3软件设计思路

    本项目的设计思路为,通过上位机串口助手设置设定值,传输到单片机中,单片机读取温湿度模块发回来的数据传输给上位机,在单片机内部进行比较,通过检测到的温湿度值与设定值相对比若达到或超过设定值则蜂鸣器进行报警,同时数码管显示温湿度模块检测到的检测值,具体流程如下:

    图3.13 程序流程图

    3.5.4程序代码

    本项目在程序设计中需要用定时器、中断的内容,在使用之前需对其进行初始化配置。

    定时器初始化

    在本项目中使用了定时器1 ,所以只需要对之进行初始化的配置即可,具体配置如下:

    P2_0=1; 系统初始化

    TMOD = 0x20; 定时器1使用工作方式2

    TH1 = 253;设置初值

    TL1 = 253;

    TR1 = 1; 开始计时

    SCON = 0x50; 工作方式1,波特率9600bps,允许接收

    中断初始化

    本项目中中断的主要作用是启动定时器中断,当定时器计数完成后,溢出即中断开启一次,具体如下:

    ES = 1;

    EA = 1; 打开中断

    TI = 0;

    RI = 0;

    SendData(str) ; 发送到串口

    本项目具体程序见附录四。

    3.6系统调试

    在系统调试部分,主要进行的是系统软件程序和硬件的调试,在调试过程中我们发现本程序不能够通过上位机设定设定报警值,使得项目正常运行,在检查过程中发现是因为在编辑程序时忘记将串口下传数据代码编写导致的,为此进此部分代码输入后下载进入单片机中,程序运行正常,具体代码如下:

    void RSINTR() interrupt 4

    {

      buf = SBUF;
    
      flag1 = 1;
    

    RI = 0;

    }

    if(flag1 == 1)

    {

    flag1 = 0;

    ES = 0; SBUF = buf;

    while(TI == 0);

    TI = 0; »

    ES = 1; q=buf%10;

    w=(buf%100)%10;

    e=(buf/100)%10;r=buf/1000;}

    还有一个问题就是DHT11温湿度模块,在最初的时候其不能够将数据传输到单片机中,这让我们感到很疑惑,反复检测了程序之后,也没发现问题所在。所以目标只能锁定在硬件电路上,最终发现石油以DHT11模块的接触问题导致的,直接换了一个模块就好了。

    3.7实训总结

    在本次实训中最让我感到有学习意义的是串口传输技术和数据转换技术,这两种技术在所做的项目中起到了关键性的作用,比如串口传输技术如果没有这种技术那么就不可能能够在上位机上设置报警值和显示温湿度数据。通过对串口编程的学习可知道,在程序编辑时首先需确定数据的传输位数,有几位数就需要设置几个传输数据位数。正如图3.6所示,串口传输可以实现主机与丛机同时传输数据的功能,当传输位确定好之后只需用单片机串口通讯固定的代码SBUF将传输的数据为放进即可,上传及下传的方法基本相同,在此就不重复叙述。

    对于数据转换技术来说首先需对接收的数据进行和校验然后将每一位数据分别放入一个变量中存储,这些变量中存储的数据为ASC码,然后通过对其内数据分别对10取余或取整,如将某一位数据对10取余就可以这样表示 a =
    U8RH_data_H%10,其余的都和此类编程方式相同,在将其数据转换为10进制的ASC码后在其基础之上加上0的ASC码,这样显示出来的就是一个有0-9表示的10进制数,然后在通过串口调用将每一位数据传输到上位机或者直接在单片机内部数码管使用。

    4.致谢

    到目前为止,为期一周的单片机实训结束了,在本次实训中我学会了单片机更高深的应用,能够在以前的基础上,在开发单片机方面有了更好的提升,在本次实训中更是体会到了单片机串口应用的强大功能。

    本次实训的前两天都是做的普通的单片机的运用,老师简单的将以前的学习内容给我们进行了系统的讲解和复习,通过这些基础知识的复习在我们后面程序的编辑得以如鱼得水般的顺畅。在然后老师给我们讲解了单片机的基本硬件组成,使我更加明白电路的重要性,了解单片机各部件之间是如何是配合使用的。后面一天讲的内容就有点难度了,在串口的学习中使得我对基础的串口应用有了基本的了解,通过对串口的编程我明白了串口中断的基本原理,我自认为这是我在本次实训中学到的最大收获。

    通过几天的实训,使我感触深刻,要达到目的,可以使用不同的方法,在编程中“简”子贯穿整个程序,越简单则证明程序越好,毕竟单片机留给用户的资源是有限的所以我们要充分利用这些资源,达到更好的效果。

    本次实训课程是由钟秉翔老师、曹兵老师以及粤嵌公司各位老师及负责人共同指导的,非常感谢老师们的细心指导。当我遇到困难的时候老师总是不厌其烦的给我讲解不懂的内容,在这其中具有关于串口通讯的问题,在这个问题上我纠结了很久,每次问曹兵老师他总是细心的指导没有任何的抱怨,总之非常感谢老师的付出,在此谨向钟老师、曹老师、粤嵌的各位老师致以诚挚的谢意和崇高的敬意。也感谢在实训中同学们对我的帮助,这让我在这几天的实训中得到了更大的进步。

    5.参考文献

    [1]
    张毅刚. 单片机原理及接口技术[M].
    北京:人民邮电出版社.2016.

    [2]
    王静霞.单片机应用技术(C语言版)第三版.北京:电子公寓出版社,2009,1-3

    [3]
    楼然苗51系列单片机设计实例.北京航空航天出版社,2003.3

    [4]
    李秀忠.单片机原理及应用.华南理工大学出版社,2009

    附录一:数码管显示程序

    #include <reg52.h>

    sbit s1 = P1^0;

    sbit s2 = P1^1;

    sbit s3 = P1^2;

    int n = 9; //倒计时数

    unsigned int flag = 0; //定时标志位,计数100次归零

    unsigned char buf[10]=

    {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

    void main()

    {

      EA = 1;
    
      ET0 = 1;
    
      TMOD =
    

    0x01; //定时器0工作在16位定时器模式下

      TH0=(65535-9174)/256;
    
      TL0=(65535-9174)%256;
    
      TR0 = 1;
    
      P1 = 0x07;
    
      while(1)
    
      {            
    
             P0 =
    

    buf[n];

      }
    

    }

    void time_ms() interrupt 1

    {

      TH0=(65535-9174)/256;
    
      TL0=(65535-9174)%256;
    
      flag++;
    
      if(flag ==
    
      {
    
             flag
    

    = 0;

             n--;
    
             if(n
    

    < 0)

                    n
    

    = 9;

      }
    
      
    
      TF0 = 0;
    

    附录二:串口通讯程序图

    #include <reg52.h>

    sbit s1=P1^0;

    sbit s2=P0^7;

    unsigned char buf;

    unsigned int flag = 0;

    void main()

    {

      TMOD =
    

    0x20; //定时器1的工作在方式2

      TH1 = 0xfd;        //设定定时器初始值和重装值
    
      TL1 = 0xfd;  
    
      TR1 = 1;              //启动定时器1
    
      SM0 = 0;             //设定串口工作方式1            
    
      SM1 = 1;
    
      REN = 1;             //允许串口接收数据
    
      ES = 1;                //´串口分中断允许控制位
    
      EA = 1;                //总中断控制位
    
      while(1)
    
      {
    
             if(flag
    

    == 1)

             {
    
                    flag
    

    = 0;

                    ES
    

    = 0; //在发送数据前,先将串口中断断开

                    SBUF
    

    = buf;

                    while(TI
    

    == 0); //判断数据发送完毕

                    TI
    

    = 0; //清除发送中断标志位

                    ES
    

    = 1; //数据发送完毕,打开中断

                    P1=0xff;
    
                    if(buf==0x01)
    
                    {
    
       s1=1;
    
                           s2=0;
    

    }

    else

    {

    s1=0;

      s2=1;
    

    }

             }
    
      }
    

    }

    void sera() interrupt 4

    {

      buf = SBUF;
    
      flag = 1;
    
      
    
      RI = 0;
    

    }

    附录三:DHT11数据接收程序图

    void COM(void)

    {

      U8 i;
    
      
    
      for(i=0;i<8;i++)      
    
      {            
    
             while(!P2_0);
    
             
    
             Delay_10us();
    
             Delay_10us();
    
             Delay_10us();
    
    
    
             U8temp=0;
    
             if(P2_0)U8temp=1;
    
      
    
             while(P2_0);  
    
             
    
             U8comdata<<=1;
    
             U8comdata|=U8temp;        //0
    
      }//rof
    

    }

    void RH(void)

    {

      P2_0=0;
    
      Delay(180);
    
      P2_0=1;
    
      //总线由上拉电阻拉高 主机延时20us
    
      Delay_10us();
    
      Delay_10us();
    
      Delay_10us();
    
      //主机设为输入 判断从机响应信号
    

    // P2_0=1;

      //判断从机是否有低电平信号 不响应退出 响应向下运行
    
      if(!P2_0)               //T !       
    
      {
    
    
    
             while(!P2_0);
    
             while(P2_0);
    
             //数据接收状态   
    
             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;
    
             P2_0=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;
    
             }//fi
    
             
    
      }//fi
    

    }

    附录四:源程序代码

    #include <reg52.h>

    #include <intrins.h>

    //

    unsigned char buf;

    unsigned int flag1 = 0;

    typedef unsigned char
    U8; /* defined for unsigned
    8-bits integer variable

    typedef signed
    char S8; /* defined for signed 8-bits integer
    variable

    typedef unsigned int
    U16; /* defined for unsigned
    16-bits integer variable

    typedef signed
    int S16; /* defined for signed 16-bits integer
    variable

    typedef unsigned long
    U32; /* defined for unsigned
    32-bits integer variable

    typedef signed
    long S32; /* defined for signed 32-bits integer
    variable

    typedef float
    F32; /* single precision
    floating point variable (32bits)

    typedef double
    F64; /* double precision
    floating point variable (64bits)

    //

    #define uchar unsigned char

    #define uint unsigned int

    char a=0, b=0, c=0, d=0;

    //----------------------------------------------//

    //----------------IO口定义区--------------------//

    //----------------------------------------------//

    sbit P2_0 = P3^5 ;

    sbit s1 = P2^2;

    //----------------------------------------------//

    //----------------定义区-------------------//

    //----------------------------------------------//

    unsigned int time_flag=0;

    unsigned char flag=0;

    U8
    U8count,U8temp;

    U8
    U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

    U8
    U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

    U8 U8comdata;

    U8
    outdata[5]; //定义发送的字节数

    U8
    str[5]={“hello”};

    U16 U16temp1,U16temp2;

    void SendData(U8 *a)

    {

      U8 j;
    
      outdata[0]
    

    = a[0];

      outdata[1]
    

    = a[1];

      outdata[2]
    

    = a[2];

      outdata[3]
    

    = a[3];

      outdata[4]
    

    = a[4];

      for(j=0;
    

    j<5;j++)

      {
    
             SBUF
    

    = outdata[j];

             while(!TI);
    
             TI=0;
    
      }
    

    }

    //延时100US

    void Delay(U16 j)

    {

      U8 i;
    
      for(;j>0;j--)
    
      {    
    
             for(i=0;i<27;i++);
    
      
    
      }
    

    }

    //延时10US

    void
    Delay_10us(void)

    {

    unsigned char
    a;

    for(a=3;a>0;a–);

    }

    void COM(void)

    {

      U8 i;
    
      
    
      for(i=0;i<8;i++)      
    
      {            
    
             while(!P2_0);
    
             
    
             Delay_10us();
    
             Delay_10us();
    
             Delay_10us();
    
    
    
             U8temp=0;
    
             if(P2_0)U8temp=1;
    
      
    
             while(P2_0);  
    
             
    
             U8comdata<<=1;
    
             U8comdata|=U8temp;        //0
    
      }//rof
    

    }

    void RH(void)

    {

      P2_0=0;
    
      Delay(180);
    
      P2_0=1;
    
      //总线由上拉电阻拉高 主机延时20us
    
      Delay_10us();
    
      Delay_10us();
    
      Delay_10us();
    
      //主机设为输入 判断从机响应信号
    

    // P2_0=1;

      //判断从机是否有低电平信号 不响应退出 响应向下运行
    
      if(!P2_0)               //T !       
    
      {
    
    
    
             while(!P2_0);
    
             while(P2_0);
    
             //数据接收状态   
    
             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;
    
             P2_0=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;
    
             }//fi
    
             
    
      }//fi
    

    }

    void main()

    {

      P2_0=1;
    
      /* 系统初始化 */
    
      TMOD =
    

    0x20;
    //定时器T1使用工作方式2

      TH1 =
    

    253; // 设置初值

      TL1 = 253;
    
      TR1 =
    

    1; // 开始计时

      SCON =
    

    0x50;
    //工作方式1 波特率9600bps 允许接收

      ES = 1;
    
      EA =
    

    1; // ´打开所有中断

      TI = 0;
    
      RI = 0;
    
      SendData(str)
    

    ; //发送到串口

      Delay(1);         //延时100US
    
      while(1)
    
      {  
    
             if(flag1
    

    == 1)

             {
    
                    flag1
    

    = 0;

                    ES
    

    = 0; //在发送数据前,先将串口中断断开

                    SBUF
    

    = buf;

                    while(TI
    

    == 0); //判断数据发送完毕?

                    TI
    

    = 0; //清除发送中断标志位

                    ES
    

    = 1; //数据发送完毕 打开中断

         RH();
    
    
    
         //´串口显示程序
    
         //--------------------------
    
         str[0]=U8RH_data_H;
    
         str[1]=U8RH_data_L;
    
         str[2]=U8T_data_H;
    
         str[3]=U8T_data_L;
    
         str[4]=U8checkdata;
    
         SendData(str) ;  //发送到串口
    
         Delay(10000);
    
                    
    
             //获取湿度个位和十位的数值
    
             a =
    

    U8RH_data_H%10;

             b =
    

    U8RH_data_H/10;

             //将数值转换成ASCII码
    
             a +=
    

    48;

             b +=
    

    48;

             //获取温度个位和十位的数值
    
             c =
    

    U8T_data_H%10;

             d =
    

    U8T_data_H/10;

             //将数值转换成ASCII码
    
             c +=
    

    48;

             d +=
    

    48;

              str[0]=b;
    
              str[1]=a;
    
              str[2]=d;
    
              str[3]=c;
    
               str[4]='\n'; 
    
              SendData(str) ;  //·发送到串口
    
              Delay(10000);
    
             if(U8T_data_H%10>=6&U8T_data_H/10>=2)
    
             {
    
     s1=0;
    

    }

    else

    {

      s1=1;
    

    }

      }//elihw
    

    }// main

    void RSINTR() interrupt 4

    {

      buf = SBUF;
    
      flag1 = 1;
    

    RI = 0;

    }

    void time_ms()
    interrupt 1

    {

      TH0=(65535-9174)/256;
    
      TL0=(65535-9174)%256;
    
      time_flag++;
    
      if(time_flag
    

    == 1000)

      {
    
             time_flag
    

    = 0;

      }
    
      TF0 =0;
    

    }

    附录五:硬件连接图

    展开全文
  • 使用51系列单片机 驱动传感器HTU21D 显示温度 湿度在液晶LCD1602显示 按键设置上下限报警 设置的数值掉电保存
  • 单片机)显示温湿度程序

    千次阅读 2017-06-14 21:07:58
    * 【实验平台】: QX-MINI51 单片机开发版 * 【外部晶振】: 11.0592mhz * 【主控芯片】: STC89C52 * 【显示器 】: 1602 * 【传感器 】: DHT11 * 【编译环境】: Keil μVisio3 * 【程序功能】: DHT11 ...

    * 【实验平台】: QX-MINI51 单片机开发版

    * 【外部晶振】: 11.0592mhz

    * 【主控芯片】: STC89C52

    * 【显示器    】: 1602

    * 【传感器    】: DHT11

    * 【编译环境】: Keil μVisio3

    * 【程序功能】: DHT11  第三脚悬空    DHT11孔面面向开发板外                    

    * 【使用说明】: 

    *  说明:免费开源,不提供源代码分析.

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

    //   湿度20-90   温度0-50  采样间隔1S 
    #include <intrins.h>
    #include "lcd.h"
    sbit DQ=P3^7;    //DTH11
    uchar code ASCII[]="0123456789%c";
    uchar code table0[]="    Hum:00";
    uchar code table1[]="    Tem:00";
    uchar tem;
    uchar hum;
       
    display0[2]={0,0};
    display1[2]={0,0};
           
    //**************************延时函数
    void delay_ms(uint z)
    {
     uint x,y;
     for(x=z;x>0;x--)
      for(y=114;y>0;y--);
    }
    //**************************初始化DTH11
    bit Init_DTH11()
    {
     bit flag;
     uchar num;
     DQ=0;
     delay_ms(19);   // >18ms
     DQ=1;
     for(num=0;num<10;num++);   // 20-40us    34.7us
     for(num=0;num<12;num++);
     flag=DQ;
     for(num=0;num<11;num++); //DTH响应80us
     for(num=0;num<24;num++);    //DTH拉高80us
     return flag;
    }
    //****************************读DTH11数据
    uchar DTH11_RD_CHAR()
    {
     uchar byte=0;
     uchar num;
     uchar num1;
     while(DQ==1);
     for(num1=0;num1<8;num1++)
     {
      while(DQ==0);
      byte<<=1;     //高位在前
      for(num=0;DQ==1;num++);
      if(num<10)
       byte|=0x00;
      else
       byte|=0x01;
     }
     return byte;
    }
    //******************************读取DTH11温度和湿度
    void  DTH11_DUSHU()
    {
     uchar num;
     if(Init_DTH11()==0)
     { 
      hum=DTH11_RD_CHAR();   //比正常值高7度左右
      DTH11_RD_CHAR();
      tem=DTH11_RD_CHAR();
      DTH11_RD_CHAR();
      DTH11_RD_CHAR();
      for(num=0;num<17;num++);  //最后BIT输出后拉低总线50us
      DQ=1;
     }
    }
    //***********************************显示函数
    void Display_DTH11()  
    {
     display0[1]=hum/10%10;
     display0[0]=hum%10;
     
     LcdShowStr(0,  0, table0);
     DisplayOneChar (8,  0, ASCII[ display0[1] ] );
     DisplayOneChar (9,  0, ASCII[ display0[0] ] );
     DisplayOneChar (10, 0, ASCII[10] );     //显示湿度
     display1[1]=tem/10%10;
     display1[0]=tem%10;
     LcdShowStr(0,  1, table1);
     DisplayOneChar (8,  1, ASCII[ display1[1] ] );
     DisplayOneChar (9,  1, ASCII[ display1[0] ] );
     DisplayOneChar (10, 1, 0xdf );
     DisplayOneChar (11, 1, ASCII[11] );     //显示温度	  
    }  
    //*******************************主函数
    main()
    {
     tem=0;
     hum=0;
     delay_ms(1000);    //DTH11开始1s有错误输出
     InitLcd1602();
     while(1)
     {
      DTH11_DUSHU();
      Display_DTH11();
      delay_ms(2000);
     }
    }





    展开全文
  • 有基于51单片机的c语言全部程序。需要的下,包你不后悔的。
  • 温湿度传感器51单片机C语言程序功能:波特率9600 串口发送温湿度数据 数据格式:湿度 温度 校验和 例如串口发送数据 59 00 24 00 53 则湿度为59 温度为24 校验和为53 公司:DHT11参考例程 芯片:M8 晶振:外部 7...
  • 153【毕设课设】基于单片机单片机温湿度防盗窗户设计 电路图 程序 论文 【资源下载】下载地址如下:https://docs.qq.com/doc/DTlRSd01BZXNpRUxl 本设计由STC89C52单片机电路+温湿度传感器电路+红外避障传感器电路+...

    153【毕设课设】基于单片机单片机温湿度防盗窗户设计 电路图 程序 论文

    【资源下载】下载地址如下:
    https://docs.qq.com/doc/DTlRSd01BZXNpRUxl

    本设计由STC89C52单片机电路+温湿度传感器电路+红外避障传感器电路+步进电机驱动电路+蜂鸣器报警电路+电源电路组成。

    1、温度在15-32摄氏度且湿度30%-60%时,步电机正转,反之不在范围内步进电机反转。

    2、如果红外避障传感器检测到50cm内有障碍物,无论温湿度情况如何,步进电机反转,蜂鸣器鸣叫报警。

    #include "sysdefine.h"
    #include "dht21.h"
    
    sbit A1=P1^0; //定义步进电机连接端口
    sbit B1=P1^1;
    sbit C1=P1^2;
    sbit D1=P1^3;
    
    sbit buzzer = P1^6;
    sbit bizhang = P1^5;
    
    #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
    #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
    #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
    #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
    #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
    #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
    #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
    #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
    #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
    
    
    void UART_Init(void);
    void uartSendByte(unsigned char dat);
    void SendStr(unsigned char *s,unsigned char length);
    展开全文
  • 20-基于51单片机温湿度检测仪设计

    千次阅读 2020-03-27 09:36:23
    由STC89C52单片机、DHT11传感器...1、DHT11数字温湿度传感器把采集到的温湿度数据传给单片机并显示到液晶屏上; 2、可以手动设置温湿度上下限值; 3、当温湿度值超过设定的上下限值时,蜂鸣器响起,相应指示灯闪烁。
  • 设计内容主要是采用51系列单片机实现对仓库内温度和湿度进行检测和简单控制,系统具有自动检测温度和湿度,实时显示数值,并进行控制与调整。
  • 测温湿度程序.c

    2019-05-14 20:21:14
    基于单片机温湿度采集程序,改一下管脚和单片机名称就能用。STC系列

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,341
精华内容 936
关键字:

单片机温湿度程序