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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 772|回復(fù): 2
收起左側(cè)

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

[復(fù)制鏈接]
ID:382607 發(fā)表于 2025-5-15 23:19 | 顯示全部樓層 |閱讀模式
主控芯片: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仿真工程文件可到本帖附件中下載)
51hei.gif

單片機(jī)源程序如下:
  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;//設(shè)置的溫度值
  14. bit openFlag=0;//出水標(biāo)志

  15. void keyscan(void)
  16. {
  17.         if(KEY1 == 0)//模式切換按鍵
  18.         {
  19.                  delay_ms(10);//消抖
  20.                 if(KEY1 == 0)
  21.                 {
  22.                          while(KEY1 == 0);//等待按鍵松開(kāi)
  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);//顯示設(shè)置的溫度
  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);//顯示設(shè)置的溫度
  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);//顯示設(shè)置的溫度
  87.                 lcd_write_char(5,1,setTemp%10+0x30);
  88.                 while(1)
  89.                 {
  90.                          keyscan();
  91.                          if(timeCount++>=300)//延時(shí)一段時(shí)間,延時(shí)大概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)//缺水時(shí),蜂鳴器滴滴滴的響,液晶閃爍顯示
  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)//在有水的狀態(tài)下并且是加熱模式溫度低于下限值,才能執(zhí)行加熱
  110.                                          {
  111.                                                          RELAY1 = 0;                        
  112.                                          }
  113.                                          else
  114.                                          {
  115.                                                    RELAY1 = 1;                //否則關(guān)閉        
  116.                                          }
  117.                          }        
  118.        delay_ms(1);
  119.                 }
  120. }

復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
ID:1150578 發(fā)表于 2025-5-20 17:29 | 顯示全部樓層
強(qiáng)強(qiáng)強(qiáng)
回復(fù)

使用道具 舉報(bào)

ID:227622 發(fā)表于 2025-6-12 13:23 | 顯示全部樓層
強(qiáng)強(qiáng)強(qiáng)
回復(fù)

使用道具 舉報(bào)

5#
無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区二区第一页 | 久久久久久九九九九九九 | 黄色一级电影在线观看 | 亚洲人成人一区二区在线观看 | 亚洲精品视频导航 | 亚洲一区二区三区在线视频 | 狠狠视频 | 国产在视频一区二区三区吞精 | 久久九 | 国产高清视频在线 | 欧美激情精品久久久久 | 久久久久久久久淑女av国产精品 | 草草在线观看 | 日本精品视频 | 蜜桃av一区二区三区 | 亚洲国产一区二区三区 | 成人黄色av网站 | 九九免费视频 | 欧美成人免费在线视频 | 欧美一区二区三区在线观看 | 日韩精品视频在线播放 | 国产亚洲精品久久久久久牛牛 | 国产精品久久久久久久久久 | 热久久999| 成人免费视频网址 | 日韩综合网| 欧美激情在线观看一区二区三区 | 亚洲精品视频在线看 | 日韩免费在线视频 | 亚洲精品毛片av | www.狠狠干 | 国产乱xxav| 在线免费国产视频 | 国精日本亚洲欧州国产中文久久 | 日韩精品一区二区久久 | 成人中文字幕在线观看 | 色视频在线播放 | 国产区精品 | 三级av在线 | 亚洲最色视频 | 免费在线观看黄色av |