STM8L152 DHT11测试数据一直是零,大神们看看
本帖最后由 kin_ 于 2018-2-13 22:03 编辑用stm8l做温度检测,输出至串口,都出来的数据全是零。同样的程序在stm8s208板子上顺利运行,研究了好几天了,大神们来看看:'(
main函数部分是初始化时钟分频为1
DHT11初始化工作-----------------------------------------
#define DZX_Pin GPIO_Pin_7
#define DZX_Port GPIOD
#define DZX_L GPIO_WriteBit(DZX_Port,DZX_Pin,RESET)
#define DZX_H GPIO_WriteBit(DZX_Port,DZX_Pin,SET)
#define DZX_O GPIO_Init(DZX_Port,DZX_Pin,GPIO_Mode_Out_PP_High_Fast)
#define DZX_I GPIO_Init(DZX_Port,DZX_Pin,GPIO_Mode_In_PU_No_IT)
#define DZX_V GPIO_ReadInputDataBit(DZX_Port,DZX_Pin)
DHT11代码部分-----------------------------------------
void DHT11_RST(void)
{
DZX_O;
DZX_L;
delay_ms(20);
DZX_H;
delay_us(30);
}
u8 DHT11_Check(void)
{
u8 retry=0;
DZX_I;
while(DZX_V && retry<100)
{
retry++;
delay_us(1);
}
if(retry>=100) return 1; //DHT11不存在
else retry=0;
while(DZX_V==0 && retry<100)
{
retry++;
delay_us(1);
}
if(retry>=100) return 1; //DHT11不存在
else retry=0;
return 0;//检测到DHT11
}
u8 DHT11_ReadBit(void)
{
while(DZX_V==1);
while(DZX_V==0);
delay_us(40);
if(DZX_V==1) return 1;
else return 0;
}
u8 DHT11_ReadByte(void)
{
u8 i=0;
u8 dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_ReadBit();
}
return dat;
}
u8 DHT11_ReadData(u8 *sd,u8 *wd)
{
u8 buf;
u8 i=0;
DHT11_RST();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)
{
buf=DHT11_ReadByte();
}
if(buf+buf+buf+buf==buf)
{
*sd=buf;
*wd=buf;
return 0;
}
else
{
return 1; //通讯错误
}
}
else
{
return 1; //DHT11 不存在
}
}
void DHT11_Demo(void)
{
u8 sd;
u8 wd;
if(DHT11_ReadData(&sd,&wd)==0)
{
printf("当前环境湿度:%d %%\r\n",sd);
printf("当前环境温度:%d ℃\r\n",wd);
printf("\r\n");
}
else
{
printf("DHT11温湿度传感器检测失败!\r\n");
}
delay_ms(1000);
}
“一线”器件对时序要求特别严格,每个关键延时不能太长也不能太短。建议你先把delay_ms()、delay_us()调准确,至少不要差太多。 赞同楼上意见,一看就是时序的问题。 解决没有?经验分享一下 robter 发表于 2018-2-20 08:09
解决没有?经验分享一下
问题解决了,之前用的是内部的晶振,焊上一个外部晶振,时序就好了,内部晶振不可靠 感觉应该是延时时间的问题,加外部晶振,相当于修改了时钟、延时时间
页:
[1]