仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Altium Designer畫的PCB圖如下:(51hei附件中可下載工程文件)
單片機源程序如下:
- /*********************************************************************************
- 本實驗僅限學習交流 AT89C52 12Mhz DHT11 LCD1602
- 接線如下
- DHT11_DQ = P2^0
- LCD1602_E= P2^7
- LCD1602_RW=P2^5
- LCD1602_RS=P2^6
- D0—D7接到P0口
- 本實驗沒有用到DHT的校驗位Check_Init,想使用校驗位,定義一個變量t,t=HUMI_Buffer_Int+HUMI_Low_Int+TEM_Buffer_Int+TEM_Low_Int;
- 判斷t與Check_Init是否相等。
- 本實驗只顯示了整數部分,小數部分沒顯示,小數部分顯示和整數部分顯示一樣,類別進行。
- *********************************************************************************/
- #include"dht11.h"
- #include"reg52.h"
- #include"lcd.h"
- unsigned char dis[]="RH:"; //濕度字符串
- unsigned char dis1[]="TEMP:"; //溫度字符串
- unsigned char i;
- int main()
- { LcdInit(); //1602初始化
- DHT11_Init(); //DHT11初始化
- while(1)
- {
- DHT11_Read(); //DHT11數值讀取
- LcdWriteCom(0x80);//第一列第一個字符
- for(i=0;i<3;i++)
- {
- LcdWriteData(dis[i]); //顯示“RH:”
- }
- LcdWriteData(HUMI_Buffer_Int/10+0x30); //顯示濕度的十位
- LcdWriteData(HUMI_Buffer_Int%10+0x30); //顯示濕度的個位
- LcdWriteData(0x25); //顯示字符“%”
- LcdWriteCom(0x80+0x40); //第二行第一個
- for(i=0;i<5;i++)
- {
- LcdWriteData(dis1[i]); //顯示字符“TEMP”
- }
- LcdWriteData(TEM_Buffer_Int/10+0x30); //顯示溫度的十位
- LcdWriteData(TEM_Buffer_Int%10+0x30); //顯示溫度的個位
- LcdWriteData(0xDF);
- LcdWriteData(0x43); //顯示字符“%”
- }
-
-
- }
復制代碼- #include "DHT11.h"
- //定義變量
- unsigned char HUMI_Buffer_Int = 0; //濕度高位
- unsigned char HUMI_Low_Int=0; //濕度低位
- unsigned char TEM_Buffer_Int = 0; //溫度高位
- unsigned char TEM_Low_Int=0; //溫度低位
- unsigned char Check_Init=0; //檢驗位
- //****************************************************
- //MS延時函數(12M晶振下測試)
- //****************************************************
- void DHT11_delay_ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=n;i>0;i--)
- {
- for(j=112;j>0;j--);
- }
- }
- //****************************************************
- //延時函數
- //****************************************************
- void DHT11_Delay( unsigned int n )
- {
- unsigned int i;
- for(i = 0 ; i < n ; i++ );
- }
- //****************************************************
- //初始化DHT11
- //****************************************************
- bit DHT11_Init()
- {
- bit Flag_DHT11 = 1;
- DHT11_DQ = 0;
- DHT11_delay_ms(25); //延時>18ms
- DHT11_DQ = 1;
- DHT11_Delay(2); //延時20~40us
- DHT11_Delay(2);
- Flag_DHT11 = DHT11_DQ;
- DHT11_Delay(2); //DHT11響應總時間80us
- DHT11_Delay(4); //DHT11拉高信號80us
- return Flag_DHT11;
- }
- //****************************************************
- //讀一個字節DHT11數據
- //****************************************************
- unsigned char DHT11_Read_Byte()
- {
- unsigned char i,dat,j;
- while( DHT11_DQ == 1 );
- for( i = 0 ; i < 8 ; i++ )
- {
- while( DHT11_DQ == 0 );
- dat <<= 1;
- for( j = 0 ; DHT11_DQ == 1 ; j++);
- if( j < 10 )
- dat &= 0xfe; //低位清零
- else
- dat |= 0x01; //低位置一
- }
- return dat;
- }
- //****************************************************
- //讀取溫濕度值,存放在TEM_Buffer和HUMI_Buffer
- //****************************************************
- void DHT11_Read()
- {
- if( DHT11_Init() == 0 )
- {
- HUMI_Buffer_Int = DHT11_Read_Byte(); //讀取濕度的整數值
- HUMI_Low_Int=DHT11_Read_Byte(); //讀取濕度的小數值
- TEM_Buffer_Int = DHT11_Read_Byte(); //讀取溫度的整數值
- TEM_Low_Int=DHT11_Read_Byte(); //讀取溫度的小數值
- Check_Init=DHT11_Read_Byte(); //讀取校驗和
- DHT11_Delay(3); //DHT11拉低總線50us
- DHT11_DQ = 1; //釋放總線
- }
- }
復制代碼
所有資料51hei提供下載:
仿真程序資料.7z
(5.09 MB, 下載次數: 108)
2020-11-28 16:51 上傳
點擊文件名下載附件
DHT11+C52+1602顯示屏+Proteus仿真+STC-ISP燒錄軟件+JDY-31 SPP藍牙模塊及其串口
|