历史上的今天
返回首页

历史上的今天

今天是:2024年11月07日(星期四)

正在发生

2019年11月07日 | dht11和ds18b20温湿度控制 单片机程序

2019-11-07 来源:51hei

基于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

备  注:

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


uchar DHT11_rec_byte()      //接收一个字节

{

   uchar i,dat=0;

  for(i=0;i<8;i++)    //从高到低依次接收8位数据

   {          

      while(!DATA);   ////等待50us低电平过去

      Delay30us();

          Delay30us();     //延时60us,如果还为高则数据为1,否则为0 

      dat<<=1;           //左移位使正确接收8位数据,数据为0时直接移位

      if(DATA==1)    //数据为1时,使dat加1来接收数据1

         dat+=1;

      while(DATA);  //等待数据线拉低    

    }  

    return dat;

}


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

函数名:接收DHT11的40位的数据并校验

调  用:? = DHT11_receive();

参  数:无

返回值:无

结  果:结果保存到dat_r[i]中

备  注:

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

void DHT11_receive()      //接收40位的数据

{

    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 


        //xiao thi;

//uint zheng;

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

    if(DATA==0)

    {

        while(DATA==0);   //等待拉高     

        Delay30us();

                Delay30us();

推荐阅读

史海拾趣

Global Power Technologies Group公司的发展小趣事
对于功率较大的电路,需要考虑散热问题,避免元件过热损坏。
高通(GENITOP)公司的发展小趣事

1964年,超霸电池的前身——金山工业集团在中国香港地区成立,最初专注于生产9伏干电池,以满足当时收音机等电子产品的需求。这一时期的超霸电池以其稳定的质量和可靠的性能迅速在市场上站稳脚跟。随着电子产品的普及,金山工业敏锐地捕捉到市场机遇,逐步扩大生产规模,为后续的发展奠定了坚实基础。

展恒电子(Broadic)公司的发展小趣事

2011年,展恒电子自主研发的首款485功能芯片——HD588成功问世,并成功应用到电网产品中。这一突破不仅证明了展恒电子在芯片设计领域的实力,也为公司在电力行业的拓展奠定了坚实的基础。随后,公司继续加大研发力度,不断推出更多具有竞争力的产品,逐步在电子行业中树立了良好的口碑。

Andigilog公司的发展小趣事

2011年,展恒电子自主研发的首款485功能芯片——HD588成功问世,并成功应用到电网产品中。这一突破不仅证明了展恒电子在芯片设计领域的实力,也为公司在电力行业的拓展奠定了坚实的基础。随后,公司继续加大研发力度,不断推出更多具有竞争力的产品,逐步在电子行业中树立了良好的口碑。

Ememory Technology Inc公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

AZM [Arizona Microtek, Inc]公司的发展小趣事

在技术创新的基础上,AZM公司开始积极拓展市场。公司制定了详细的市场拓展计划,通过参加国际电子展会、建立销售网络、开展合作伙伴关系等多种方式,逐步打开了国内外市场。同时,AZM公司注重品牌建设,通过提升产品质量、优化客户服务、加强品牌宣传等手段,逐渐树立了良好的品牌形象。

问答坊 | AI 解惑

欧姆龙PLC中断问题

欧姆龙PLC如何实现中断,从那里进入及退出,请高人指点!…

查看全部问答>

Keil C51 几类重要库函数 (2)

8. 第八章 dScope for Windows使用详解 1. 第一节 概述 1. 1. 主窗口(Mainframe Window) 可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等; 2. 2. 调试窗口(DEBUG Window) 支持用户程序的各种显示方式,可连续运行 ...…

查看全部问答>

求助:求一篇关于单片机或FPGA的中英文翻译文章

偶英语水平差。。。。。 英文要1万字符以上。。急用!有的朋友给我发一份吧.谢谢 邮箱:yt137511@126.com…

查看全部问答>

[求助]关于直接通过I/O接口访问硬盘数据的可能性及思路的探索。

这个问题大概是这样的:     在OS里要访问硬盘上的数据要经过文件系统,现在我想不经过文件系统,直接对硬盘上的数据进行读写。     我的思路来自于市场上的硬盘播放器(就是可以直接播放硬盘里的多媒体文件的设备)。查了一 ...…

查看全部问答>

ST选型

请问谁清楚ST的哪个8位机有2个PWM,3个定时器,10路ADC,34个I/O(含10个AD口) ,是用来做电源的。wendellyang@163.com…

查看全部问答>

热电堆 信号选择

小弟最近想做一个用于微波炉的温度测量的红外探测模块。由于以前都没有做过项目,所以经验非常少,现在我苦于热电堆型号的挑选。         网上看了看有这些:SC0067、SC0070、10TP583T、OTP系列(如OTP-537F2、OTP- ...…

查看全部问答>

关于硬盘无刷电机的驱动

小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...…

查看全部问答>

8962 lwip 如何实现不同网段连接啊

求助,哪位告诉能指点下, 在8962上面使用lwip 如何实现不同网段的能够连接啊???就是公司网络 192.168.1.12的电脑 可以 ping通 192.168.2.2的电脑但是我的板子 192.168.1.10 ping不同 192.168.2.2的电脑…

查看全部问答>

差分放大器低通滤波器设计

有没谁用差分放大器做个低通滤波器的?请指点小弟一下,谢了...…

查看全部问答>

大三学生方向分流,求好心人指点

大三嵌入式又要分方向了, ARM 、 PCL、 单片机,感觉吧....就是没感觉,有没有前辈给这三个方向的发展,优缺点,就业情况分析一下啊? 小弟先谢谢了....!!!   …

查看全部问答>