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