一個DHT11溫濕度測試程序
單片機源程序如下:
- /*******************************************************************************/
- //DHT11溫濕度測試程序
- //P0作為LCD的數(shù)據(jù)控制口,P2.0 作為DHT11data總線 ,P2.1作為狀態(tài)顯示
- //作者:趙軍偉 蘭州大學信息科學與工程學院 08級通信工程一班
- /********************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- typedef unsigned char unint8;
- typedef unsigned char unint16;
- unsigned char str1[]={" "};
- unsigned char str2[]={" "};
- unsigned char code dis1[] = {"TRH RH: "};
- unsigned char code dis2[] = {"TRH T: "};
- sbit TRH = P2^1;//溫濕度傳感器DHT11數(shù)據(jù)接入
- sbit ST = P2^2;//狀態(tài)顯示,是為了方便調(diào)試,具體使用的時候可以不要
- sbit LCD_RS = P3^5;
- sbit LCD_RW = P3^6;
- sbit LCD_EN = P3^4;
- unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
- unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
- unint8 com_data,untemp,temp;
- unint8 respond;
- /*********************************************************************************/
- void delayNOP()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*********************************************************************************/
- /*********************************************************************************/
- // 毫秒級延時子程序
- /*********************************************************************************/
- void delay_ms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 150; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*********************************************************************************/
- /*********************************************************************************/
- //5us級延時程序
- /*********************************************************************************/
- void delay_us()
- {
- unint8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- /********************************************************************************/
-
- /********************************************************************************/
- // 測試LCD忙碌狀態(tài)
- //lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數(shù)據(jù)。
- /********************************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************************/
- /*******************************************************************************/
- // 寫入指令數(shù)據(jù)到LCD
- /*******************************************************************************/
- void lcd_wcmd(unsigned char cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*****************************************************************************/
- /*****************************************************************************/
- //寫顯示數(shù)據(jù)到LCD
- //RS=高電平,RW=低電平,E=高脈沖,D0-D7=數(shù)據(jù)。
- /*****************************************************************************/
- void lcd_wdata(unsigned char dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /****************************************************************************/
- /****************************************************************************/
- //LCD初始化設(shè)定
- /****************************************************************************/
- void lcd_init()
- {
- delay_ms(15);
- lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)
- delay_ms(5);
- lcd_wcmd(0x38);
- delay_ms(5);
- lcd_wcmd(0x38);
- delay_ms(5);
- lcd_wcmd(0x0c); //顯示開,關(guān)光標
- delay_ms(5);
- lcd_wcmd(0x06); //移動光標
- delay_ms(5);
- //lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容,如果屏幕過暗,可將這倆句刪除
- //delay_ms(5);
- }
- /****************************************************************************/
- /****************************************************************************/
- //設(shè)定LCD顯示位置
- /****************************************************************************/
- void lcd_dis_pos(unsigned char pos)
- {
- lcd_wcmd(pos | 0x80); //數(shù)據(jù)指針=80+地址變量
- }
- /****************************************************************************/
- /****************************************************************************/
- //收發(fā)信號檢測,數(shù)據(jù)讀取
- /****************************************************************************/
- char receive()
- {
- unint8 i;
- ST=0;
- com_data=0;
- for(i=0;i<=7;i++)
- {
- respond=2;
- while((!TRH)&&respond++);
- delay_us();
- delay_us();
- delay_us();
- if(TRH)
- {
- temp=1;
- respond=2;
- while((TRH)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp;
- }
- return(com_data);
- }
- /****************************************************************************/
- /****************************************************************************/
- //濕度讀取子程序
- //溫度高8位== TH_data
- //溫度低8位== TL_data
- //濕度高8位== RH_data
- //濕度低8位== RL_data
- //校驗 8位 == CK_data
- //調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
- /***************************************************************************/
- void read_TRH()
- {
- //主機拉低18ms
- TRH=0;
- delay_ms(18);
- TRH=1;
- //DATA總線由上拉電阻拉高 主機延時20us
- delay_us();
- delay_us();
- delay_us();
- delay_us();
- //delay_us();
- //delay_us();delay_us();delay_us();delay_us();
- //主機設(shè)為輸入 判斷從機響應(yīng)信號
- TRH=1;
- //判斷DHT11是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行
- if(!TRH)
- {
- respond=2;
- //判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
- while((!TRH)&& respond++);
- respond=2;
- //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
- while(TRH && respond++);
- //數(shù)據(jù)接收狀態(tài)
- RH_temp = receive();
- RL_temp = receive();
- TH_temp = receive();
- TL_temp = receive();
- CK_temp = receive();
- TRH=1;ST=1;
- //數(shù)據(jù)校驗
- untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
- if(untemp==CK_temp)
- {
- RH_data = RH_temp;
- RL_data = RL_temp;
- TH_data = TH_temp;
- TL_data = TL_temp;
- CK_data = CK_temp;
- }
- }
- //濕度整數(shù)部分
- str1[0] = (char)(0X30+RH_data/10);
- str1[1] = (char)(0X30+RH_data%10);
- str1[2] = 0x2e; //小數(shù)點
- //濕度小數(shù)部分
- str1[3] = (char)(0X30+RL_data/10);
- str1[5] = 0X25; //"%"
- str1[6] = 0X52; //"R"
- str1[7] = 0X48; //"H"
- //溫度整數(shù)部分
- str2[0] = (char)(0X30+TH_data/10);
- str2[1] = (char)(0X30+TH_data%10);
- str2[2] = 0x2e; //小數(shù)點
- //溫度小數(shù)部分
- str2[3] = (char)(0X30+TL_data/10);
- str2[5] = 0X27; //"'"
- str2[6] = 0X43; //"C"
- }
- /****************************************************************************/
- //主函數(shù)
- //TH,TL,RH,RL分別代表溫濕度的整數(shù)和小數(shù)部分
- /****************************************************************************/
- void main()
- {
- unsigned char i,n=0x40,m;
- lcd_init();
- delay_us();
- while(1)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
main.rar
(2.26 KB, 下載次數(shù): 25)
2018-3-1 22:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|