|
有朝一日聞驚鳥,花落一方水長流。
前兩天寫的一個關于加熱水壺的設計,只是一個原型,你們可以自己擴展設計。
一部分代碼
一部分仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20190509153022.png (37.11 KB, 下載次數: 123)
下載附件
2019-5-9 15:31 上傳
QQ圖片20190509152912.png (95.85 KB, 下載次數: 118)
下載附件
2019-5-9 15:31 上傳
0.png (169.83 KB, 下載次數: 115)
下載附件
2019-5-9 18:27 上傳
剛上電 進入初始化模式
依次按確認鍵 使用 + - 按鍵對需要的數值進行操作
設置完成后 自動進入工作
單片機源程序如下:
- #include "Stdfax.h"
- void main ()
- {
- Init();
- while(true)
- {
- DS18B20();
- System();
- Key();
- LCD_1602();
- delay_ms(100);
- }
- }
- /***********************************************************************************
- 函數介紹:系統定時器中斷 Timer 0
- 函數說明:無
- 輸入參數:無
- 輸出參數:無
- ***********************************************************************************/
- void System_Timer_0_Isr (void) interrupt 1
- {
- LED_Timer_Flicker_Do();
- Timer_Cold_Ok_Delay_Do();
- System_Set_Flicker_Do();
- System_Set_End_Delay_Do();
- DS18B20_System_Timer_Count_Do();
- TL0 = THE_SYSTEM_COUNT_LOW; // 設置定時初值
- TH0 = THE_SYSTEM_COUNT_HIGH; // 設置定時初值
-
- }
復制代碼- #include "Stdfax.h"
- struct SYSTEM_FLAG SYSTEM_DAT;
- unsigned long int Timer_Cold_Delay_Ms;
- unsigned long int Timer_Button_Delay_Ms;
- unsigned long int Timer_Set_Delay_MS;
- /***********************************************************************************
- 函數介紹:初始化
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void Init()
- {
- LCD1602_Init();
- DS18B20_INIT();
- System_Date_Init();
- System_Sport_Init();
- Timer_Init_0();
-
- EA = 1 ; // 開啟總中斷
- delay_ms(200);
- }
- /***********************************************************************************
- 函數介紹:定時器0 全局初始化
- 函數說明:使用定時器 0
- 輸入函數:無
- 輸出參數:無
- ***********************************************************************************/
- void Timer_Init_0 (void)
- {
- ET0 = 1 ; // 定時中斷
- TMOD |= 0x01; // 開啟T0
- TL0 = THE_SYSTEM_COUNT_LOW; // 設置定時初值
- TH0 = THE_SYSTEM_COUNT_HIGH; // 設置定時初值
- TR0 = 1; // 開始計數
- }
- /***********************************************************************************
- 函數介紹:延時初始化
- 函數說明:制冷完成后等待3分鐘才可開啟壓縮機
- 輸入函數:無
- 輸出參數:無
- ***********************************************************************************/
- void Timer_Cold_Ok_Delay_Init(void)
- {
- Timer_Cold_Delay_Ms = LED_LINK_3M;
- }
- /***********************************************************************************
- 函數介紹:延時執行
- 函數說明:制冷完成后等待3分鐘才可開啟壓縮機
- 輸入函數:無
- 輸出參數:無
- ***********************************************************************************/
- void Timer_Cold_Ok_Delay_Do (void)
- {
- if(Timer_Cold_Delay_Ms)
- {
- if(-- Timer_Cold_Delay_Ms == 0)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.stuff = 0;
- }
- }
- }
- /***********************************************************************************
- 函數介紹:系統參數函數
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Date_Init()
- {
- SYSTEM_DAT.mode = MODE_RUN;
-
- SYSTEM_DAT.stuff = 0;
-
- SYSTEM_DAT.temperature = 0;
- SYSTEM_DAT.Hot_temperature_high = HOT_TEMPERATURE_NORMAL;
- SYSTEM_DAT.Hot_temperature_low = HOT_TEMPERATURE_LOW;
-
-
- SYSTEM_DAT.Clod_temperature_high = CLOD_TEMPERATURE_NORMAL;
- SYSTEM_DAT.Clod_temperature_low = CLOD_TEMPERATURE_LOW;
- }
- /***********************************************************************************
- 函數介紹:系統端口函數
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Sport_Init()
- {
- KEY0 = 1;
- KEY1 = 1;
- KEY2 = 1;
-
- LED_HEARTING = 1;
- LED_REFRIGERATION = 1;
-
- AIR_CLOSE;
- NOZZLE_CLOSE;
- BEEP_CLOSE;
- }
-
-
- /***********************************************************************************
- 函數介紹:啟動加熱程序
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Hot_Run()
- {
- if(SYSTEM_DAT.temperature < SYSTEM_DAT.Hot_temperature_high && SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION && SYSTEM_DAT.mode != MODE_HUIDITY_BEEP && SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION_OK)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_HEATING; // 進入加熱模式
- AIR_OPEN;
- LED_HEARTING = 0;
- SYSTEM_DAT.stuff = 0;
- LED_Timer_Flicker_Init(1);
- }
- }
-
- /***********************************************************************************
- 函數介紹:檢測是否加熱完成
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Hot_Dection()
- {
- if(SYSTEM_DAT.temperature >= SYSTEM_DAT.Hot_temperature_high) // 加熱完成
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_OK; // 符號燈照常顯示
- SYSTEM_DAT.stuff = 0;
- AIR_CLOSE; // 關閉加熱
- LED_Timer_Flicker_Init(0);
- LED_HEARTING = 0;
- }
-
- System_Dry_Dection();
-
- }
-
-
- /***********************************************************************************
- 函數介紹:加熱完成 等待確認函數據
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- char System_Hot_Dection_Ok()
- {
- if(SYSTEM_DAT.mode == MODE_TEMPERATURE_OK)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.stuff = 0;
- LED_HEARTING = 1;
- return true;
- }
- return false;
- }
-
- /***********************************************************************************
- 函數介紹:啟動制冷程序
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Cold_Run()
- {
- if(SYSTEM_DAT.mode != Timer_Cold_Ok_Delay_Do && SYSTEM_DAT.temperature > SYSTEM_DAT.Clod_temperature_high && SYSTEM_DAT.mode != MODE_TEMPERATURE_HEATING && SYSTEM_DAT.mode != MODE_TEMPERATURE_BEEP && SYSTEM_DAT.mode != MODE_TEMPERATURE_OK && SYSTEM_DAT.mode != MODE_TEMPERATURE_FRARETION_DELAY)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION; // 進入制冷模式
- NOZZLE_OPEN;
- LED_REFRIGERATION = 0;
- SYSTEM_DAT.stuff = 0;
- LED_Timer_Flicker_Init(2);
- };
- }
-
- /***********************************************************************************
- 函數介紹:檢測是否制冷完成
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Cold_Dection()
- {
- if(SYSTEM_DAT.temperature <= SYSTEM_DAT.Clod_temperature_high) // 制冷完成
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_OK; // 符號燈照常顯示
- SYSTEM_DAT.stuff = 0;
- NOZZLE_CLOSE; // 關閉制冷
- LED_Timer_Flicker_Init(0);
- LED_REFRIGERATION = 0;
- }
- }
-
-
- /***********************************************************************************
- 函數介紹:制冷完成 等待確認函數據
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- char System_Cold_Dection_Ok()
- {
- if(SYSTEM_DAT.mode == MODE_TEMPERATURE_FRARETION_OK)
- {
- SYSTEM_DAT.mode = MODE_TEMPERATURE_FRARETION_DELAY;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.stuff = 0;
- LED_REFRIGERATION = 1;
- Timer_Cold_Ok_Delay_Init();
- return true;
- }
- return false;
- }
- /***********************************************************************************
- 函數介紹:檢測是否干燒
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Dry_Dection()
- {
- if(SYSTEM_DAT.temperature >= DRY_NORMAL) // 確認干燒
- {
- SYSTEM_DAT.mode = MODE_SUN_BEEP_NORMAL;
- SYSTEM_DAT.stuff = 0;
- BEEP_OPEN; // 打開蜂鳴器
- if(SYSTEM_DAT.temperature >= DRY_HIGH) // 到達干燒最大值
- {
- SYSTEM_DAT.mode = MODE_SUN_BEEP;
- System_Close(); // 關機
- }
- }
- else
- {
- BEEP_CLOSE;
- }
- }
-
- /***********************************************************************************
- 函數介紹:設置結束初始化
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_End_Delay_Init()
- {
- Timer_Button_Delay_Ms = LED_LINK_10S;
- }
-
-
- /***********************************************************************************
- 函數介紹:檢測是否設置結束
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_End_Delay_Do()
- {
- if(Timer_Button_Delay_Ms)
- {
- if(-- Timer_Button_Delay_Ms == 0)
- {
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.mode_stuff = 0; // 關閉設置模式
- SYSTEM_DAT.stuff = 0;
- System_Set_Flicker_End();
- }
- }
- }
- /***********************************************************************************
- 函數介紹:自動關機
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Close()
- {
- Switch = 0;
- }
-
- /***********************************************************************************
- 函數介紹:設置時的數值閃爍 定時器初始化
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_Flicker_Init()
- {
- Timer_Set_Delay_MS = LED_LINK_500MS;
- }
-
- /***********************************************************************************
- 函數介紹:設置時的數值閃爍 定時器執行
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_Flicker_Do()
- {
- if(Timer_Set_Delay_MS)
- {
- if(-- Timer_Set_Delay_MS == 0)
- {
- System_Set_Flicker();
- System_Set_Flicker_Init();
- }
- }
- }
- /***********************************************************************************
- 函數介紹:設置時的數值閃爍 定時器執行
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_Flicker_End()
- {
- Timer_Set_Delay_MS = 0;
- SYSTEM_DAT.mode_stuff = 0;
- SYSTEM_DAT.mode = MODE_RUN;
- SYSTEM_DAT.stuff = 0;
- }
-
- /***********************************************************************************
- 函數介紹:設置時的數值閃爍
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System_Set_Flicker()
- {
- static char i = 0;
- if(i)
- {
-
-
- LCD1602_Show_Float_Need_Address(6, 3, SYSTEM_DAT.temperature);
- LCD1602_Show_Float_Need_Address(9,1, SYSTEM_DAT.Hot_temperature_low);
- LCD1602_Show_Float_Need_Address(13,1, SYSTEM_DAT.Hot_temperature_high);
- LCD1602_Show_Float_Need_Address(9,2, SYSTEM_DAT.Clod_temperature_low);
- LCD1602_Show_Float_Need_Address(13,2, SYSTEM_DAT.Clod_temperature_high);
- i = 0;
- }
- else
- {
- switch(SYSTEM_DAT.mode_stuff)
- {
-
-
- case MODE_SET_HOT_TEMPERATURE_UP :
- LCD1602_Show_String_Need_Address(13,1, " ");
- break;
-
- case MODE_SET_CLOD_TEMPERATURE_UP :
- LCD1602_Show_String_Need_Address(13,2, " ");
- break;
-
- }
- i = 1;
- }
- }
- /***********************************************************************************
- 函數介紹:系統主函數
- 函數說明: 無
- 輸入參數:
- 輸出參數:無
- ***********************************************************************************/
- void System()
- {
- if(SYSTEM_DAT.stuff == 0) // 無值改變
- {
-
- switch(SYSTEM_DAT.mode)
- {
- case MODE_TEMPERATURE_HEATING: // 加熱
- case MODE_SUN_BEEP_NORMAL:
- case MODE_TEMPERATURE_OK:
- System_Hot_Dection(); // 檢測是否加熱完成函數
- break;
-
-
- case MODE_TEMPERATURE_FRARETION: // 制冷
- System_Cold_Dection(); // 檢測是否制冷完成函數
- break;
- }
-
- }
- }
復制代碼
0.png (19.41 KB, 下載次數: 105)
下載附件
2019-5-9 18:25 上傳
所有資料51hei提供下載:
智能水壺.zip
(468.52 KB, 下載次數: 125)
2019-5-9 15:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|