|
主控芯片:STC89C5
核心外設(shè)如下: - 溫度檢測(cè):DS18B20單總線數(shù)字傳感器(精度±0.5℃,抗干擾能力強(qiáng))
- 水位檢測(cè):Water Sensor水位傳感器(電阻式水位檢測(cè),低成本方案)
- 執(zhí)行機(jī)構(gòu):繼電器控制模塊(驅(qū)動(dòng)加熱管/制冷片,帶光耦隔離)
- 人機(jī)交互:LCD1602液晶屏(實(shí)時(shí)顯示水溫/水位)+ 4×4矩陣按鍵(模式切換/參數(shù)設(shè)置)
- 報(bào)警模塊:無(wú)源蜂鳴器(超溫/缺水報(bào)警)
硬件特點(diǎn): - 所有傳感器信號(hào)均通過(guò)I/O口直接采集,減少外圍電路
- 繼電器驅(qū)動(dòng)采用ULN2003達(dá)林頓陣列,增強(qiáng)帶載能力
- 電源部分加入LM7805穩(wěn)壓,確保系統(tǒng)穩(wěn)定性
開(kāi)發(fā)環(huán)境:Keil C51 + STC-ISP燒錄工具
- 溫度控制邏輯:
- 采用增量式PID算法,通過(guò)DS18B20實(shí)時(shí)采集水溫,動(dòng)態(tài)調(diào)節(jié)繼電器占空比
- 代碼示例:[color=var(--header-text-color)]// PID控制函數(shù)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占空比}
- 水位檢測(cè)優(yōu)化:
- 對(duì)水位傳感器信號(hào)進(jìn)行軟件濾波(滑動(dòng)平均法),消除水波干擾
- 代碼示例:[color=var(--header-text-color)]// 水位采集(滑動(dòng)平均濾波)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; // 返回平均值}
- 低功耗設(shè)計(jì):
- 待機(jī)模式下關(guān)閉LCD背光,關(guān)閉未使用的外設(shè)
- 定時(shí)喚醒機(jī)制,降低整體功耗(待機(jī)電流降至8mA)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #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;//設(shè)置的溫度值
- bit openFlag=0;//出水標(biāo)志
- void keyscan(void)
- {
- if(KEY1 == 0)//模式切換按鍵
- {
- delay_ms(10);//消抖
- if(KEY1 == 0)
- {
- while(KEY1 == 0);//等待按鍵松開(kāi)
- 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);//顯示設(shè)置的溫度
- 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);//顯示設(shè)置的溫度
- 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);//顯示設(shè)置的溫度
- lcd_write_char(5,1,setTemp%10+0x30);
- while(1)
- {
- keyscan();
- if(timeCount++>=300)//延時(shí)一段時(shí)間,延時(shí)大概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)//缺水時(shí),蜂鳴器滴滴滴的響,液晶閃爍顯示
- {
- 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)//在有水的狀態(tài)下并且是加熱模式溫度低于下限值,才能執(zhí)行加熱
- {
- RELAY1 = 0;
- }
- else
- {
- RELAY1 = 1; //否則關(guān)閉
- }
- }
- delay_ms(1);
- }
- }
復(fù)制代碼
下載:
程序.zip
(79.83 KB, 下載次數(shù): 0)
2025-5-15 23:19 上傳
點(diǎn)擊文件名下載附件
仿真.zip
(349.82 KB, 下載次數(shù): 0)
2025-5-15 23:07 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|