|
我這里加了oled用來顯示溫濕度,采用STC15,dht11模塊,有興趣可以玩下
0.png (45.84 KB, 下載次數(shù): 96)
下載附件
2019-1-14 02:48 上傳
- #include<STC15.H>
- #include "intrins.h"//用于提供_nop_();函數(shù)
- #include "OLED_Contrul_Hygrothermograph.c"//OLED控制函數(shù)
- sbit YLED=P3^1;
- sbit RLED=P3^0;
- sbit DHT=P3^5;//DHT11模塊
- unsigned int Temperature[3]={1,1,1};//前兩位為整數(shù)部分,后一位為小數(shù)部分
- unsigned int Humidity[2]={1,1};//傳回的濕度數(shù)據(jù)只有整數(shù)部分
- unsigned char Data_Receive[5];
- /*##############################################################################################
- 設(shè)計名稱:基于DHT11的溫濕度計(Hygrothermograph)
- 設(shè)計者:清河
- 平臺:STC15F104W
- 硬件部分
- 顯示:采用OLED12864顯示溫度和濕度
- 測量,采用DHT11模塊,模塊信息如下:
- ASATR
- -----
- NA:DHT11
- OC:3.3-5.5V
- U1:5-95%RH
- U2:-20-60℃
- U3:±5%RH±2℃
- SN:A1712882A
- 為保證延時準確,晶振設(shè)置為12MHz
- 借用了http://www.raoushi.com/bbs/dpj-38067-1.html上的部分程序,在此表示感謝
- ##############################################################################################*/
- void Delay30us()//@12.000MHz
- {
- unsigned char i;
- i=87;
- while(--i);
- }
- void Delay20ms()//@12.000MHz
- {
- unsigned char i,j,k;
- i=1;
- j=234;
- k=113;
- do
- {
- do
- {
- while(--k);
- }while(--j);
- }while(--i);
- }
- void Delay1s()//@12.000MHz
- {
- unsigned char i,j,k;
- i=46;
- j=153;
- k=245;
- do
- {
- do
- {
- while(--k);
- }while(--j);
- }while(--i);
- }
- void OLED_Display()//OLED顯示驅(qū)動函數(shù)
- {
- OLED_DataDisplay_T(56,4,Temperature);//在指定位置顯示溫度
- OLED_DataDisplay_H(56,6,Humidity);//在指定位置顯示濕度
- }
- void DHT_Collect()//溫度采集函數(shù)
- {
- unsigned char i,j;//for循環(huán)變量
- unsigned char t;//超時判斷
- unsigned char dat8=0;//一次讀取的8位數(shù)據(jù),需要讀5次
- unsigned int CheckValue=0;//校驗和
-
- DHT=0;//主機發(fā)起始信號
- Delay20ms();//主機拉低總線至少18ms
- DHT=1;//主機拉高總線20~40us
- Delay30us();
-
- t=80;//設(shè)置超時等待時間
- while(DHT&&t--);//等待DHT11拉低總線
- if(t==0)//超時
- {
- DHT=1;
- }
- t=250;//設(shè)置超時等待時間
- while(!DHT&&t--);//等待DHT11拉高總線
- if(t==0)//超時
- {
- DHT=1;
- }
- t=250;//設(shè)置超時等待時間
- while(DHT&&t--);//等待DHT11拉低總線
- if(t==0)//超時
- {
- DHT=1;
- }
- for(j=0;j<5;j++)//5次讀取
- {
- for(i=0;i<8;i++)//1次8個位
- {
- //等待50us開始時隙
- t=150;//設(shè)置超時等待時間
- while(!DHT&&t--);//等待DHT11拉高總線
- if(t==0)//超時
- {
- DHT=1;
- }
- t=0;//記錄時間清零
- while(DHT&&++t);//等待并記錄高電平持續(xù)時間
- dat8<<=1;
- if(t>30)//高電平持續(xù)時間較長(70us)
- dat8+=1;//傳輸值為1
- }
- Data_Receive[j]=dat8;
- }
-
- Delay30us();//等待DHT11拉低50us
- Delay30us();
- DHT=1;
- for(i=0;i<4;i++)
- {
- CheckValue+=Data_Receive[i];//計算校驗值
- }
- if((unsigned char)CheckValue==Data_Receive[4])//比對
- {
- Temperature[0]=Data_Receive[2]/10;
- Temperature[1]=Data_Receive[2]%10;
- Temperature[2]=Data_Receive[3]%10;
- Humidity[0]=Data_Receive[0]/10;
- Humidity[1]=Data_Receive[0]%10;
- }
- }
- void sys_init()//系統(tǒng)初始化函數(shù)
- {
- YLED=1;
- RLED=1;
- OLED_Init(); //OLED初始化
- OLED_CLS();//清屏
-
- OLED_FormTitle(0,0);//顯示標題文字Linyar Lab.
- OLED_FormName(0,2);//顯示Hygrothermograph名稱
- OLED_FormLine(0,3);//顯示一條橫線
- OLED_FormTemp(8,4);//顯示溫度文字
- OLED_FormHumi(16,6);//顯示濕度文字
- OLED_AnyChar_16X16(96,4,TempChar);//在行4(每行高16像素),列96像素位置顯示攝氏度℃字符
- OLED_AnyChar_8X16(88,6,HumiChar);//在行6(每行高16像素),列88像素位置顯示百分號%字符
- OLED_AnyChar_8X16(72,4,PointChar);//在行4(每行高16像素),列72像素位置顯示冒號:字符
- }
- void main()
- {
- P3M0=0X00;
- P3M1=0X00;
- sys_init();
-
- while(1)
- {
- DHT_Collect();//DHT11數(shù)據(jù)采集
- YLED=1;RLED=0;//燈狀態(tài)轉(zhuǎn)換
- OLED_Display();//OLED顯示函數(shù)
- RLED=1;YLED=0;//燈狀態(tài)轉(zhuǎn)換
- Delay1s();
- Delay1s();//注意:長時間的延時必須要有,不然會讀出0
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
溫濕度檢測 oled.zip
(52.82 KB, 下載次數(shù): 458)
2019-1-13 15:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|