使用STM32F103C8T6最小系統,搭載DHT22溫濕度傳感器,顯示屏用12864,測量數據和溫度計的顯示數值基本一致!
2.jpg (152.09 KB, 下載次數: 43)
下載附件
2022-5-15 11:28 上傳
溫濕度顯示
1.jpg (31.61 KB, 下載次數: 33)
下載附件
2022-5-15 11:28 上傳
對比溫度計顯示
單片機源程序如下:
- #include "humiture.h"
- #include "systick.h"
- char RHData_H_Temp,RHData_L_Temp,TData_H_Temp,TData_L_Temp,CheckData_Temp; //溫濕度數據校驗前存放位置
- char RHData_H,RHData_L,TData_H,TData_L,CheckData; //最終溫濕度數據存放處
- char check_temp;
- void Humitureport_outputinit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure_A; //聲明一個結構體變量,用來初始化GPIO_A ; A PORT AS OUTPUT
-
- //SystemInit(); //system CLK initial
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
- /* 配置GPIO_A的模式和IO口 */
- GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //選擇你要設置的IO口
- GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_Out_PP; //設置推挽輸出模式
- GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //設置傳輸速率
- GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
-
- }
- void Humitureport_inputinit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure_A; //聲明一個結構體變量,用來初始化GPIO_A ; A PORT AS OUTPUT
- //SystemInit(); //system CLK initial
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
- /* 配置GPIO_A的模式和IO口 */
- GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //選擇你要設置的IO口
- GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_IPU; //設置為上拉輸入模式
- GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //設置傳輸速率
- GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
-
- }
- char Bit_Select(void)
- {
-
- uchar i,temp;
- uchar Byte_Data = 0; //存放每字節溫濕度的數據
- // Byte_Data = 0;
- // Humitureport_inputinit();
- for(i=0;i<8;i++)
- {
- //FLAG=2;
- //while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判斷數據位是0還是1
- while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判斷數據位是0還是1
- delay_us(30); //如果30微秒過后引腳還為高電平則為1
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
- temp = 1;
- else
- temp = 0;
- //FLAG=2;
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12));
-
- // if(FLAG == 1)break; //超時則跳出for循環
-
- Byte_Data<<=1;
- Byte_Data|= temp;
- }
- return Byte_Data;
- }
-
- /*******************************************************************************
- * 函 數 名 : HumitureRead
- * 函數功能 : 溫濕度數據讀取
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
-
- void HumitureRead(void)
- {
- Humitureport_outputinit(); //端口配置為輸出模式
- GPIO_ResetBits(GPIOA,GPIO_Pin_12); //主機拉低18ms
- delay_ms(1);
- GPIO_SetBits(GPIOA,GPIO_Pin_12); //主機由上拉電阻拉高延時30us
- delay_us(30);
- Humitureport_inputinit(); //主機設為輸入模式
-
- if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)) //判斷DHT22是否有響應信號輸出
- {
- // FLAG=2;
- // while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判斷DHT22的80us響應信號是否結束
- // FLAG=2;
- // while((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判斷DHT22是否發出80us高電平,如果是進入數據接受狀態
- //FLAG=2;
- while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判斷DHT22的80us響應信號是否結束
- //FLAG=2;
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判斷DHT22是否發出80us高電平,如果是進入數據接受狀態
- RHData_H_Temp = Bit_Select();
- RHData_L_Temp = Bit_Select();
- TData_H_Temp = Bit_Select();
- TData_L_Temp = Bit_Select();
- CheckData_Temp = Bit_Select();
-
- // GPIO_ResetBits(GPIOA,GPIO_Pin_12); //DHT22拉低總線50us
- delay_us(50);
- Humitureport_outputinit(); //端口配置為輸出模式
- GPIO_SetBits(GPIOA,GPIO_Pin_12); //主機拉高總線
-
- check_temp = (RHData_H_Temp + RHData_L_Temp + TData_H_Temp + TData_L_Temp);
- if(check_temp == CheckData_Temp)
- {
- RHData_H = RHData_H_Temp;
- RHData_L = RHData_L_Temp;
- TData_H = TData_H_Temp;
- TData_L = TData_L_Temp;
- CheckData= CheckData_Temp;
- }
- }
-
- }
- /*******************************************************************************
- * 函 數 名 : Humitureoutput
- * 函數功能 : 溫濕度數據輸出
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Humitureoutput(void)
- {
- HumitureRead();
- HumitureData[0] = RHData_H;
- HumitureData[1] = RHData_L;
- HumitureData[2] = TData_H;
- HumitureData[3] = TData_L;
- HumitureData[4] = CheckData;
- }
復制代碼- #include "public.h" //公共函數頭文件
- /****************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- char HumitureData[5] = {0}; //存放溫濕度數據
- int main()
- {
- SystemInit();
- RCC_HSE_Configuration(); //自定義系統時間(可以修改時鐘)
-
- lcd_init(); //lcd初始化
- display_word(); //顯示”卡號“漢字
- while(1)
- {
- Humitureoutput();
- Humiture_display();
- delay_ms(1000); //Systick 計數最大值為0xFFFFFF
- delay_ms(1000);
- }
-
- }
復制代碼
Keil代碼下載:
代碼.7z
(202.92 KB, 下載次數: 96)
2022-5-15 20:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|