|
这是我写的用cc2530驱动DHT11程序,各位大神看看问题在哪
[复制链接]
液晶上温湿度都只显示“I5”,奇怪
#include "DHT11.h"
#include "includes.h"
///////////////////////////////////////////////函数定义////////////////////////////////////////////
/*注意在得到的温度值是负数的时候是用补码表示的,由于处于测试阶段室温为正,暂时没有对其进行处理
DHT11为排针下面的器件,其DATA引脚连接至P1.0,使用时对应连接CC2530相同引脚。
*/
#define DHT P1_0 //dht11的dq位连接到了P1.0脚
#define SET_OUT P1DIR|=0x01//设置为输出口
#define SET_IN P1DIR&=0xfe//设置为输入口
uint8 tdata[4]={0x00,0x00,0x00,0x00};
uint8 sbuf=0,check=0;
/*----------------------------精确延时------------------------------------*/
void delay_us(uint32 n)
{
uint16 i=0;
while(n--)
{
i =16;//16MHZ
while(i--);
}
}
void delay_ms(uint32 n)
{
while(n--)
{
delay_us(1000);
}
}
/****************************初始化及采集程序*************************************/
unsigned int StartDHT11(void)
{
SET_OUT;
DHT=0;
delay_ms(20);//触发开始,主机使DHT11低电平并延时至少18ms
DHT=1; //释放总线
delay_us(40); //wait 20-40uS 等待DHT11的低电平响应信号
SET_IN;
delay_us(20);
if(!DHT) //从机发出相应信号
{
do{} while((!DHT));//低电平的响应信号,80us
do{} while(DHT);//紧接着是80us的高电平数据准备信号。开始采集数据
return 1;
}
else{ return 0;}
}
/***********************************温湿度读取函数**********************************/
void com(void)
{
uint16 i;
for(i = 0;i<8;i++)
{
sbuf <<= 1;//接收到的数据左移一位
//接收到响应后会出现50us的低电平表示发送数据的开始
do{} while(!DHT);//等到高电平的出现,高电平的时间表示的是数据位的0和1
delay_us(50);//数据为0的信号时间为26-28us,1则为70us,这里超时检测
if(DHT)//如果还为高
{
sbuf |= 0x01;
//while(DHT11_In && ++Flag);//等待它变为低电平信号 ,这里不能一直都等,因为数据传送完了会拉高总线的
delay_us(20);//这里的延时足够了,40+10+30>70了
}
else //如果变低
{
sbuf &= 0xfe;
}
}
}
void ReadDHT11(void)
{
do{} while(!StartDHT11()); //判断是否已经响应
com();
tdata[0]=sbuf; //湿度整数部分(高8位)
com();
tdata[1]=sbuf; //湿度小数部分(低8位)
com();
tdata[2]=sbuf; //温度整数部分(高8位)
com();
tdata[3]=sbuf; //温度整数部分(低8位)
com();
check = sbuf;
}
|
|