已在STM32上进行过测试。本例使用PC0引脚连接DHT11的data引脚。
main函数中调用下面代码中的DTH11_test函数即可。
//数据定义:
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
u8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
#define BOOL unsigned char
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
static void DHT11_DataPin_Configure_Output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PC.0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
static void DHT11_DataPin_Configure_Input(void)
{
GPIO_InitTypeDef DataPin;
DataPin.GPIO_Pin = GPIO_Pin_0;
DataPin.GPIO_Mode = GPIO_Mode_IN_FLOATING; //悬空
DataPin.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &DataPin);
}
BOOL DHT11_get_databit(void)
{
uint8_t val;
val = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0);
if(val == Bit_RESET){
return FALSE;
}else{
return TRUE;
}
}
void DHT11_set_databit(BOOL level)
{
if(level == TRUE){
GPIO_SetBits(GPIOC, GPIO_Pin_0);
}else{
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
}
}
void mdelay(u16 ms)
{
if(ms != 0){
delay_ms(ms);
}
}
void udelay(u16 us)
{
if(us != 0){
delay_us(us);
}
}
static uint8_t DHT11_read_byte(void)
{
uint8_t i;
uint8_t data = 0;
for(i = 0; i < 8; i++)
{
data <<= 1;
while((!DHT11_get_databit()));
udelay(10);
udelay(10);
udelay(10);
if(DHT11_get_databit()) {
data |= 0x1;
while(DHT11_get_databit());
} else{
}
}
return data;
}
static uint8_t DHT11_start_sampling(void)
{
DHT11_DataPin_Configure_Output();
//主机拉低18ms
DHT11_set_databit(FALSE);
mdelay(18);
DHT11_set_databit(TRUE);
udelay(10);
udelay(10);
// udelay(10);
// udelay(10);
//主机设为输入 判断从机响应信号
DHT11_set_databit(TRUE);
DHT11_DataPin_Configure_Input();
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT11_get_databit()) //T !
{
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT11_get_databit()));
// printf("DHT11 answers.rn");
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT11_get_databit()));
return 1;
}
return 0;
}
void DHT11_get_data(void)
{
u8 temp;
if(DHT11_start_sampling()){
//printf("DHT11 is ready to transmit datarn");
//数据接收状态
U8RH_data_H_temp = DHT11_read_byte();
U8RH_data_L_temp = DHT11_read_byte();
U8T_data_H_temp = DHT11_read_byte();
U8T_data_L_temp = DHT11_read_byte();
U8checkdata_temp = DHT11_read_byte();
/* Data transmission finishes, pull the bus high */
DHT11_DataPin_Configure_Output();
DHT11_set_databit(TRUE);
//数据校验
temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
printf("DHT11 tempature %d.%d humidity %d.%d rn",
U8T_data_H,
U8T_data_L,
U8RH_data_H,
U8T_data_L);
}else{
printf("checksum failure rn");
}
}else{
printf("DHT11 didn't answer. Sampling failed. rn");
}
}
void DTH11_test()
{
while(1)
{
DHT11_get_data();
delay_ms(1000);
}
}
上一篇:DHT11温湿度传感器stm32测试程序
下一篇:基于STM32单片机采集数据&数据上云
推荐帖子
- 怎样在wince5或模拟器上安装msxml3.dll
- 如题,我现在用的是模拟器,使用了xml解析器(msxml3)单步发现调用函数CoCreateInstance失败,提示没有注册类别,我判断是没有安装msxml3造成的,从msdn上下载了msxml3.msi,但无法安装,请问该怎样安装呢,需要手动改注册表吗(我的是wince5.0,模拟器是pocketpc2003seEmulator-vs2005自带的)怎样在wince5或模拟器上安装msxml3.dll顶肯定有知道的,再顶5.0不支持xml吗?那就自己写一个吧,网上例子不少不
- whl0808 WindowsCE
- 嵌入式字库
- 现在要在一嵌入式(数码像框)里加入字库,怎么加?要不要什么字库标准的,字库的方式?嵌入式字库
- 糖醋鲤鱼 嵌入式系统
- 哪位大神有mini_pci_e的封装呢?
- 准备用板子做毕业设计,但是一看没有接口,只好得自己开一个板了--金手指谁有可以给我一个吗?不然画这个封装还是很麻烦的,测间距,开窗哪位大神有mini_pci_e的封装呢?我这边没有唉。不行的话你找找看这种封装的尺寸要求,然后画一个吧。PCB还是要多练多画的。这个试试看行不行。 谢谢你 谢谢大佬谢谢大哥正需要~ 论坛及时雨
- 小强电子爱好者 stm32/stm8
- 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A 蓝牙BLE通信
- 本篇文章使用Bleak库驱动开发板蓝牙BLE,实现开发板BLE主机和蓝牙板BLE从机的双向通信。一.硬件部分确认蓝牙主从机型号,确认是否可以实现BLE通信。1.蓝牙主机通过查找规格书,得知开发板使用的是搭载瑞昱RTL8723DS的BT4.2蓝牙模组。经过Linux桌面简单的连接测试,确定其是支持BLE协议的。2.蓝牙从机使用一款单模BLE5.0蓝牙模组,支持主从一体。同时我为项目设计一块蓝牙报警板,蓝牙模块与STM32单片机通过U
- 六尘不改 玄铁RISC-V活动专区
- TCP SERVER如何建立两个连接?
- 请教各位一个问题:我在开发一个项目,基于STM32F107平台,加载FREERTOS及LWIP协议栈,目前实现了TCPSERVER功能,代码如下:voidTCPServer(void*arg){intoptval=1;u32_tlen;structsockaddr_inServer_Local_addr,Client_Remote_addr;fd_setfdsr;structtimevaltv;uint8_ti;tv.tv_sec
- Qiuhf stm32/stm8
- 还是关于wince下2440的COM2.COM3驱动的问题
- 我在网上查找了很多关于这个问题的解答,但是,都不理想。厂家的人员说:目前国内还没有解决2440多串口驱动的问题,请问,有哪位高手比较理想地解决了这个问题,能不能详细介绍一下或给发个例子吧,都快急死人了。还是关于wince下2440的COM2.COM3驱动的问题唉,哀应该和2410差不多吧分太少了
- bailicai WindowsCE
设计资源 培训 开发板 精华推荐
- ST1S12G18R 0.7A、1.7 MHz 降压型开关稳压器的典型应用
- OP213FSZ-REEL7精密比较器典型应用
- Si826xSOIC8-KIT、Si826x SOIC8 评估板基于 Si826x 系列基于 CMOS 的 LED 仿真器输入 ISOdrivers
- TS4990 1.2W音频功率放大器典型应用低电平待机模式
- 使用 ROHM Semiconductor 的 BD4745 的参考设计
- FEBFSL336LRN-CS04U07A-GEVB:多输出降压转换器
- DIY太阳能路灯
- LT1579CGN-3 的典型应用电路附加逻辑迫使 LT1579 进入关断状态以保护输入电池
- LTM4622EY 4 至 20Vin、1V 和 1.8V 输出、2.5A 降压模块稳压器的典型应用电路
- LT6656BCDC-2.5、2.5V 电压基准作为微功率稳压器的典型应用