STM32外設(shè)驅(qū)動(dòng)篇——DHT11溫濕度傳感器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
已在STM32上進(jìn)行過(guò)測(cè)試。本例使用PC0引腳連接DHT11的data引腳。
main函數(shù)中調(diào)用下面代碼中的DTH11_test函數(shù)即可。
//數(shù)據(jù)定義:
//----以下變量均為全局變量--------
//----溫度高8位==U8T_data_H------
//----溫度低8位==U8T_data_L------
//----濕度高8位==U8RH_data_H-----
//----濕度低8位==U8RH_data_L-----
//----校驗(yàn)8位==U8checkdata-----
u8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
u8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
#defineBOOLunsignedchar
#ifndefTRUE
#defineTRUE1
#endif
#ifndefFALSE
#defineFALSE0
#endif
staticvoidDHT11_DataPin_Configure_Output(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PC端口時(shí)鐘
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);
}
staticvoidDHT11_DataPin_Configure_Input(void)
{
GPIO_InitTypeDefDataPin;
DataPin.GPIO_Pin=GPIO_Pin_0;
DataPin.GPIO_Mode=GPIO_Mode_IN_FLOATING;//懸空
DataPin.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&DataPin);
}
BOOLDHT11_get_databit(void)
{
uint8_tval;
val=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0);
if(val==Bit_RESET){
returnFALSE;
}else{
returnTRUE;
}
}
voidDHT11_set_databit(BOOLlevel)
{
if(level==TRUE){
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}else{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
}
voidmdelay(u16ms)
{
if(ms!=0){
delay_ms(ms);
}
}
voidudelay(u16us)
{
if(us!=0){
delay_us(us);
}
}
staticuint8_tDHT11_read_byte(void)
{
uint8_ti;
uint8_tdata=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{
}
}
returndata;
}
staticuint8_tDHT11_start_sampling(void)
{
DHT11_DataPin_Configure_Output();
//主機(jī)拉低18ms
DHT11_set_databit(FALSE);
mdelay(18);
DHT11_set_databit(TRUE);
//總線由上拉電阻拉高主機(jī)延時(shí)20us
udelay(10);
udelay(10);
//udelay(10);
//udelay(10);
//主機(jī)設(shè)為輸入判斷從機(jī)響應(yīng)信號(hào)
DHT11_set_databit(TRUE);
DHT11_DataPin_Configure_Input();
//判斷從機(jī)是否有低電平響應(yīng)信號(hào)如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(!DHT11_get_databit())//T!
{
//判斷從機(jī)是否發(fā)出80us的低電平響應(yīng)信號(hào)是否結(jié)束
while((!DHT11_get_databit()));
//printf("DHT11answers.rn");
//判斷從機(jī)是否發(fā)出80us的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((DHT11_get_databit()));
return1;
}
return0;
}
voidDHT11_get_data(void)
{
u8temp;
if(DHT11_start_sampling()){
//printf("DHT11isreadytotransmitdatarn");
//數(shù)據(jù)接收狀態(tài)
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();
/*Datatransmissionfinishes,pullthebushigh*/
DHT11_DataPin_Configure_Output();
DHT11_set_databit(TRUE);