娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月19日(星期四)

正在發(fā)生

2019年12月19日 | 單片機(jī)DHT11溫濕度+1602液晶顯示程序

發(fā)布者:機(jī)械夢(mèng)想家 來源: 51hei關(guān)鍵字:單片機(jī)  DHT11  1602液晶顯示 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

 

DHT11驅(qū)動(dòng)程序參考
http://www.51hei.com/bbs/dpj-112282-1.html
http://www.51hei.com/bbs/dpj-38067-1.html

1602驅(qū)動(dòng)程序參考
http://www.51hei.com/bbs/dpj-24671-1.html


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

程序名:    DHT11-1602

編寫人:    fby

編寫時(shí)間:  2019年3月21日

硬件支持:  STC89C52RC  DHT11  LCD1602

接口說明:  DHT11:VCC DATA NC GND

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

說明:1、單片機(jī)是STC89C52RC,晶振頻率11.0592MHz,實(shí)驗(yàn)成功。

          2、好東西要共享,大家隨意折騰~~

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

#include

#include


#define uchar unsigned char        //無符號(hào)字符型類型數(shù)據(jù)

#define uint unsigned int //無符號(hào)整型數(shù)據(jù)

#define IODATA  P0


uchar dat_r[4];          //用于存放從DHT11讀取到的數(shù)值


sbit DATA=P2^2;   //定義數(shù)據(jù)線

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

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

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



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

函數(shù)名:延時(shí)函數(shù)

調(diào)  用:Delay30us();/Delay20ms();/Delay1s();

參  數(shù):無

返回值:無 

結(jié)  果:延時(shí)相應(yīng)時(shí)間

備  注:振蕩晶體為11.0592MHz(所有延時(shí)函數(shù)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);

}



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

函數(shù)名:DHT11啟動(dòng)函數(shù)

調(diào)  用:無

參  數(shù):無

返回值:無

結(jié)  果:DHT11開始工作

備  注:

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

void DHT11_start()                 // 主機(jī)控制DHT11開始工作

{

   DATA=1;                                 // 主線空閑狀態(tài)

   _nop_();

   _nop_();

   DATA=0;                                 // 主機(jī)發(fā)送開始工作信號(hào)

   Delay20ms();   //延時(shí)18ms以上

   DATA=1;                                 // 拉高并延時(shí)等待DHT11響應(yīng)

   Delay30us();

}

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

函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)

調(diào)  用:? = DHT11_rec_byte();

參  數(shù):無

返回值:

結(jié)  果:讀DHT11數(shù)據(jù)并保存到dat

備  注:

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


uchar DHT11_rec_byte()      //接收一個(gè)字節(jié)

{

   uchar i,dat=0;

  for(i=0;i<8;i++)    //從高到低依次接收8位數(shù)據(jù)

   {          

      while(!DATA);   ////等待50us低電平過去

      Delay30us();

          Delay30us();     //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0 

      dat<<=1;           //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位

      if(DATA==1)    //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1

         dat+=1;

      while(DATA);  //等待數(shù)據(jù)線拉低    

    }  

    return dat;

}


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

函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)

調(diào)  用:? = DHT11_receive();

參  數(shù):無

返回值:無

結(jié)  果:結(jié)果保存到dat_r[i]中

備  注:

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

void DHT11_receive()      //接收40位的數(shù)據(jù)

{

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

    DHT11_start();                 // 主機(jī)控制DHT11開始工作

    if(DATA==0)

    {

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

        Delay30us();

                Delay30us();

                Delay30us();  //拉高后延時(shí)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();    //結(jié)束


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

        {

            RH=R_H;

            RL=R_L;

            TH=T_H;

            TL=T_L;

        } 

        /*數(shù)據(jù)處理,方便顯示*/

        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)

* 功能 : 這個(gè)是一個(gè)讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)

* 輸入 : 輸入的命令值

* 輸出 : 無

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

void Busy(void)

{

bit busy_flag = 1;

IODATA  = 0xff;

RS = 0;          //指令關(guān)

Delay30us();

RW = 1;          //讀狀態(tài)

Delay30us();

E = 1;        //使能高電平

while(1)

{

busy_flag = (bit)(IODATA  & 0x80); //強(qiáng)制取最高位

if(busy_flag == 0)

{

break;

}

}

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

           //將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)讀到DB0~DB7,分別將狀態(tài)標(biāo)志BF和地址計(jì)數(shù)器(AC)內(nèi)容讀到DB7和DB6~DB0。


}


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

* 名稱 : lcd1602_write_cmd(uchar del)

* 功能 : 1602命令函數(shù)

* 輸入 : 輸入的命令值

* 輸出 : 無

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

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寫數(shù)據(jù)函數(shù)

* 輸入 : 需要寫入1602的數(shù)據(jù)

* 輸出 : 無

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


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, 數(shù)據(jù)寫入數(shù)據(jù)寄存器中

}


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

* 名稱 : lcd1602_init()

* 功能 : 1602初始化,請(qǐng)參考1602的資料

* 輸入 : 無

* 輸出 : 無

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

void lcd1602_init(void)

{

Delay20ms();

lcd1602_write_cmd(0x38);         //8位數(shù)據(jù),雙列,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);//顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位

Busy();

lcd1602_write_cmd(0x0c);        //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍

}


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

* 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下

L1602_char(1,5,'b')

* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)

* 輸出 : 無

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

void lcd1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) 

{

a = 0x80;

}

if(hang == 2)

{

a = 0xc0;

}

a = a + lie - 1;

Busy();

lcd1602_write_cmd(a);  //置數(shù)據(jù)存貯器地址

Busy();

lcd1602_write_data(sign);


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

* 名稱 : lcd1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下

L1602_string(1,5,"ab cd ef;")

* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)

* 輸出 : 無

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

void lcd1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a;

if(hang == 1) 

{

a = 0x80;

}

if(hang == 2)

{

a = 0xc0;

}

a = a + lie - 1;

while(1)

{

Busy();

lcd1602_write_cmd(a);

Busy();

lcd1602_write_data(*p);

a++;

p++;    

if((*p == '

主站蜘蛛池模板: 泰宁县| 永兴县| 定西市| 惠州市| 桓仁| 东城区| 临邑县| 阿巴嘎旗| 康乐县| 容城县| 武陟县| 江城| 营山县| 长岭县| 桐梓县| 贡觉县| 古交市| 广水市| 呈贡县| 常山县| 新野县| 德昌县| 古浪县| 阜新| 剑河县| 临夏市| 武胜县| 桑日县| 西乌| 吴忠市| 临澧县| 增城市| 工布江达县| 台山市| 苍溪县| 隆昌县| 滁州市| 盖州市| 石家庄市| 朝阳县| 平泉县|