单片机
返回首页

单片机+DHT11+1602显示屏

2020-11-28 来源:51hei

单片机源程序如下:

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

  本实验仅限学习交流  AT89C52  12Mhz DHT11 LCD1602

   接线如下

   DHT11_DQ = P2^0

   LCD1602_E= P2^7

   LCD1602_RW=P2^5

   LCD1602_RS=P2^6

   D0—D7接到P0口

   本实验没有用到DHT的校验位Check_Init,想使用校验位,定义一个变量t,t=HUMI_Buffer_Int+HUMI_Low_Int+TEM_Buffer_Int+TEM_Low_Int;

   判断t与Check_Init是否相等。

         本实验只显示了整数部分,小数部分没显示,小数部分显示和整数部分显示一样,类别进行。

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

#include'dht11.h'

#include'reg52.h'

#include'lcd.h'

unsigned char dis[]='RH:';        //湿度字符串

unsigned char dis1[]='TEMP:'; //温度字符串

unsigned char i;

int main()

{ LcdInit();           //1602初始化

DHT11_Init();           //DHT11初始化

while(1)

{

   DHT11_Read();  //DHT11数值读取

   LcdWriteCom(0x80);//第一列第一个字符

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

   {

           LcdWriteData(dis[i]); //显示“RH:”

   }

   LcdWriteData(HUMI_Buffer_Int/10+0x30);        //显示湿度的十位

   LcdWriteData(HUMI_Buffer_Int%10+0x30);        //显示湿度的个位

   LcdWriteData(0x25);                                                //显示字符“%”

   LcdWriteCom(0x80+0x40);                                        //第二行第一个

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

   {

                   LcdWriteData(dis1[i]);                           //显示字符“TEMP”

   }

   LcdWriteData(TEM_Buffer_Int/10+0x30);   //显示温度的十位

   LcdWriteData(TEM_Buffer_Int%10+0x30);   //显示温度的个位

   LcdWriteData(0xDF);

   LcdWriteData(0x43);                                   //显示字符“%”

}



}


#include 'DHT11.h'


//定义变量

unsigned char HUMI_Buffer_Int = 0;            //湿度高位

unsigned char HUMI_Low_Int=0;                        //湿度低位

unsigned char TEM_Buffer_Int = 0;                //温度高位

unsigned char TEM_Low_Int=0;                        //温度低位

unsigned char Check_Init=0;                                //检验位

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

//MS延时函数(12M晶振下测试)

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

void DHT11_delay_ms(unsigned int n)

{

        unsigned int  i,j;

        for(i=n;i>0;i--)

        {

        for(j=112;j>0;j--);

        }

}

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

//延时函数

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

void DHT11_Delay( unsigned int n )

{

        unsigned int i;

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

}


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

//初始化DHT11

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

bit DHT11_Init()

{

        bit Flag_DHT11 = 1;

        DHT11_DQ = 0;

        DHT11_delay_ms(25);                        //延时>18ms


        DHT11_DQ = 1;

        DHT11_Delay(2);                                //延时20~40us


        DHT11_Delay(2);                                

        Flag_DHT11 = DHT11_DQ;               

        DHT11_Delay(2);                                //DHT11响应总时间80us


        DHT11_Delay(4);                                //DHT11拉高信号80us


        return Flag_DHT11;               

}


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

//读一个字节DHT11数据

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

unsigned char DHT11_Read_Byte()

{

        unsigned char i,dat,j;

        while( DHT11_DQ == 1 );

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

        {

                while( DHT11_DQ == 0 );        

                dat <<= 1;

                for( j = 0 ; DHT11_DQ == 1 ; j++);

                if( j < 10 )

                        dat &= 0xfe;                //低位清零

                else

                        dat |= 0x01;                //低位置一

        }

        return dat;

}


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

//读取温湿度值,存放在TEM_Buffer和HUMI_Buffer

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

void DHT11_Read()

{

        if( DHT11_Init() == 0 )

        {

                HUMI_Buffer_Int = DHT11_Read_Byte();                   //读取湿度的整数值

                HUMI_Low_Int=DHT11_Read_Byte();                                //读取湿度的小数值

                TEM_Buffer_Int = DHT11_Read_Byte();                        //读取温度的整数值

                TEM_Low_Int=DHT11_Read_Byte();                    //读取温度的小数值

                Check_Init=DHT11_Read_Byte();                                //读取校验和

                DHT11_Delay(3);                                        //DHT11拉低总线50us


                DHT11_DQ = 1;                                        //释放总线                        

        }        

}



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 使用NE555和磁簧开关的橱柜照明电路

    相关电子头条文章