本設計是基于 STC89C52 單片機和 DHT11 實現溫濕度的測量。單片機在本系統中作為溫濕度,時鐘輸入和顯示控制器件,DHT11 被用作溫濕度數據的采集和溫濕度輸出器件。最后采 nRF24L01 模塊對采集到的溫濕度時間 數據進行無線傳輸,在接收端通過 LCD1602 液晶顯示模塊顯示接收的溫濕度,從而實現溫濕度的采集和無線傳送。 主要步驟: 1.通過查閱資料,了解無線溫濕度采集系統的研究背景、國內外發展狀況; 2.熟悉 LCD1602,DHT11,NRF24L01,蜂鳴器 等模塊的基本功能; 3.熟悉 Keil C51 軟件和 STC-ISP 軟件; 4.使用 Keil C51 軟件編寫應用程序; 5.使用 STC-ISP 軟件將編譯好的程序燒寫進單片機; 6.調試并分析;
制作出來的實物圖如下:
IMG_20180129_113002_1_副本.jpg (327.17 KB, 下載次數: 35)
下載附件
2020-11-21 19:36 上傳
IMG_20180129_113032_副本.jpg (488.93 KB, 下載次數: 53)
下載附件
2020-11-21 19:36 上傳
1.png (654.79 KB, 下載次數: 53)
下載附件
2020-11-21 19:37 上傳
2.png (488.96 KB, 下載次數: 38)
下載附件
2020-11-21 19:37 上傳
單片機源程序如下:
- #include ".\\nRF24L01\\nRF24L01.h"
- #include "def.h"
- typedef unsigned char unint8;
- typedef unsigned char unint16;
- #define uint unsigned int
- unint8 com_data,untemp,temp;
- uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- uchar U8FLAG,U8comdata;
- uchar U8count,U8temp;
- uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- unint8 respond;
- void Delay(unsigned int s)
- {
- unsigned int i;
- for(i=0; i<s; i++);
- for(i=0; i<s; i++);
- }
- /*******************************************************************************************************
- DHT11相關命令
- ********************************************************************************************************/
- void Delay1(uint j)
- {
- uchar i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void)
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void COM(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!DHT11)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(DHT11)U8temp=0;
- U8FLAG=2;
- while((DHT11)&&U8FLAG++);
- //超時則跳出for循環
- if(U8FLAG==0)break;
- //判斷數據位是0還是1
- // 如果高電平高過預定0高電平值則數據位為 1
- U8comdata<<=1;
- U8comdata|=U8temp; //
- }
- }
- //--------------------------------
- //-----濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高8位== U8T_data_H------
- //----溫度低8位== U8T_data_L------
- //----濕度高8位== U8RH_data_H-----
- //----濕度低8位== U8RH_data_L-----
- //----校驗 8位 == U8checkdata-----
- //----調用相關子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- void RH(void)
- {
- //主機拉低18ms
- DHT11=0;
- Delay1(180);
- ET0 = 0;//關閉定時器0中斷
- DHT11=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設為輸入 判斷從機響應信號
- DHT11=0;
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!DHT11) //T !
- {
- U8FLAG=2;
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!DHT11)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((DHT11)&&U8FLAG++);
- //數據接收狀態
- COM();
- U8RH_data_H_temp=U8comdata;
- COM();
- U8RH_data_L_temp=U8comdata;
- COM();
- U8T_data_H_temp=U8comdata;
- COM();
- U8T_data_L_temp=U8comdata;
- COM();
- U8checkdata_temp=U8comdata;
- DHT11=0;
- ET0 = 1;//開啟定時器0中斷
- //數據校驗
- U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
- if(U8temp==U8checkdata_temp)
- {
- U8RH_data_H=U8RH_data_H_temp;
- U8RH_data_L=U8RH_data_L_temp;
- U8T_data_H=U8T_data_H_temp;
- U8T_data_L=U8T_data_L_temp;
- U8checkdata=U8checkdata_temp;
- }//fi
- }//fi
- }
-
- void main(void)
- {
- unsigned char leng =0;
- unsigned char tf =0;
- unsigned char TxBuf[20]={0}; //
- unsigned char RxBuf[20]={0};
- led=0;
- init_io() ;
- while(1)
- {
- inerDelay_us(100);
- CE=0; // chip enable
- CSN=0; // Spi disable
- SCK=0;
- RH();//溫濕度檢測受定時器影響,故在驅動程序中關閉定時器中斷,減小掃描頻率才能更好的實現紅外接收
- TxBuf[0] =U8T_data_H;
- TxBuf[2] =U8RH_data_H;
- tf = 0 ;
-
- SPI_RW_Reg(WRITE_REG+STATUS, 0xff); //
- CSN=0;
- SPI_RW(FLUSH_RX);//用于清空FIFO !!關鍵!!不然會出現意想不到的后果。!大家記住。
- CSN=1;
- if (tf==0)
- {
- led=0;
- nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
- TxBuf[0] = 0x00;
- TxBuf[2] = 0x00;
- tf=0;
- Delay(60000);
- led=0;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有程序51hei提供下載:
程序源碼與參考資料.7z
(1.93 MB, 下載次數: 81)
2020-11-21 19:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|