OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5674|回复: 4

STM32F103RB 上面加DHT11 貌似没有响应

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-9-26
在线时间
0 小时
发表于 2014-9-26 11:26:11 | 显示全部楼层 |阅读模式
5金钱
#include <stdio.h>
#include"stm32f10x.h"

#define uint unsigned int

uint us = 0;
uint ms = 0;
__IO uint32_t TimingDelay;//设置全局变量
//__IO uint i;

USART_InitTypeDef USART_InitStructure;

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

void SysTickInit(uint Hzsecond) //滴答定时器初始化
{
if(SysTick_Config(SystemCoreClock / Hzsecond))
{
while(1);
}
}
void SysTickDelay(__IO uint32_t nTime)//滴答定时器延时
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}

void SysTick_Handler(void)//滴答定时器中断
{
TimingDelay_Decrement();
}
void NVIC_GroupConfig(void)
{
    /* 配置NVIC中断优先级分组:
     - 1比特表示主优先级  主优先级合法取值为 0 或 1 
     - 3比特表示次优先级  次优先级合法取值为 0..7
     - 数值越低优先级越高,取值超过合法范围时取低bit位 
    */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    /*==================================================================================
      NVIC_PriorityGroup   |  主优先级范围  |  次优先级范围  |   描述
      ==================================================================================
     NVIC_PriorityGroup_0  |      0         |      0-15      |   0 比特表示主优先级
                           |                |                |   4 比特表示次优先级 
     ----------------------------------------------------------------------------------
     NVIC_PriorityGroup_1  |      0-1       |      0-7       |   1 比特表示主优先级
                           |                |                |   3 比特表示次优先级 
     ----------------------------------------------------------------------------------
     NVIC_PriorityGroup_2  |      0-3       |      0-3       |   2 比特表示主优先级
                           |                |                |   2 比特表示次优先级 
     ----------------------------------------------------------------------------------
     NVIC_PriorityGroup_3  |      0-7       |      0-1       |   3 比特表示主优先级
                           |                |                |   1 比特表示次优先级 
     ----------------------------------------------------------------------------------
     NVIC_PriorityGroup_4  |      0-15      |      0         |   4 比特表示主优先级
                           |                |                |   0 比特表示次优先级   
    ==================================================================================*/
}
void GPIO_Configure_OUT()  //引脚输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void GPIO_Configure_IN() //引脚出入配置
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);

}

void DHT11_Rst(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
     SysTickDelay(20000);

GPIO_SetBits(GPIOA,GPIO_Pin_11);
SysTickDelay(30);
}

uint DHT11_Check(void)
{
uint retry = 0;
uint i = 1;
GPIO_Configure_IN();
i = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
while(!i && retry<100)
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;
else retry = 0;
while(!i && retry<100)
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;
else return 0;



int DHT11(void)
{
GPIO_Configure_OUT();
GPIO_SetBits(GPIOA,GPIO_Pin_11);

DHT11_Rst();
return DHT11_Check();
}

uint DHT11_Read_Bit(void)
{
uint retry = 0,i = 0;
i = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
while(i && retry<100)
{
retry++;
SysTickDelay(1);
}
retry = 0;
while(!i && retry<100)
{
  retry++;
SysTickDelay(1);
}
    SysTickDelay(40);
if(i) return 1;
else return 0;
}

uint DHT11_Read_Byte(void)
{
uint i,dat;
dat = 0;
for(i=0;i<8;i++)
{
dat<<=1;
dat |= DHT11_Read_Bit();
}
return dat;
}
uint DHT11_Read_Data(uint *temp,uint *humi)
{
uint buf[5];
uint j;
DHT11_Rst();
if(DHT11_Check() == 0)
{
for(j=0;j<5;j++)
{
buf[j] = DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
else return 1;

}   return 0;
}
//void RCC_Configuration(void) {    /* Setup the microcontroller system. Initialize the Embedded Flash Interface,        initialize the PLL and update the SystemFrequency variable. */   SystemInit();    }

void Usart()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

// GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);


USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);

}

int main()
{
uint t=0;
uint temperature,humidty;
SystemInit();
Usart();
SysTickInit(1000000);//初始化滴答定时us级延时  
printf("\n\r----------------------------------------\n");
printf("\n\rthis is my DHT11\r\n");

// printf("\n\r---------------------------------------------\n");
 // printf("\n\rWWW.ARMJISHU.COM\n ");

while(DHT11())
{
printf("\r\n-------DHT11初始化失败----\r\n");
}

printf("\r\n-------DHT11初始化----\r\n");
while(1)
{
DHT11_Read_Data(&temperature,&humidty);
printf("\r\n---当前温度是('C):%d\r\n",temperature);
printf("\r\n---当前湿度是(%):%d\r\n",humidty);
SysTickInit(100000);
}

}
PUTCHAR_PROTOTYPE
{
  USART_SendData(USART1, (uint8_t) ch);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {
  }
  return ch;
}



谢谢大家指教  求助


最佳答案

查看完整内容[请看2#楼]

参考下我们的战舰板DHT11例程,很容易搞出来的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-26 11:26:12 | 显示全部楼层
参考下我们的战舰板DHT11例程,很容易搞出来的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-9-26
在线时间
0 小时
 楼主| 发表于 2014-9-26 13:29:26 | 显示全部楼层
求助 啊,帮帮忙啊
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-9-26
在线时间
0 小时
 楼主| 发表于 2014-10-12 15:27:34 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子哥
回复

使用道具 举报

3

主题

138

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2014-5-12
在线时间
4 小时
发表于 2014-10-12 22:08:57 | 显示全部楼层
我的是用液晶读出来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 11:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表