欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于STC89C52單片機智能飲水機設計方案詳解(附完整代碼邏輯仿真)
[打印本頁]
作者:
LB明
時間:
2025-5-15 23:19
標題:
基于STC89C52單片機智能飲水機設計方案詳解(附完整代碼邏輯仿真)
主控芯片: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仿真工程文件可到本帖附件中下載)
51hei.gif
(200.13 KB, 下載次數: 0)
下載附件
2025-5-17 17:29 上傳
單片機源程序如下:
#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 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
仿真.zip
(349.82 KB, 下載次數: 0)
2025-5-15 23:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
sys_max
時間:
2025-5-20 17:29
強強強
作者:
123456LYH
時間:
2025-6-12 13:23
強強強
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1