基于STM32智能药箱的设计中,DHT11药品环境监测模块的主要代码
时间: 2024-03-21 22:39:53 浏览: 65
以下是基于STM32智能药箱中,DHT11药品环境监测模块的主要代码:
```
#include "dht11.h"
#include "delay.h"
#define DHT11_IO_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define DHT11_IO_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
DHT11_IO_OUT();
DHT11_DOUT_1;
delay_ms(1000);
return DHT11_Check();
}
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();
while (DHT11_DIN&&retry<100)
{
retry++;
delay_us(1);
}
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DIN&&retry<100)
{
retry++;
delay_us(1);
}
if(retry>=100)return 1;
return 0;
}
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DIN&&retry<100)
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DIN&&retry<100)
{
retry++;
delay_us(1);
}
delay_us(40);
if(DHT11_DIN)return 1;
else return 0;
}
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
u8 DHT11_Read_Data(u8 *temperature,u8 *humidity)
{
u8 buf[5];
u8 i;
DHT11_DOUT_1;
DHT11_Check();
buf[0]=DHT11_Read_Byte();
buf[1]=DHT11_Read_Byte();
buf[2]=DHT11_Read_Byte();
buf[3]=DHT11_Read_Byte();
buf[4]=DHT11_Read_Byte();
if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
{
*humidity=buf[0];
*temperature=buf[2];
return 0;
}
else return 1;
}
```
这段代码主要包括了DHT11模块的初始化、检测、读取等功能。其中,DHT11_Init()函数用于初始化DHT11模块;DHT11_Check()函数用于检测DHT11模块是否正常工作;DHT11_Read_Bit()函数和DHT11_Read_Byte()函数用于读取模块返回的数据;DHT11_Read_Data()函数用于读取温湿度数据,并将其传递给主程序进行处理。
需要注意的是,这段代码中使用了一些宏定义,如DHT11_IO_IN()、DHT11_IO_OUT()、DHT11_DOUT_1等,这些宏定义需要在其他文件中进行定义和声明。同时,这段代码中使用了stm32f10x.h库,需要在工程中添加该库文件。
阅读全文