历史上的今天
今天是:2024年09月10日(星期二)
2021年09月10日 | STM32外设驱动篇——DHT11温湿度传感器
2021-09-10 来源:eefocus
已在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);
//总线由上拉电阻拉高 主机延时20us
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);
}
}
史海拾趣
|
一种改进的电压跟随PFCCukAC/DC变换器 随着半导体器件的发展,电力电子装置的大量应用,导致大量谐波电流涌入电网,污染电网,这一问题已引起了各国的重视。为了限制总的谐波含量(THD)以提高功率因数,制定了许多标准,如IEC1000?3?2。近年来,如 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 哪位高手手头上有altera公司的FFT-v2.1.1 ipcore的介绍,麻烦发给我一份,不胜感激。 邮箱:hutiao-001@163.com … 查看全部问答> |
|
在移植2440的usb下载nk功能到2410的eboot中时: s3c2410a_usbd.c文件中:三个函数定义和实现 BOOL UbootReadData (DWORD cbData, LPBYTE pbData); BOOL InitUSB (); void Isr_Init(); main.c文件中: // For USB Download function. extern ...… 查看全部问答> |
|
我现在想用富士通的视频叠加MB90092芯片子屏显示功能,主屏可以正常显示。 子屏显示的字符为一段乱码,代码如下: void MB90092_DisChar (UCHAR x,UCHAR y,int addr,UCHAR mul,UCHAR bc,UCHAR cc,UCHAR ff) { ...… 查看全部问答> |
|
LPC1114到了,相机不在身边,拍不了照。呵呵! 前面已经我为他设计了一个舞台,该搭建了,让他在上面尽情的发挥。 [ 本帖最后由 zhdphao 于 2010-7-31 17:38 编辑 ]… 查看全部问答> |
|
是不是所有c8051f系列单片机(内部自带温度传感器),ADC在左对齐,单端方式下产生的代码与输入电压的关系都是这个方程式:CODE=Vin*(Gain/Vref)*2^16。还有输出电压与温度的关系式怎么有两个,Vtemp=2.5mV/C*Temp+0.603V和Vtemp=2.86mV/C*Temp+0. ...… 查看全部问答> |
|
【TI原创】基于LM3S8962的网络收音机(五) --- PC端发送程序 为了配合LM3S8962+VS1053的调试,从网上下载并修改了一个发送文件的程序,用来完成: 1. 网络下载存储播放; 2. 网络实时播放 为进一步实现网络收音机的功能打下结实的基础。 代码功能简单,如下所示: # ...… 查看全部问答> |




