概述
1.温湿度传感器
1)接口说明
2)串行接口
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次
通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“ 8bit 湿度整数数据 +8bit 湿度小数数据
+8bi 温度整数数据 +8bit 温度小数数据 ”所得结果的末8位。
流程:
(1)总线空闲状态为高电平,主机把总线拉低等待DHT11检测到起始信号,主机把总线拉低必
须大于18毫秒,保证DHT11能检测到起始信号。
(2)DHT11接收到主机的开始信号后,等待主机开始信号结束,结束的时候切换到输入模式且主机会拉高电平并延时20-40us,延时后DHT11发送80us低电平响应信号.
(3)接下来DHT11发送低电平响应信号,DHT11发送响应信号后,再把总线拉
高80us,准备发送数据
(4)然后发送数据的时候,每一bit数据都以50us低电平时隙开始,高电平的长短定
了数据位是0还是1,一般超过30us则为1,否则为0.
(5)当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态
3.代码实现
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DATA_PIN P0_7
//温湿度定义
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
//延时函数
void Delay_us() //1 us延时
{
int i;
for(i=0;i<9;i++)
asm("nop");
}
void Delay_10us() //10 us延时
{
int i;
for(i=0;i<10;i++)
Delay_us();
}
void Delay_ms(uint Time)//n ms延时
{
unsigned char i;
while(Time--)
{
for(i=0;i<100;i++)
Delay_10us();
}
}
//温湿度传感
void COM(void) // 温湿写入
{
uchar i;
for(i=0;i<8;i++)
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
uchartemp=0;
if(DATA_PIN)uchartemp=1;//如果超过30us还没置0,则数据为1,置0,则数据为0
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++); //等待置0
if(ucharFLAG==1)break;
ucharcomdata<<=1;//ucharcomdata左移一位赋值给ucharcomdata
ucharcomdata|=uchartemp;//两句合起来就是给最高位赋值
}
}
void DHT11(void) //温湿传感启动
{
DATA_PIN=0;//置低电平
Delay_ms(19); //>18MS
DATA_PIN=1; //置高电平,开始信号发送结束
P0DIR &= ~0x80; //重新配置IO口方向,输入
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us(); //高电平,延时40us等待
if(!DATA_PIN) //如果电平变低,则证明检测到开始信号
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);//低电平,等待响应结束
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++); //高电平,准备输出
COM();
ucharRH_data_H_temp=ucharcomdata;//湿度高八位
COM();
ucharRH_data_L_temp=ucharcomdata;//湿度低八位
COM();
ucharT_data_H_temp=ucharcomdata;//温度高八位
COM();
ucharT_data_L_temp=ucharcomdata;//温度低八位
COM();
ucharcheckdata_temp=ucharcomdata;//校验八位
DATA_PIN=1; //置高,空闲状态
uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
if(uchartemp==ucharcheckdata_temp)//校验
{
ucharRH_data_H=ucharRH_data_H_temp;
ucharRH_data_L=ucharRH_data_L_temp;
ucharT_data_H=ucharT_data_H_temp;
ucharT_data_L=ucharT_data_L_temp;
ucharcheckdata=ucharcheckdata_temp;
}
wendu_shi=ucharT_data_H/10;
wendu_ge=ucharT_data_H%10;
shidu_shi=ucharRH_data_H/10;
shidu_ge=ucharRH_data_H%10;
}
else //没用成功读取,返回0
{
wendu_shi=0;
wendu_ge=0;
shidu_shi=0;
shidu_ge=0;
}
P0DIR |= 0x80; //IO口需要重新配置
}
最后
以上就是老实花生为你收集整理的zigbee基础应用(六)温湿度传感器DHT11的全部内容,希望文章能够帮你解决zigbee基础应用(六)温湿度传感器DHT11所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复