仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (90.99 KB, 下載次數: 0)
下載附件
2025-11-12 17:22 上傳
單片機源程序如下:- #include "main.h"
- #include "LCD1602.h"
- #include "keyScan.h"
- #include "bsp_timer.h"
- #include "bsp_uart.h"
- #include "dht11.h"
- // 變量定義
- sbit reduce_temp = P2^3; //控制降溫機
- sbit add_temp = P2^2; //控制升溫機
- sbit reduce_hum = P2^1; //控制減濕器
- sbit add_hum = P2^0; //控制加濕器
- sbit LED = P1^7; //心跳燈
-
- uint8_t g_key_value = 0; // 按鍵按下的值
- uint8_t hum_high = 30, hum_low = 25;//設置的濕度最大值和最小值
- uint8_t temp_high = 35, temp_low = 25;//設置的溫度最大值和最小值
- uint8_t humidity = 0 , temperature = 0;//實際的濕度值和溫度值
- uint8_t ui_page = 0 ; //顯示頁面
- uint8_t set_pos = 0 ; //設置序號 0:設置hum_high 1:設置hum_low 2:設置temp_high 3:設置temp_low
- uint8_t read_dht11_flag = 0; //讀取DHT11的標志位。
- uint8_t ui_refresh_flag = 0; //界面刷新的標志位。
- void main()
- {
- uint8_t ret;
- uint8_t blink_count = 0;
- uint8_t lcdShowBuff[16] = {0};
-
- EA = 0; //關閉所有中斷
- LcdInit(); // LCD顯示初始化
- key_init();
- LED = 0;
- bsp_timer_set_ms_IT(Timer0,5);
- Uart1_Init();
- EA = 1; //打開所有中斷
-
- while(1)
- {
- if(read_dht11_flag == 1)
- {
- EA = 0;
- ret = DHT11_Get_Data(&humidity, &temperature) ;
- EA = 1;
- printf("hum :%2d temp:%2d\r\n",(int)humidity,(int)temperature); //發送一次溫濕度
- read_dht11_flag = 0;
- }
-
- if( ui_refresh_flag == 1)
- {
- if(ui_page == 0)
- {
- sprintf((char*)lcdShowBuff," real data ");
- LcdShowStr(0, 0, lcdShowBuff);
- sprintf((char*)lcdShowBuff,"hum :%2d temp:%2d",(int)humidity,(int)temperature);
- LcdShowStr(0, 1, lcdShowBuff);
- }else if(ui_page == 1)
- {
- blink_count ++;
-
- sprintf((char*)lcdShowBuff,"HumH:%2d HumL:%2d",(int)hum_high, (int)hum_low);
- LcdShowStr(0, 0, lcdShowBuff);
- sprintf((char*)lcdShowBuff,"TmpH:%2d TmpL:%2d",(int)temp_high,(int)temp_low);
- LcdShowStr(0, 1, lcdShowBuff);
-
- // 計數值為偶數的時候閃爍
- if(blink_count % 2 == 0)
- {
- switch(set_pos)
- {
- case 0:LcdShowStr(5,0," ");break;
- case 1:LcdShowStr(14,0," ");break;
- case 2:LcdShowStr(5,1," ");break;
- case 3:LcdShowStr(14,1," ");break;
- }
- }
- }
- ui_refresh_flag = 0;
- }
- }
- }
- /**
- * @brief 根據按鍵值決定當前的功能處理
- * @param
- * @retval void
- **/
- void KeyControlFunction(uint8_t key_value)
- {
- if(key_value == KEY1_VALUE)
- {
- if(ui_page == 1)
- {
- if(set_pos == 0) hum_high++;
- else if(set_pos == 1) hum_low++;
- else if(set_pos == 2) temp_high++;
- else if(set_pos == 3) temp_low++;
- }
- }
- else if(key_value == KEY2_VALUE)
- {
- if(ui_page == 1)
- {
- if(set_pos == 0) hum_high--;
- else if(set_pos == 1) hum_low--;
- else if(set_pos == 2) temp_high--;
- else if(set_pos == 3) temp_low--;
- }
- }
- else if(key_value == KEY3_VALUE)
- {
- if(ui_page == 0)
- ui_page = 1;
- else if(ui_page == 1)
- ui_page = 0;
- }
- else if(key_value == KEY4_VALUE)
- {
- if(ui_page == 1)
- {
- set_pos ++;
- if(set_pos > 3)
- set_pos = 0;
- }
- }
- }
- /**
- * @brief 檢查當前溫濕度的狀態
- * 如果溫度大于設定值,控制減溫器繼電器打開,如果溫度小于設定值,控制升溫器繼電器打開。
- * 如果濕度大于設定值,控制減濕器繼電器打開,如果濕度小于設定值,控制加濕器繼電器打開。
- * @param
- * @retval void
- **/
- void ControlRelay()
- {
- if(temperature > temp_high)
- {
- reduce_temp = 1;add_temp = 0;
- }else if(temperature < temp_low)
- {
- reduce_temp = 0;add_temp = 1;
- }else
- {
- reduce_temp = 0;add_temp = 0;
- }
-
- if(humidity > hum_high)
- {
- reduce_hum = 1;add_hum = 0;
- }else if(humidity < hum_low)
- {
- reduce_hum = 0;add_hum = 1;
- }else
- {
- reduce_hum = 0;add_hum = 0;
- }
- }
復制代碼
仿真程序下載:
基于51單片機的智能溫濕度大棚設計.7z
(98.87 KB, 下載次數: 0)
2025-11-12 17:23 上傳
點擊文件名下載附件
智能恒溫大棚 下載積分: 黑幣 -5
|