dht11和ds18b20温湿度控制 单片机程序

2019-11-07来源: 51hei关键字:dht11  ds18b20  温湿度控制  单片机

基于51单片机,传感器使用dht11和ds18b20,dht11测温度精度有限,18b20可以弥补。第一行显示dht11采集到的湿度和温度,以及继电器状态。第二行显示18b20采集到温度和THI。THi是畜牧业衡量动物热应激指数的标准,不需要的删除掉。继电器是通过THI指数高低控制的。
 

单片机源程序如下:

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

程序名:    DHT11-1602

编写人:    fby

编写时间:  2019年3月21日

硬件支持:  STC89C52RC  DHT11  LCD1602

接口说明:  DHT11:VCC DATA NC GND

*********************************************************************************************

说明:1、单片机是STC89C52RC,晶振频率11.0592MHz,实验成功。

          2、好东西要共享,大家随意折腾~~

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

#include "reg52.h"

#include  //此文件中定义了单片机的一些特殊功能寄存器

#include

#include"temp.h"        


                         



#define uchar unsigned char        //无符号字符型类型数据

#define uint unsigned int //无符号整型数据

        #define ulong unsigned long //无符号整型数据

        #define xiao float //xiaoshu

#define IODATA  P0

        


uchar dat_r[10];          //用于存放从DHT11读取到的数值

          uchar sData[10];


sbit DATA=P2^0;   //定义数据线

sbit RS=P2^6; //定义rs端口

sbit RW=P2^5; //定义rw端口

sbit E=P2^7;

          sbit jidian=P3^7;  //定义继电器

        

        static uint i;

        extern uint zheng;


        

        

        



              

void delay200ms(void)   //误差 0us

{

    unsigned char a,b,c;

    for(c=4;c>0;c--)

        for(b=116;b>0;b--)

            for(a=214;a>0;a--);

    _nop_();  //if Keil,require use intrins.h

}


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

* 函 数 名         : datapros()

* 函数功能                   : 温度读取处理转换函数

* 输    入         : temp

* 输    出         : 无

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


void datapros(int temp)          

{

           float tp;  

        if(temp< 0)                                //当温度值为负数

          {

      sData[0]=0;

                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

                temp=temp-1;

                temp=~temp;

                tp=temp;

                temp=tp*0.0625*100+0.5;        

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算加上0.5,还是在小数点后面。


          }

        else

          {                        

                sData[0]=1; 

                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

                //如果温度是正的那么,那么正数的原码就是补码它本身

                temp=tp*0.0625*100+0.5;        

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算加上0.5,还是在小数点后面。

        }

        //显示数据处理

        sData[1] = '0'+(temp / 10000);

        sData[2] = '0'+(temp % 10000 / 1000);

        sData[3] = '0'+(temp % 1000 / 100) ;

        sData[4] = '0'+(temp % 100 / 10);

        sData[5] = '0'+(temp % 10);

          //真实数据

        sData[7] = temp / 10000;

        sData[8] = temp % 10000 / 1000;

        sData[9] = temp % 1000 / 100 ;

        sData[10] =temp % 100 / 10;

}


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

* 函 数 名         : Timer1Init

* 函数功能                   : 定时器1初始化

* 输    入         : 无

* 输    出         : 无

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

        void Timer1Init()

{

        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。


        TH1=0XFC;        //给定时器赋初值,定时1ms

        TL1=0X18;        

        ET1=1;//打开定时器1中断允许

        EA=1;//打开总中断

        TR1=1;//打开定时器                        

}




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

函数名:延时函数

调  用:Delay30us();/Delay20ms();/Delay1s();

参  数:无

返回值:无 

结  果:延时相应时间

备  注:振荡晶体为11.0592MHz(所有延时函数Copy自STC-ISP(v6.85).exe)

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

void Delay30us()                //@11.0592MHz-40

{

        unsigned char i;


        i = 11;

        while (--i);

}



void Delay20ms()                //@11.0592MHz

{

        unsigned char i, j;


        i = 36;

        j = 217;

        do

        {

                while (--j);

        } while (--i);

}



void Delay1s()                //@11.0592MHz

{

        unsigned char i, j, k;


        _nop_();

        i = 8;

        j = 1;

        k = 243;

        do

        {

                do

                {

                        while (--k);

                } while (--j);

        } while (--i);

}



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

函数名:DHT11启动函数

调  用:无

参  数:无

返回值:无

结  果:DHT11开始工作

备  注:

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

void DHT11_start()                 // 主机控制DHT11开始工作

{

   DATA=1;                                 // 主线空闲状态

   _nop_();

   _nop_();

   DATA=0;                                 // 主机发送开始工作信号

   Delay20ms();   //延时18ms以上

   DATA=1;                                 // 拉高并延时等待DHT11响应

   Delay30us();

}

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

函数名:DHT11读数据函数

调  用:? = DHT11_rec_byte();

参  数:无

返回值:

结  果:读DHT11数据并保存到dat

备  注:

******************************************************

[1] [2] [3]
关键字:dht11  ds18b20  温湿度控制  单片机 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479235.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于51单片机的电子时钟课程设计
下一篇:单片机DAC0832波形发生器实验报告

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC15单片机DHT11温湿度检测(注释详细)oled显示程序
我这里加了oled用来显示温湿度,采用STC15,dht11模块#include<STC15.H>#include "intrins.h"//用于提供_nop_();函数#include "OLED_Contrul_Hygrothermograph.c"//OLED控制函数sbit YLED=P3^1;sbit RLED=P3^0;sbit DHT=P3^5;//DHT11模块unsigned int Temperature[3]={1,1,1};//前两位为整数部分,后一位为小数部分unsigned int Humidity[2]={1,1};//传回的湿度数据只有整数部分
发表于 2019-10-24
基于DHT11的温湿计设计 OLED12864显示
本作品采用STC15F104W单片机和OLED12864(IIC)设计,配合B站上传的视频更佳。B站搜索基于DHT11的温湿计(UP凌净清河)即可查到相关视频(预计2018年7月13日前会审核完毕)。主要亮点:1.自定义的显示函数以满足显示需求2.简化的字库以满足单片机4K Flash的容量需求次要亮点:1.使用小巧的STC15F104W单片机请注意!为防止低成本盗用(虽然写的不怎么样),仅展示主程序文件源码,在附件中有完整版。#include<STC15.H>#include "intrins.h"#include "
发表于 2019-10-17
基于DHT11的温湿计设计 OLED12864显示
STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1、DHT11和DHT21传感器    这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com)。    DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。    DHT21(AM2301)湿敏电容数字温湿度模块是一款含有己校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性
发表于 2019-08-15
STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
stm32驱动DHT11温湿度模块使用方法和问题小结
最近在总结做过的几个项目,今天小结一下DHT11模块的使用。对DHT11的使用,就是编写时序和stm32进行通信。DHT11和stm32是通过一根线进行通信的,双方通过这根线上的电平变化来识别各种信号。DHT11每次传输数据会输出40bit的数据,即5个字节,它们的含义如下:每一位bit是0还是1是通过高电平的持续时间来判断的,如下两张图所示,‘0’和‘1’都是先持续50us的低电平,而后持续一段时间高电平,‘0’的高电平会持续26-28us,‘1’的电平会持续70us,因此你在判断每位数据是’0’还是’1’时,有两种方法,一种是看持续时间,显然高电平持续时间超过28us的就是’1’;另一种方法是选取一个时间点,比如在高电平
发表于 2019-08-14
stm32驱动DHT11温湿度模块使用方法和问题小结
STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1、DHT11和DHT21传感器    这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com)。    DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。    DHT21(AM2301)湿敏电容数字温湿度模块是一款含有己校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性
发表于 2019-08-14
STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
ds18b20 温度模块串口显示简单代码
今天晚上没事干编了一个极简的一个小程序,虽然简单但是还是很稳定的,连接也很简单,用最小系统板p0.0口接上ds18b20模块就可以了#include <reg51.h>#include <intrins.h>#include <stdio.h>#include "DS18B20.h"#define OSC 11059200            //晶振频率#define BAUDRATE 9600    //波特率void main(void){   
发表于 2019-11-14
ds18b20 温度模块串口显示简单代码
小广播
何立民专栏 单片机及嵌入式宝典

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

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