標(biāo)題:
一線總線溫濕度傳感器AM2301 STM32驅(qū)動(dòng)程序
[打印本頁(yè)]
作者:
liuqixv
時(shí)間:
2021-5-20 13:39
標(biāo)題:
一線總線溫濕度傳感器AM2301 STM32驅(qū)動(dòng)程序
一線總線溫濕度傳感器AM2301驅(qū)動(dòng)程序
單片機(jī)源程序如下:
#include "AM23XX.h"
uint8_t a=0;
uint8_t flag11=0;
uint16_t count =0;
/*
* 函數(shù)名:DHT11_GPIO_Config
* 描述 :配置DHT11用到的I/O口
* 輸入 :無(wú)
* 輸出 :無(wú)
*/
void delay(int tt)
{ int j;
for(;tt!=0;tt--)
for(j=44;j>0;j--);
}
void DHT11_GPIO_Config(void)
{
/*定義一個(gè)GPIO_InitTypeDef類(lèi)型的結(jié)構(gòu)體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開(kāi)啟GPIOD的外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
/*調(diào)用庫(kù)函數(shù),初始化GPIOD*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 拉高GPIOD12 */
GPIO_SetBits(GPIOA, GPIO_Pin_5);
printf("DHT11 配置完!!");
}
/*
* 函數(shù)名:DHT11_Mode_IPU
* 描述 :使DHT11-DATA引腳變?yōu)檩斎肽J?br />
* 輸入 :無(wú)
* 輸出 :無(wú)
*/
static void DHT11_Mode_IN_FLOATING(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設(shè)置引腳模式為浮空輸入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
/*調(diào)用庫(kù)函數(shù),初始化GPIOD*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
* 函數(shù)名:DHT11_Mode_Out_PP
* 描述 :使DHT11-DATA引腳變?yōu)檩敵瞿J?br />
* 輸入 :無(wú)
* 輸出 :無(wú)
*/
static void DHT11_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;
/*調(diào)用庫(kù)函數(shù),初始化GPIOD*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
//void SDA_Pin_Output_High(void)
//{
// GPIOA->DDR |= SDA_Pin; //輸出模式
// GPIOA->ODR |= SDA_Pin; //輸出'1'
// GPIOA->CR1 |= SDA_Pin; //推挽模式 開(kāi)漏端口此位無(wú)效
// GPIOA->CR2 |= SDA_Pin; //高速輸出
//}
//
//void SDA_Pin_Output_Low(void)
//{
// GPIOA->DDR |= SDA_Pin; //輸出模式
// GPIOA->ODR &= (~SDA_Pin); //輸出'0'
// GPIOA->CR1 |= SDA_Pin; //推挽模式 開(kāi)漏端口此位無(wú)效
// GPIOA->CR2 |= SDA_Pin; //高速輸出
//}
//
//void SDA_Pin_IN_FLOATING(void)
//{
// GPIOA->CR2 &= ~(SDA_Pin); //禁止外部中斷
// GPIOA->DDR &= ~(SDA_Pin); //輸入模式
// GPIOA->CR1 &= ~(SDA_Pin); //懸浮輸入
//}
//-----------------------------------------------------------------------------------------------
static uint8_t Read_Byte(void)
{
uint8_t i, temp=0;
for(i=0;i<8;i++)
{
/*每bit以50us低電平標(biāo)置開(kāi)始,輪詢直到從機(jī)發(fā)出 的50us 低電平 結(jié)束*/
while(DHT11_DATA_IN()==Bit_RESET);//{if(++count>5000) break;};
/*DHT11 以27~28us的高電平表示“0”,以70us高電平表示“1”,
通過(guò)檢測(cè)60us后的電平即可區(qū)別這兩個(gè)狀態(tài)*/
//delay(5); //延時(shí)60us
SysTickDelay(40);
if(DHT11_DATA_IN()==Bit_SET)//60us后仍為高電平表示數(shù)據(jù)“1”
{
/*輪詢直到從機(jī)發(fā)出的剩余的 30us 高電平結(jié)束*/
while(DHT11_DATA_IN() ==Bit_SET);//{if(++count>500) break;}
// SysTickDelay(1);
temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1
}
else //60us后為低電平表示數(shù)據(jù)“0”
{//SysTickDelay(1);
temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0
}
}
return temp;
}
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{
DHT11_Mode_Out_PP();
DHT11_DATA_OUT(HIGH);
SysTickDelay(500000);
/*主機(jī)拉低*/
//DHT11_Mode_Out_PP();
DHT11_DATA_OUT(LOW);
//*延時(shí)18ms*/800US
SysTickDelay(2000); //一定要2MS 的起始信號(hào)
// DHT11_Mode_IN_FLOATING();
/*總線拉高 主機(jī)延時(shí)30us*/
//DHT11_DATA_OUT(HIGH);
DHT11_DATA_OUT(HIGH);
SysTickDelay(30);
/*主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)*/
// DHT11_Mode_IN_FLOATING();
DHT11_Mode_IN_FLOATING();
//delay(3);
/*判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行*/
//while(DHT11_DATA_IN() ==Bit_SET){a++;if(a>10) break;}
SysTickDelay(10);
if(DHT11_DATA_IN()==Bit_RESET)
{
/*輪詢直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號(hào)結(jié)束*/
count =0;
while(DHT11_DATA_IN()==Bit_RESET);// {if(++count>500) break;}
count =0;
while(DHT11_DATA_IN()==Bit_SET);//{if(++count>500) break;}
/*輪詢直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號(hào)結(jié)束*/
/*開(kāi)始接收數(shù)據(jù)*/
DHT11_Data->humi_int= Read_Byte(); //0
DHT11_Data->humi_deci= Read_Byte(); //1
DHT11_Data->temp_int= Read_Byte(); //2
DHT11_Data->temp_deci= Read_Byte(); //3
DHT11_Data->check_sum= Read_Byte();
delay(1);
/*讀取結(jié)束,引腳改為輸出模式*/
DHT11_Mode_Out_PP();
/*主機(jī)拉高*/
DHT11_DATA_OUT(HIGH);
DHT11_Data->check_sum_tep=DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci;
/*檢查讀取的數(shù)據(jù)是否正確*/
if(DHT11_Data->check_sum == DHT11_Data->check_sum_tep)
{
// display(DHT11_Data->temp_int,DHT11_Data->humi_int) ;
// delay(200000);
// display(DHT11_Data->temp_deci,DHT11_Data->humi_deci) ;
// delay(200000);
/* AM23XX 處理程序********/
DHT11_Data->hh = DHT11_Data->humi_int;
DHT11_Data->hh <<= 8;
DHT11_Data->hh |= DHT11_Data->humi_deci;
if(0>DHT11_Data->hh||DHT11_Data->hh>=1000)DHT11_Data->hh=999;
DHT11_Data->tem = DHT11_Data->temp_int;
DHT11_Data->tem <<= 8;
DHT11_Data->tem |= DHT11_Data->temp_deci;
if(0>DHT11_Data->tem||DHT11_Data->tem>=1000)DHT11_Data->tem=999;
DHT11_Data->hh_10=DHT11_Data->hh/10;
DHT11_Data->tem_10 =DHT11_Data->tem/10;
return SUCCESS;
}
else
{
// printf("和值不相等\n");
return ERROR;
}
}
else
{
return ERROR;
}
}
/*************************************END OF FILE******************************/
復(fù)制代碼
51hei.png
(9.45 KB, 下載次數(shù): 55)
下載附件
2021-5-20 16:08 上傳
所有資料51hei提供下載:
AM2301.7z
(199.84 KB, 下載次數(shù): 26)
2021-5-20 16:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1