主控芯片:STC89C5
核心外設如下: - 溫度檢測:DS18B20單總線數字傳感器(精度±0.5℃,抗干擾能力強)
- 水位檢測:Water Sensor水位傳感器(電阻式水位檢測,低成本方案)
- 執行機構:繼電器控制模塊(驅動加熱管/制冷片,帶光耦隔離)
- 人機交互:LCD1602液晶屏(實時顯示水溫/水位)+ 4×4矩陣按鍵(模式切換/參數設置)
- 報警模塊:無源蜂鳴器(超溫/缺水報警)
硬件特點: - 所有傳感器信號均通過I/O口直接采集,減少外圍電路
- 繼電器驅動采用ULN2003達林頓陣列,增強帶載能力
- 電源部分加入LM7805穩壓,確保系統穩定性
開發環境:Keil C51 + STC-ISP燒錄工具
- 溫度控制邏輯:
- 采用增量式PID算法,通過DS18B20實時采集水溫,動態調節繼電器占空比
- 代碼示例:[color=var(--header-text-color)]// PID控制函數void PID_Control(){ float error = Target_Temp - Current_Temp; P_out = Kp * error; I_out += Ki * error; D_out = Kd * (error - Last_Error); Last_Error = error; PWM_Duty = (uint)(P_out + I_out + D_out); // 輸出PWM占空比}
- 水位檢測優化:
- 對水位傳感器信號進行軟件濾波(滑動平均法),消除水波干擾
- 代碼示例:[color=var(--header-text-color)]// 水位采集(滑動平均濾波)uint Get_Water_Level(){ static uint buffer[5] = {0}; static uint index = 0; uint sum = 0; buffer[index] = ADC_Read(); // 讀取ADC值 index = (index + 1) % 5; for(uint i=0; i<5; i++) sum += buffer[ i]; return sum / 5; // 返回平均值}
- 低功耗設計:
- 待機模式下關閉LCD背光,關閉未使用的外設
- 定時喚醒機制,降低整體功耗(待機電流降至8mA)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include "common.h"
- #include "DS18B20_One.h"
- #include "lcd1602.h"
- sbit KEY1 = P1^5;
- sbit KEY2 = P1^6;
- sbit KEY3 = P1^7;
- sbit KEY4 = P3^2;
- sbit WATER_LEVEL = P1^0;
- sbit BEEP = P2^0;
- sbit RELAY1 = P3^6;
- sbit RELAY2 = P3^7;
- bit mode=0;//模式變量。0是常溫模式,1是加熱模式
- uchar setTemp=40;//設置的溫度值
- bit openFlag=0;//出水標志
- void keyscan(void)
- {
- if(KEY1 == 0)//模式切換按鍵
- {
- delay_ms(10);//消抖
- if(KEY1 == 0)
- {
- while(KEY1 == 0);//等待按鍵松開
- mode=!mode;
- if(mode==0)lcd_write_str(10,0,"Normal");
- else lcd_write_str(10,0," Hot ");
- }
- }
- if(KEY2 == 0 && WATER_LEVEL)//出水按鍵
- {
- delay_ms(1);
- if(KEY2 == 0)
- {
- RELAY2 = 0;
- if(openFlag==0)
- {
- openFlag=1;
- lcd_write_str(10,1," open ");//顯示open
- }
- }
- }
- else
- {
- if(openFlag==1)
- {
- openFlag=0;
- lcd_write_str(10,1," ");
- }
- RELAY2 = 1;
- }
- if(KEY3 == 0)//加鍵
- {
- delay_ms(10);
- if(KEY3 == 0 )
- {
- while(KEY3 == 0);
- if(setTemp<99)setTemp++;
- lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
- lcd_write_char(5,1,setTemp%10+0x30);
- }
- }
- if(KEY4 == 0)//減鍵
- {
- delay_ms(10);
- if(KEY4 == 0 )
- {
- while(KEY4 == 0);
- if(setTemp>0)setTemp--;
- lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
- lcd_write_char(5,1,setTemp%10+0x30);
- }
- }
- }
- void main()
- {
- unsigned int timeCount=200;
- unsigned int temperature=0;
- bit shanshuo=0;
-
- temperature = DS18B20_TF();//溫度初始化
- delay_ms(1000);
- lcd_init();//1602初始化
- lcd_write_str(0,0,"TEM:00 C Normal");//顯示字符串
- lcd_write_str(0,1,"SET:00 C ");
- lcd_write_char(6,0,0xDF);
- lcd_write_char(6,1,0xDF);
- lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
- lcd_write_char(5,1,setTemp%10+0x30);
- while(1)
- {
- keyscan();
- if(timeCount++>=300)//延時一段時間,延時大概300ms
- {
- timeCount=0;
- shanshuo = !shanshuo;
-
- temperature=DS18B20_TF();//讀取溫度
- lcd_write_char(4,0,temperature/10+0x30);//顯示溫度
- lcd_write_char(5,0,temperature%10+0x30);
- if(!WATER_LEVEL && shanshuo)//缺水時,蜂鳴器滴滴滴的響,液晶閃爍顯示
- {
- lcd_write_str(10,1,"Water!");
- BEEP = 0;
- }
- else
- {
- if(openFlag==0)lcd_write_str(10,1," ");
- BEEP = 1;
- }
- if(WATER_LEVEL && mode==1 && temperature<setTemp)//在有水的狀態下并且是加熱模式溫度低于下限值,才能執行加熱
- {
- RELAY1 = 0;
- }
- else
- {
- RELAY1 = 1; //否則關閉
- }
- }
- delay_ms(1);
- }
- }
復制代碼
下載:
程序.zip
(79.83 KB, 下載次數: 0)
2025-5-15 23:19 上傳
點擊文件名下載附件
仿真.zip
(349.82 KB, 下載次數: 0)
2025-5-15 23:07 上傳
點擊文件名下載附件
|