实验:用数码管显示温湿度
dht11.h
#ifndef _DHT11_H
#define _DHT11_H
#include "stm32f10x_conf.h"extern void dht11_init(void);
extern void Get_Dht_Value(char *buf);
#endif
dht11.c
#include"dht11.h"
#include"bitband.h"
#include"delay.h"void set_dht_out(void)
{GPIO_InitTypeDef Gpio_Value;//初始化Gpio_Value.GPIO_Mode=GPIO_Mode_Out_PP;//指定模式-推免输出Gpio_Value.GPIO_Pin=GPIO_Pin_10;//10号引脚Gpio_Value.GPIO_Speed=GPIO_Speed_50MHz;//设置接口速度GPIO_Init(GPIOC ,&Gpio_Value);
}void set_dht_in(void)
{GPIO_InitTypeDef Gpio_Value;//初始化Gpio_Value.GPIO_Mode=GPIO_Mode_IPU;//上拉输入模式Gpio_Value.GPIO_Pin=GPIO_Pin_10;//10号引脚GPIO_Init(GPIOC,&Gpio_Value);
}void dht_out_status(int n)
{set_dht_out();if(n==1)PCOut (10)=1;elsePCOut (10)=0;
}int dht_in_status(void)
{set_dht_in();return PCIn(10);
}void dht11_init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}void Get_Dht_Value(char *buf)
{int ret=0,i=0;int times=0;u8 data=0;dht_out_status(1);//拉高数据线dht_out_status(0);//拉低数据线delay_ms(20);//至少拉低18msdht_out_status(1);//拉高数据线do{ //第一次等用超时处理ret=dht_in_status();times++;delay_us(2);//延时2微秒}while(ret==1&×<=20);//最高延时40usif(times>20)return ;while(!dht_in_status());//死等拉高for(i=0;i<40;i++){while(dht_in_status());//死等拉低while(!dht_in_status());//死等拉高delay_us(40);data<<=1;if(dht_in_status()==1)//判断获得的是高电平哥还是低点平 {data|=1;}if((i+1)%8==0)//连续转存{buf[i/8]=data;data=0;}}dht_out_status(1);//拉高数据线
}
main.c
#include"iwdg.h"
#include"led.h"
#include"fmq.h"
#include"key.h"
#include"delay.h"
#include"inte.h"
#include"hc138.h"
#include"dht11.h"
void h0(void)
{Led_On(0);Led_On(1);Led_On(2);}
void h1(void)
{Fmq_On();
}
void h2(void)
{Led_Off(0);Fmq_Off();}int main(void)
{char buff[5]={0};int dht_data=0;int i=0,j=0;inte_init();Led_Init(); Key_Init();Fmq_Init();delay_init();iwdg_init(5);hc138_init();dht11_init();set_inte_handler(h0,h1,h2);while(1){Get_Dht_Value(buff);dht_data=buff[0]*100+buff[2];show_digital_Out(dht_data);}return 0;
}
运行截图
前两位为湿度,后两位为温度