×
单片机 > 单片机程序设计 > 详情

单片机DHT11温湿度+1602液晶显示程序

发布时间:2020-06-10 发布时间:
|

 

DHT11驱动程序参考
http://www.51hei.com/bbs/dpj-112282-1.html
http://www.51hei.com/bbs/dpj-38067-1.html

1602驱动程序参考
http://www.51hei.com/bbs/dpj-24671-1.html


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

程序名:    DHT11-1602

编写人:    fby

编写时间:  2019年3月21日

硬件支持:  STC89C52RC  DHT11  LCD1602

接口说明:  DHT11:VCC DATA NC GND

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

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

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

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

#include

#include


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

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

#define IODATA  P0


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


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

sbit RS=P1^0; //定义rs端口

sbit RW=P1^1; //定义rw端口

sbit E=P2^5; //定义en端口



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

函数名:延时函数

调  用: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; 

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

    if(DATA==0)

    {

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

        Delay30us();

                Delay30us();

                Delay30us();  //拉高后延时80us

        R_H=DHT11_rec_byte();    //接收湿度高八位  

        R_L=DHT11_rec_byte();    //接收湿度低八位  

        T_H=DHT11_rec_byte();    //接收温度高八位  

        T_L=DHT11_rec_byte();    //接收温度低八位

        revise=DHT11_rec_byte(); //接收校正位


        Delay30us();    //结束


        if((R_H+R_L+T_H+T_L)==revise)      //校正

        {

            RH=R_H;

            RL=R_L;

            TH=T_H;

            TL=T_L;

        } 

        /*数据处理,方便显示*/

        dat_r[0]='0'+(RH/10);

        dat_r[1]='0'+(RH%10);

        dat_r[2]='0'+(TH/10);

        dat_r[3]='0'+(TH%10);

    }

}


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

* 名称 : bit Busy(void)

* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态

* 输入 : 输入的命令值

* 输出 : 无

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

void Busy(void)

{

bit busy_flag = 1;

IODATA  = 0xff;

RS = 0;          //指令关

Delay30us();

RW = 1;          //读状态

Delay30us();

E = 1;        //使能高电平

while(1)

{

busy_flag = (bit)(IODATA  & 0x80); //强制取最高位

if(busy_flag == 0)

{

break;

}

}

E = 0;           //E 1->0,rs=0,rw=1,

           //将数据寄存器内的数据读到DB0~DB7,分别将状态标志BF和地址计数器(AC)内容读到DB7和DB6~DB0。


}


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

* 名称 : lcd1602_write_cmd(uchar del)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

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

void lcd1602_write_cmd(uchar del)

{

RS = 0;

Delay30us();

RW = 0;

Delay30us();

E = 0;

Delay30us();

IODATA  = del;

Delay30us();

E = 1;

Delay30us();

E = 0;                        //E 1->0,rs=0,rw=0, 将指令代码写入指令寄存器中

}


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

* 名称 : lcd1602_write_data(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

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


void lcd1602_write_data(uchar del)

{

Busy();      

Delay30us();

RS = 1;

Delay30us();

RW = 0;

Delay30us();

E = 0;

Delay30us();

IODATA  = del;

Delay30us();

E = 1;

Delay30us();

E = 0;                          //E 1->0,rs=1,rw=0, 数据写入数据寄存器中

}


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

* 名称 : lcd1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

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

void lcd1602_init(void)

{

Delay20ms();

lcd1602_write_cmd(0x38);         //8位数据,双列,5*7字形

Delay20ms();

lcd1602_write_cmd(0x38);

Delay20ms();

lcd1602_write_cmd(0x38);

Busy();

lcd1602_write_cmd(0x08);// 只开显示 

Busy();    

lcd1602_write_cmd(0x01);        //清屏

Busy();

lcd1602_write_cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

Busy();

lcd1602_write_cmd(0x0c);


关键字:单片机  DHT11  1602液晶显示

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析