欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
一線總線溫濕度傳感器AM2301 STM32驅動程序
[打印本頁]
作者:
liuqixv
時間:
2021-5-20 13:39
標題:
一線總線溫濕度傳感器AM2301 STM32驅動程序
一線總線溫濕度傳感器AM2301驅動程序
單片機源程序如下:
#include "AM23XX.h"
uint8_t a=0;
uint8_t flag11=0;
uint16_t count =0;
/*
* 函數名:DHT11_GPIO_Config
* 描述 :配置DHT11用到的I/O口
* 輸入 :無
* 輸出 :無
*/
void delay(int tt)
{ int j;
for(;tt!=0;tt--)
for(j=44;j>0;j--);
}
void DHT11_GPIO_Config(void)
{
/*定義一個GPIO_InitTypeDef類型的結構體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟GPIOD的外設時鐘*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
/*調用庫函數,初始化GPIOD*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 拉高GPIOD12 */
GPIO_SetBits(GPIOA, GPIO_Pin_5);
printf("DHT11 配置完!!");
}
/*
* 函數名:DHT11_Mode_IPU
* 描述 :使DHT11-DATA引腳變為輸入模式
* 輸入 :無
* 輸出 :無
*/
static void DHT11_Mode_IN_FLOATING(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設置引腳模式為浮空輸入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
/*調用庫函數,初始化GPIOD*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
* 函數名:DHT11_Mode_Out_PP
* 描述 :使DHT11-DATA引腳變為輸出模式
* 輸入 :無
* 輸出 :無
*/
static void DHT11_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的GPIOD引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/*設置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;
/*調用庫函數,初始化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; //推挽模式 開漏端口此位無效
// GPIOA->CR2 |= SDA_Pin; //高速輸出
//}
//
//void SDA_Pin_Output_Low(void)
//{
// GPIOA->DDR |= SDA_Pin; //輸出模式
// GPIOA->ODR &= (~SDA_Pin); //輸出'0'
// GPIOA->CR1 |= SDA_Pin; //推挽模式 開漏端口此位無效
// 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低電平標置開始,輪詢直到從機發出 的50us 低電平 結束*/
while(DHT11_DATA_IN()==Bit_RESET);//{if(++count>5000) break;};
/*DHT11 以27~28us的高電平表示“0”,以70us高電平表示“1”,
通過檢測60us后的電平即可區別這兩個狀態*/
//delay(5); //延時60us
SysTickDelay(40);
if(DHT11_DATA_IN()==Bit_SET)//60us后仍為高電平表示數據“1”
{
/*輪詢直到從機發出的剩余的 30us 高電平結束*/
while(DHT11_DATA_IN() ==Bit_SET);//{if(++count>500) break;}
// SysTickDelay(1);
temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1
}
else //60us后為低電平表示數據“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);
/*主機拉低*/
//DHT11_Mode_Out_PP();
DHT11_DATA_OUT(LOW);
//*延時18ms*/800US
SysTickDelay(2000); //一定要2MS 的起始信號
// DHT11_Mode_IN_FLOATING();
/*總線拉高 主機延時30us*/
//DHT11_DATA_OUT(HIGH);
DHT11_DATA_OUT(HIGH);
SysTickDelay(30);
/*主機設為輸入 判斷從機響應信號*/
// DHT11_Mode_IN_FLOATING();
DHT11_Mode_IN_FLOATING();
//delay(3);
/*判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行*/
//while(DHT11_DATA_IN() ==Bit_SET){a++;if(a>10) break;}
SysTickDelay(10);
if(DHT11_DATA_IN()==Bit_RESET)
{
/*輪詢直到從機發出的 80us 高電平 標置信號結束*/
count =0;
while(DHT11_DATA_IN()==Bit_RESET);// {if(++count>500) break;}
count =0;
while(DHT11_DATA_IN()==Bit_SET);//{if(++count>500) break;}
/*輪詢直到從機發出的 80us 高電平 標置信號結束*/
/*開始接收數據*/
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);
/*讀取結束,引腳改為輸出模式*/
DHT11_Mode_Out_PP();
/*主機拉高*/
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;
/*檢查讀取的數據是否正確*/
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******************************/
復制代碼
51hei.png
(9.45 KB, 下載次數: 55)
下載附件
2021-5-20 16:08 上傳
所有資料51hei提供下載:
AM2301.7z
(199.84 KB, 下載次數: 26)
2021-5-20 16:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1