久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 564|回復: 1
收起左側

基于STC89C52單片機智能飲水機設計方案詳解(附完整代碼邏輯仿真)

[復制鏈接]
ID:382607 發表于 2025-5-15 23:19 | 顯示全部樓層 |閱讀模式
主控芯片: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

單片機源程序如下:
  1. #include "common.h"
  2. #include "DS18B20_One.h"
  3. #include "lcd1602.h"

  4. sbit KEY1 = P1^5;
  5. sbit KEY2 = P1^6;
  6. sbit KEY3 = P1^7;
  7. sbit KEY4 = P3^2;

  8. sbit WATER_LEVEL = P1^0;
  9. sbit BEEP = P2^0;

  10. sbit RELAY1 = P3^6;
  11. sbit RELAY2 = P3^7;

  12. bit mode=0;//模式變量。0是常溫模式,1是加熱模式
  13. uchar setTemp=40;//設置的溫度值
  14. bit openFlag=0;//出水標志

  15. void keyscan(void)
  16. {
  17.         if(KEY1 == 0)//模式切換按鍵
  18.         {
  19.                  delay_ms(10);//消抖
  20.                 if(KEY1 == 0)
  21.                 {
  22.                          while(KEY1 == 0);//等待按鍵松開
  23.                         mode=!mode;
  24.                         if(mode==0)lcd_write_str(10,0,"Normal");
  25.                         else       lcd_write_str(10,0," Hot  ");
  26.                 }
  27.         }
  28.         if(KEY2 == 0 && WATER_LEVEL)//出水按鍵
  29.         {
  30.                  delay_ms(1);
  31.                 if(KEY2 == 0)
  32.                 {
  33.                          RELAY2 = 0;
  34.                          if(openFlag==0)
  35.                          {
  36.                                   openFlag=1;
  37.                                         lcd_write_str(10,1," open ");//顯示open
  38.                          }
  39.                 }
  40.         }
  41.         else
  42.         {
  43.                   if(openFlag==1)
  44.                   {
  45.                                 openFlag=0;
  46.                                 lcd_write_str(10,1,"      ");
  47.                   }
  48.                   RELAY2 = 1;
  49.         }
  50.         if(KEY3 == 0)//加鍵
  51.         {
  52.                  delay_ms(10);
  53.                 if(KEY3 == 0 )
  54.                 {
  55.                          while(KEY3 == 0);
  56.                         if(setTemp<99)setTemp++;
  57.                         lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
  58.                   lcd_write_char(5,1,setTemp%10+0x30);
  59.                 }
  60.         }
  61.         if(KEY4 == 0)//減鍵
  62.         {
  63.                  delay_ms(10);
  64.                 if(KEY4 == 0 )
  65.                 {
  66.                          while(KEY4 == 0);
  67.                         if(setTemp>0)setTemp--;
  68.                         lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
  69.                   lcd_write_char(5,1,setTemp%10+0x30);
  70.                 }
  71.         }
  72. }

  73. void main()
  74. {
  75.           unsigned int timeCount=200;
  76.           unsigned int temperature=0;
  77.           bit shanshuo=0;
  78.         
  79.           temperature = DS18B20_TF();//溫度初始化
  80.           delay_ms(1000);
  81.     lcd_init();//1602初始化
  82.                 lcd_write_str(0,0,"TEM:00 C  Normal");//顯示字符串
  83.           lcd_write_str(0,1,"SET:00 C        ");
  84.           lcd_write_char(6,0,0xDF);
  85.           lcd_write_char(6,1,0xDF);
  86.           lcd_write_char(4,1,setTemp/10+0x30);//顯示設置的溫度
  87.                 lcd_write_char(5,1,setTemp%10+0x30);
  88.                 while(1)
  89.                 {
  90.                          keyscan();
  91.                          if(timeCount++>=300)//延時一段時間,延時大概300ms
  92.                          {
  93.                                          timeCount=0;
  94.                                    shanshuo = !shanshuo;
  95.                                  
  96.                                    temperature=DS18B20_TF();//讀取溫度
  97.                                          lcd_write_char(4,0,temperature/10+0x30);//顯示溫度
  98.                                          lcd_write_char(5,0,temperature%10+0x30);
  99.                                    if(!WATER_LEVEL && shanshuo)//缺水時,蜂鳴器滴滴滴的響,液晶閃爍顯示
  100.                                          {
  101.                                                    lcd_write_str(10,1,"Water!");
  102.                                                    BEEP = 0;
  103.                                          }
  104.                                          else
  105.                                          {
  106.                                                          if(openFlag==0)lcd_write_str(10,1,"      ");
  107.                                                    BEEP = 1;
  108.                                          }
  109.                                          if(WATER_LEVEL && mode==1 && temperature<setTemp)//在有水的狀態下并且是加熱模式溫度低于下限值,才能執行加熱
  110.                                          {
  111.                                                          RELAY1 = 0;                        
  112.                                          }
  113.                                          else
  114.                                          {
  115.                                                    RELAY1 = 1;                //否則關閉        
  116.                                          }
  117.                          }        
  118.        delay_ms(1);
  119.                 }
  120. }

復制代碼

下載: 程序.zip (79.83 KB, 下載次數: 0)
仿真.zip (349.82 KB, 下載次數: 0)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

回復

使用道具 舉報

ID:1150578 發表于 2025-5-20 17:29 | 顯示全部樓層
強強強
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产免费 | 亚洲欧美日韩一区二区 | 国产精品久久久99 | 国产日韩欧美在线 | 最新国产精品视频 | 日韩成人免费在线视频 | 亚洲欧美日韩在线 | 亚洲综合日韩精品欧美综合区 | 欧美日韩综合一区 | 精品久久久久久久久久久 | .国产精品成人自产拍在线观看6 | 国产99久久精品一区二区永久免费 | 国产亚洲成av人在线观看导航 | 日韩久久久久 | 成人免费视频 | 自拍偷拍亚洲视频 | 日本电影韩国电影免费观看 | 午夜久久久 | 中文字幕一区二区三区精彩视频 | 精品成人一区二区 | 国产精品日韩欧美一区二区三区 | 久久综合亚洲 | 黄色一级大片在线免费看产 | 99re视频在线 | 国产一区91精品张津瑜 | 91爱爱·com| 99国产在线 | 亚洲九色 | 欧美中文字幕一区二区 | 国产一区二区电影 | 午夜精品一区二区三区在线观看 | 午夜性色a√在线视频观看9 | 免费99视频 | 国产欧美在线播放 | 91精品国产一区二区三区 | 一区二区福利视频 | 区一区二区三在线观看 | 在线一区视频 | 成人久久网 | 欧美一区免费 | 99久久免费精品国产男女高不卡 |