|
微信圖片_20190323184104.jpg (291.42 KB, 下載次數(shù): 126)
下載附件
2019-3-23 18:41 上傳
DHT11驅(qū)動程序參考
http://www.zg4o1577.cn/bbs/dpj-112282-1.html
http://www.zg4o1577.cn/bbs/dpj-38067-1.html
1602驅(qū)動程序參考
http://www.zg4o1577.cn/bbs/dpj-24671-1.html
- /*********************************************************************************************
- 程序名: DHT11-1602
- 編寫人: fby
- 編寫時間: 2019年3月21日
- 硬件支持: STC89C52RC DHT11 LCD1602
- 接口說明: DHT11:VCC DATA NC GND
- *********************************************************************************************
- 說明:1、單片機(jī)是STC89C52RC,晶振頻率11.0592MHz,實驗成功。
- 2、好東西要共享,大家隨意折騰~~
- *********************************************************************************************/
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char //無符號字符型類型數(shù)據(jù)
- #define uint unsigned int //無符號整型數(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ù)
- 調(diào) 用:Delay30us();/Delay20ms();/Delay1s();
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:延時相應(yīng)時間
- 備 注:振蕩晶體為11.0592MHz(所有延時函數(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啟動函數(shù)
- 調(diào) 用:無
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:DHT11開始工作
- 備 注:
- **********************************************************************************************/
- void DHT11_start() // 主機(jī)控制DHT11開始工作
- {
- DATA=1; // 主線空閑狀態(tài)
- _nop_();
- _nop_();
- DATA=0; // 主機(jī)發(fā)送開始工作信號
- Delay20ms(); //延時18ms以上
- DATA=1; // 拉高并延時等待DHT11響應(yīng)
- Delay30us();
- }
- /*********************************************************************************************
- 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
- 調(diào) 用:? = DHT11_rec_byte();
- 參 數(shù):無
- 返回值:
- 結(jié) 果:讀DHT11數(shù)據(jù)并保存到dat
- 備 注:
- **********************************************************************************************/
- uchar DHT11_rec_byte() //接收一個字節(jié)
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!DATA); ////等待50us低電平過去
- Delay30us();
- Delay30us(); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
- if(DATA==1) //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
- dat+=1;
- while(DATA); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- /*********************************************************************************************
- 函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗
- 調(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(); //拉高后延時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)
- * 功能 : 這個是一個讀狀態(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和地址計數(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初始化,請參考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);//顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
- Busy();
- lcd1602_write_cmd(0x0c); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
- }
- /********************************************************************
- * 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"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)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"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 == '\0')||(a==0x90)||(a==0xd0)) //字符結(jié)束或每行最后一個字符
- {
- break;
- }
- }
- }
- /*********************************************************************************************
- 函數(shù)名:主函數(shù)
- 調(diào) 用:無
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:讀DHT11數(shù)據(jù)并送到1602顯示
- 備 注:
- **********************************************************************************************/
- void main (void)
- {
-
- Delay20ms();
- lcd1602_init(); //LCD初始化
- while(1)
- {
- Delay1s(); //經(jīng)測試,兩次連讀要至少延時80ms
- DHT11_receive();//接受數(shù)據(jù)
- lcd1602_string(1,1,"SHIDU:");
- lcd1602_string(2,1,"WENDU:");
- lcd1602_char(1,7,dat_r[0]);
- lcd1602_char(1,8,dat_r[1]);
- lcd1602_char(2,7,dat_r[2]);
- lcd1602_char(2,8,dat_r[3]);
- lcd1602_string(1,9,"%");
- lcd1602_char(2,9,0XDF);
- lcd1602_string(2,10,"C");
-
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
DHT11-1602.rar
(40.01 KB, 下載次數(shù): 594)
2019-3-23 18:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|