|
兩個代碼拼接起來的,現(xiàn)在溫度顯示8,濕度顯示19不知道上什么原因和真實溫濕度相差很遠(yuǎn)
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
- // 文 件 名 : main.c
- // 版 本 號 : v2.0
- // 作 者 : HuangKai
- // 生成日期 : 2014-0101
- // 最近修改 :
- // 功能描述 : OLED 4接口演示例程(51系列)
- // 說明:
- // ----------------------------------------------------------------
- // GND 電源地
- // VCC 接5V或3.3v電源
- // D0 P1^0(SCL)
- // D1 P1^1(SDA)
- // RES 接P12
- // DC 接P13
- // CS 接P14
- // ----------------------------------------------------------------
- // 修改歷史 :
- // 日 期 :
- //All rights reserved
- //******************************************************************************/
- #include "REG51.h"
- #include "oled.h"
- #include "bmp.h"
- sbit DHT=P3^5;//DHT11模塊
- void Delay30us();
- void Delay20ms();
- void Delay1s();
- void DHT_Collect();
- unsigned int Temperature[3]={1,1,1};//前兩位為整數(shù)部分,后一位為小數(shù)部分
- unsigned int Humidity[2]={1,1};//傳回的濕度數(shù)據(jù)只有整數(shù)部分
- unsigned char Data_Receive[5];
- int main(void)
- {
- while(1)
- {
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(0,4,0);//溫
- OLED_ShowCHinese(16,4,2);//度
- OLED_ShowCHinese(0,6,1);//濕
- OLED_ShowCHinese(16,6,2);//度
- OLED_ShowString(6,0,"0.96' OLED TEST",16);//
- DHT_Collect();//DHT11數(shù)據(jù)采集
- Delay1s();
- Delay1s();//注意:長時間的延時必須要有,不然會讀出0
- OLED_ShowNum(32,4,Temperature,3,16);//溫度顯示
- OLED_ShowNum(32,6,Humidity,3,16);//濕度顯示
- delay_ms(8000);
- }
-
- }
- 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;//主機(jī)發(fā)起始信號
- Delay20ms();//主機(jī)拉低總線至少18ms
- DHT=1;//主機(jī)拉高總線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 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);
- }
-
復(fù)制代碼
|
評分
-
查看全部評分
|