请教各位同志:
我用STM32VBT6的PE9连接DHT11的2脚.程序,我是改的原子哥的红外遥控的程序.
温湿度传感器的使用的是单总线结构:先发一个20ms的低电平,再上拉20~40us左右。然后DHT11会拉低80us,再上拉80us。然后输出40bit的数据位。
我的问题是:程序进入中断了,可是只能检测到一个pulse.
我已经弄了两天了。我用示波器看了,DHT11的反馈数据都是正确的.可就是采不到32上来.
把程序贴在下面.请大家帮我看看是哪儿出问题了。应该怎么改啊。谢谢.谢谢.劳驾各位啦!
********test.c********
#include <stm32f10x_lib.h>#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "dht11.h"
//Mini STM32开发板范例代码1
//红外遥控实验
//正点原子@ALIENTEK
//2010.5.27
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600);
LED_Init(); //初始化与LED连接的硬件接口
Dht11_Init();
PEout(9) = 1; //因为PE9接了上拉电阻,所以一上电PE9就是高电平.这句话其实可以不要.
delay_ms(10); //去抖动
PEout(9) = 0; //DHT11的输入端拉低20ms
delay_ms(20);
Dht11_Exti_Init();
PEout(9) = 1;
delay_us(10);
while(1)
{
// if(1)
// { //留做以后采集到数据,输出数据用
// }
}
}
********dht11.c函数如下:********
#include "dht11.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
u32 Remote_32data=0; //湿度 16位 和温度16位数据
u8 Remote_8data=0; //后8位检验码
u8 Remote_Rdy=0;
void Dht11_Init(void)
{
RCC->APB2ENR|=1<<6; //PE时钟使能
GPIOE->CRH&=0XFFFFFF0F;
GPIOE->CRH|=0X00000030; //PE9输出
GPIOE->ODR|=1<<9; //PE.9上拉
}
void Dht11_Exti_Init(void)
{
RCC->APB2ENR|=1<<6; //PE时钟使能
GPIOE->CRH&=0XFFFFFF0F;
GPIOE->CRH|=0X00000080; //PE9输入
GPIOE->ODR|=1<<9; //PE.9上拉
Ex_NVIC_Config(GPIO_E,9,FTIR);//将line1映射到PE.9,下降沿触发.
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2);
}
u8 Pulse_Width_Check(void)
{
u8 t=0;
while(RDATA)
{
t++;delay_us(1);
if(t==100)return t; //超时溢出
}
return t;
}
void EXTI9_5_IRQHandler(void)
{
u8 res=0;
u8 OK=0;
u8 RODATA=0;
u8 cnt=0;
// LED1=0;这是我这几天用来观测程序进行到哪儿 用的
while(1)
{
if(RDATA)//有高脉冲出现
{
res=Pulse_Width_Check();//获得此次高脉冲宽度
if(res==100)break; //非有用信号
if(res>75&&res<85)
{
OK=1; //获得开始信号
Remote_Rdy=1;
break;
}
if(res>=68&&res<72)RODATA=1;//70usDHT11输出的1
if(res>=25&&res<29)RODATA=0;//26~28usDHT11输出的0
if( OK == 1 && cnt < 32) //采集到湿度和温度的32位数据,以后再做后续处理
{
Remote_32data<<=1;
Remote_32data+=RODATA;
cnt++;
}
if(cnt>=32&&cnt<40)
{
Remote_8data<<=1;
Remote_8data+=RODATA;
cnt++;
}
if(cnt==40)break;//采集完数据,跳出
}
}
EXTI->  R=1<<9; //清除中断标志位
}
这是我抓的图。每一个数据位我都数了,是没问题的。我搞不明白的,就是为什么用PE9的中断采不进去40位数据.
|