今天开始我开始写我的CSDN博客了,之前学C++的时候也零零散散写过几篇,但都是玩儿,太随意了,这次我要坚持下去,或许一年后或几年后我还会回来看看,希望到那时我会发现“嗨我真的进步了不少哈!”
博客我的想法是前期一星期至少一篇,内容是对本星期学习和工作的总结。
DHT11的使用和与STM32的通信:
1、DHT11传感器手册的研究成果
1)DHT11传感器是测量温湿度的
2)数字信号输出
3)传输距离可达20米
4)数据格式 8bit湿度整数+8bit湿度小数+8bit温度整数+8bit温度小数++8bit校验和(小数部分用于以后扩展目前来说没有用处)
5)通信方式是单线双向通信
数据线的默认状态是高电平--------->发送一个低电平起始信号(延时大于18MS再拉高结束起始信号)---------->GPIO引脚转换为输入模式(等待20-40us)---->读取DHT11响应信号-------->开始读取5个字节的数据
6)数据0和1的表示方法
高电平26-28us表示0
高电平70us表示1
u8 DHT11_connect(u8 *data)
{
u8 _data[5]={0};
u8 i,j;
uint64_t start_time;
dht11_GPIO_config(0); //输出模式
//Dht1_Gpio_Config(0);
PB6H;
PB6L;
delay_ms(18);
PB6H;
delay_us(30);
dht11_GPIO_config(1); //输入模式
//Dht1_Gpio_Config(1);
start_time = getsystickTime();
while(PB6IBIT) //等待拉低
{
if(getsystickTime()-start_time>=50) //超时检测大于500ms就会终止与DHT11的通信
{
return 0;
}
}
start_time = getsystickTime();
while(!PB6IBIT) //等待拉高 DHT响应信号结束
{
if(getsystickTime()-start_time>=50) //超时检测大于500ms就会终止与DHT11的通信
{
return 0;
}
}
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
_data[i]<<=1;
start_time = getsystickTime();
while(PB6IBIT) //等待拉低
{
if(getsystickTime()-start_time>=50) //超时检测大于500ms就会终止与DHT11的通信
{
return 0;
}
}
start_time = getsystickTime();
while(!PB6IBIT) //等待拉高 数据信号到来
{
if(getsystickTime()-start_time>=50) //超时检测大于500ms就会终止与DHT11的通信
{
return 0;
}
}
delay_us(30);
if(PB6IBIT)
{
_data[i]+=1;
}
}
}
if(((_data[0]+_data[1]+_data[2]+_data[3])&0xff)==_data[4])
{
data[0] = _data[0];
data[1] = _data[1];
data[2] = _data[2];
data[3] = _data[3];
data[4] = _data[4];
return 1;
}
return 0;
}