|
两个代码拼接起来的,现在温度显示8,湿度显示19不知道上什么原因和真实温湿度相差很远
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- // 文 件 名 : 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};//前两位为整数部分,后一位为小数部分
- unsigned int Humidity[2]={1,1};//传回的湿度数据只有整数部分
- 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数据采集
- Delay1s();
- Delay1s();//注意:长时间的延时必须要有,不然会读出0
- OLED_ShowNum(32,4,Temperature,3,16);//温度显示
- OLED_ShowNum(32,6,Humidity,3,16);//湿度显示
- delay_ms(8000);
- }
-
- }
- void DHT_Collect()//温度采集函数
- {
- unsigned char i,j;//for循环变量
- unsigned char t;//超时判断
- unsigned char dat8=0;//一次读取的8位数据,需要读5次
- unsigned int CheckValue=0;//校验和
-
- DHT=0;//主机发起始信号
- Delay20ms();//主机拉低总线至少18ms
- DHT=1;//主机拉高总线20~40us
- Delay30us();
-
- t=80;//设置超时等待时间
- while(DHT&&t--);//等待DHT11拉低总线
- if(t==0)//超时
- {
- DHT=1;
- }
- t=250;//设置超时等待时间
- while(!DHT&&t--);//等待DHT11拉高总线
- if(t==0)//超时
- {
- DHT=1;
- }
- t=250;//设置超时等待时间
- 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;//设置超时等待时间
- while(!DHT&&t--);//等待DHT11拉高总线
- if(t==0)//超时
- {
- DHT=1;
- }
- t=0;//记录时间清零
- while(DHT&&++t);//等待并记录高电平持续时间
- dat8<<=1;
- if(t>30)//高电平持续时间较长(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);
- }
-
复制代码
|
评分
-
查看全部评分
|