親測可行。頭文件網上隨便搜都有。LCD 數據口是P4端口。
IMG_20200218_090405.jpg (2.01 MB, 下載次數: 37)
下載附件
2020-2-18 09:06 上傳
單片機源程序如下:
- #include<15w.H>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS = P5^5; //定義端口
- sbit RW = P5^4;
- sbit EN = P5^3;
- sbit io=P1^0;//dht11data端接單片機的P1^0口//
- typedef bit BOOL;//此聲明一個布爾型變量即真或假//
- uchar data_byte;
- uchar RH,RL,TH,TL;
-
-
- void Delay25ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 2;
- j = 13;
- k = 237;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay8us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 19;
- while (--i);
- }
- void Delay27us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- i = 72;
- while (--i);
- }
- /**************************dht11測試某塊*************************************/
- void start()//開始信號
- {
- io=1;
- Delay8us();
- io=0;
- Delay25ms();// 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號
- io=1; //發送開始信號結束后拉高電平延時20-40us
- Delay8us();//以下三個延時函數差不多為24us符合要求
- Delay8us();
- Delay8us();
- }
-
- uchar receive_byte()//接收一個字節//
- {
- uchar i,temp;
- for(i=0;i<8;i++)//接收8bit的數據
- {
- while(!io);//等待50us的低電平開始信號結束
- Delay27us();//開始信號結束之后延時26us-28us以下三個延時函數
- temp=0;//時間為26us-28us表示接收的為數據'0'
- if(io==1)
- temp=1; //如果26us-28us之后還為高電平則表示接收的數據為'1'
- while(io);//等待數據信號高電平'0'為26us-28us'1'為70us
- data_byte<<=1;//接收的數據為高位在前右移
- data_byte|=temp;
- }
- return data_byte;
- }
-
- void receive()//接收數據//
- {
- uchar T_H,T_L,R_H,R_L,check,num_check,i;
- start();//開始信號//
- io=1; //主機設為輸入判斷從機DHT11響應信號
- if(!io)//判斷從機是否有低電平響應信號//
- {
- while(!io);//判斷從機發出 80us 的低電平響應信號是否結束//
- while(io);//判斷從機發出 80us 的高電平是否結束如結束則主機進入數據接收狀態
- R_H=receive_byte();//濕度高位
- R_L=receive_byte();//濕度低位
- T_H=receive_byte();//溫度高位
- T_L=receive_byte();//溫度低位
- check=receive_byte();//校驗位
- io=0; //當最后一bit數據接完畢后從機拉低電平50us//
- for(i=0;i<7;i++)//差不多50us的延時
- Delay8us();
- io=1;//總線由上拉電阻拉高進入空閑狀態
- num_check=R_H+R_L+T_H+T_L;
- if(num_check==check)//判斷讀到的四個數據之和是否與校驗位相同
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- check=num_check;
- }
- }
- }
- /*------------------------------------------------
- uS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- P4= 0xFF;
- RS=0;
- RW=1;
- EN=0;
- _nop_();
- EN=1;
- return (bit)(P4 & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=0;
- RW=0;
- EN=1;
- P4= com;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=1;
- RW=0;
- EN=1;
- P4= Data;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 清屏函數
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
- void main()
- {
- P0M0 = 0x00;
- P0M1 = 0x00;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
DHT11.rar
(25.27 KB, 下載次數: 16)
2020-2-18 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|