uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00}; //存储读取的温湿度信息
uint32_t sum=0; //存放校验时的求和
void DHT11_PortOutput(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void DHT11_PortInput(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t DHT_Read_Byte(void)
{
uint8_t temp; //存放读取到的位数据
uint8_t ReadDat = 0;
uint8_t i;
uint8_t retry = 0;
for(i=0;i<8;i++)
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0 && retry < 100) //等待DHT11输出高电平
{
delay_us(1);
retry++;
}
retry = 0;
delay_us(30); //延时30us,由于‘0’代码高电平时间26-28us,‘1’代码高电平时间70us,
temp = 0; //先将寄存器清零
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1) //延时30us之后如果还是高电平,证明为1代码
temp = 1; //将1存储
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1 && retry < 100) //等待信号被拉低,跳出
{
delay_us(1);
retry++;
}
retry = 0;
ReadDat<<=1; //数据左移1位,存放新得到的数据
ReadDat|= temp; //新得到的数据放到最后1位
}
return ReadDat;
}
uint8_t DHT_Read(void)
{
uint8_t i;
uint8_t retry = 0;
DHT11_PortOutput(); //端口方向设置为输出
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //端口数据拉低
delay_ms(18); //延时18ms,时序要求
GPIO_SetBits(GPIOB,GPIO_Pin_5); //端口数据拉高
delay_us(40); //延时40us,
DHT11_PortInput(); //方向设置为输入
delay_us(20); //延时20us
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0) //如果读取到低电平,证明DHT11响应
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0 && retry < 100) //等待变高电平
{
delay_us(1);
retry++;
}
retry = 0;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1 && retry < 100) //等待变低电平
{
delay_us(1);
retry++;
}
retry = 0;
for(i=0;i<5;i++) //循环5次将40位读出
{
dat[i] = DHT_Read_Byte(); //读出1个字节
}
delay_us(50); //最后延时等待50us
}
sum=dat[0]+dat[1]+dat[2]+dat[3]; //前4个字节数据的和
if(dat[4]==(u8)(sum)) //前4个数据和的末8位要和第5个数据相等,才算读取正确
{
return 1 ; //校验正确,返回1
}
else
return 0 ; //校验错误,返回0
}
不知道为什么最后串口输出的温湿度一直是0
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注【相关推荐】
- 你可以看下这个问题的回答https://ask.csdn.net/questions/7453114
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:串口通信——根据波特率计算定时器重装载值
- 您还可以看一下 张云波老师的以太坊智能合约项目实战课程中的 整个游戏的状态定义小节, 巩固相关知识点
- 除此之外, 这篇博客: 微机原理问答题中的 一般接口电路中应具有哪些电路器件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
(1) 输入、输出数据锁存器和缓冲器,用于解决CPU与外设之间速度不匹配的矛盾,以及起隔离和缓冲的作用。
(2) 控制命令和状态寄存器,以存放CPU对外设的控制命令以及外设的状态信息。
(3) 地址译码器,用于选择接口电路中的不同端口(寄存器)。
(4) 读写控制逻辑
(5) 中断控制逻辑
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报