找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3400|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的寵物喂食系統(tǒng)源程序及軟件設(shè)計流程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1028184 發(fā)表于 2022-5-20 14:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
僅參考,文件中包括ppt,文檔和程序,有問題評論下工程文件可到本帖附件中下載)

軟件設(shè)計流程圖


3 系統(tǒng)硬件技術(shù)
系統(tǒng)硬件主要包括單片機(jī)主控模塊、溫度檢測模塊、舵機(jī)驅(qū)動模塊、蜂鳴器模塊、按鍵設(shè)置模塊、顯示模塊及電源模塊

主控模塊為單片機(jī) STC89C51最小系統(tǒng),在整個系統(tǒng)中負(fù)責(zé)連接并控制其它模塊,包括:按鍵設(shè)置模塊、電機(jī)驅(qū)動模塊、顯示模塊、語音模塊,溫度檢測模塊等模塊。
AT89C51單片機(jī)不僅擁有MCS-51系列單片機(jī)的優(yōu)點(diǎn),內(nèi)部還有8K在系統(tǒng)可編程FLASH存儲器,低功耗的電路設(shè)置和掉電模式極大降低電路功耗,還包含定時器、程序存儲器和數(shù)據(jù)存儲器等硬件,能滿足整個控制系統(tǒng)的要求,不需外接其它存儲器芯片和定時器件,方便構(gòu)成一個最小系統(tǒng)。整個系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強(qiáng),性價比高[4] 。
單片機(jī)主控模塊。最小系統(tǒng)由單片機(jī)、時鐘電路、復(fù)位電路等組成。其中電容器C2.C3起到穩(wěn)定頻率、提高電路運(yùn)行速度、快速起振的作用。時鐘電路選用12MHz的晶振時鐘,作為單片機(jī)的時間基準(zhǔn)單元[5] [9] 。通過高電平使單片機(jī)復(fù)位,時鐘電路開始工作,當(dāng)高電平的時間超過大約2us時,可實現(xiàn)復(fù)位,使得CPU及系統(tǒng)各部件回初始狀態(tài)后立即開始工作。復(fù)位電路具備上電復(fù)位和手動復(fù)位的功能,開機(jī)加電時上電復(fù)位,由系統(tǒng)自動完成;當(dāng)程序運(yùn)行時,如遇到系統(tǒng)運(yùn)行異常情況,通過手動復(fù)位即可實現(xiàn)重新啟動[6] 。

3.2 LCD液晶顯示模塊
智能喂食系統(tǒng)通過LCD1602顯示模塊顯示定時時間、步進(jìn)電機(jī)旋轉(zhuǎn)角度、時間表、溫度。
LCD1602液晶模塊最多可以顯示32個字符,內(nèi)部有字符發(fā)生存儲器CGROM芯片,可存儲160個點(diǎn)陣字符圖形,顯示模塊通過指令編程控制讀寫的操作功能,實現(xiàn)屏幕文字及光標(biāo)的移動與顯示。
3.3 DS18B20溫度檢測模塊
DS18B20是常用的溫度傳感器,具有體積小,成本低、抗干擾能力強(qiáng)、電路連接簡單、精度高等特點(diǎn)。
DS18B20的溫度系數(shù)晶振會伴隨著溫度的變化使其振蕩頻率發(fā)生變化,產(chǎn)生的脈沖信號將通過計數(shù)器2輸入。計數(shù)器1以及溫度寄存器都被預(yù)置為-55℃基數(shù)值。計數(shù)器1把低溫度系數(shù)晶振產(chǎn)生的脈沖信號實行減法運(yùn)算,當(dāng)計數(shù)器1的預(yù)置值減至0時,溫度寄存器的值會加1,它的預(yù)置值將會被重新輸入。計數(shù)器1重新開始把低溫度系數(shù)晶振產(chǎn)生的脈沖信號實行計數(shù),如此循環(huán)直至計數(shù)器2計數(shù)為0,即停止對溫度寄存器值的累加,此時溫度寄存器中的數(shù)值即為所測溫度。
3.4 舵機(jī)驅(qū)動模塊
控制電路板接受來自信號線的控制信號(具體信號待會再講),控制電機(jī)轉(zhuǎn)動,電機(jī)帶動一系列齒輪組,減速后傳動至輸出舵盤。舵機(jī)的輸出軸和位置反饋電位計是相連的,舵盤轉(zhuǎn)動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進(jìn)行反饋,然后控制電路板根據(jù)所在位置決定電機(jī)的轉(zhuǎn)動方向和速度,從而達(dá)到目標(biāo)停止。
3.5 蜂鳴器模塊
蜂鳴器模塊可實現(xiàn)投食前蜂鳴提醒,提醒寵物喂食時間到,便于形成寵物及時進(jìn)餐的條件反射。
4 需求分析
4.1 發(fā)展現(xiàn)狀
寵物自動喂食器是一種非常具有實用價值的設(shè)備,它的應(yīng)用給寵物愛好者帶來了很大的便利。與市面上常見的傳統(tǒng)的一體式寵物飼料投放器不同,智能寵物投喂機(jī)改善了投放器一次性過多投放食料的缺點(diǎn),降低了寵物食料的浪費(fèi),更加滿足現(xiàn)代寵物飼養(yǎng)的需求。以步進(jìn)電機(jī)為執(zhí)行元件,其結(jié)構(gòu)簡單,價格便宜。具有安全、穩(wěn)定、可靠、簡單、實用特點(diǎn),實現(xiàn)了定時定量的投喂。
4.2 需求分析
現(xiàn)在年輕人特別是在一、二、三線城市的,工作節(jié)奏快、加班、出差、旅游成常態(tài),無法經(jīng)常在寵物身邊照看,寵物喂食器能夠解放寵物主人的雙手和解決不能長時間在處的無奈,很好地滿足了年輕寵物主照顧寵物的需求。寵物主人和寵物都需要陪伴的情況下,寵物喂食器就變得很好地實現(xiàn)了二者“即使彼此不在身邊”的強(qiáng)連接,隨時隨地滿足了愛寵人士們與“主子”互動交流的情感訴求。
近年來高顏值、用戶體驗好、智能化(自動化、物聯(lián)網(wǎng)化)的寵物智能用品明顯很受80后、90后、00后寵物主人的追捧。2020年雙十一期間,寵物智能用品銷量迎來暴漲,各大電商平臺銷售額均獲得大幅提升,整體增速超過1000%。天貓精靈發(fā)布的數(shù)據(jù)顯示,天貓精靈數(shù)據(jù)顯示,11月1日至8日,寵物智能家居產(chǎn)品銷量同比增長了58倍。
隨著寵物“擬人化”的消費(fèi)成為趨勢,寵物也開始用上屬于自已的“家電”。如今,寵物智能喂食器成為寵物智能家居的常用品。由此可見人們對寵物喂食系統(tǒng)的需求將不斷增加。
5 系統(tǒng)總體設(shè)計
5.1 總方案設(shè)計思路
1.1    本設(shè)計是以STC89C51單片機(jī)作為主控芯片,利用對舵機(jī)角度的控制實現(xiàn)喂食功能,用按鍵進(jìn)行設(shè)置喂食時間,LCD液晶顯示屏顯示當(dāng)前時間以及室內(nèi)溫度。該系統(tǒng)主要由單片機(jī)控制系統(tǒng)、舵機(jī)及驅(qū)動電路、LCD顯示器、按鍵控制和蜂鳴器控制電路組成。上電檢測后,通過按鍵設(shè)置鬧鐘時間也就是喂食時間,控制系統(tǒng)在工作中通過中斷程序不斷檢測時間,當(dāng)系統(tǒng)時間達(dá)到喂食時間時,語音芯片控制蜂鳴器發(fā)聲,吸引動物靠近,舵機(jī)同時會開始轉(zhuǎn)動,打開容器的瓶口,食物從瓶口漏出來,瓶口再次回到關(guān)閉狀態(tài)。

5.2 設(shè)計總體結(jié)構(gòu)
本設(shè)計主要包括STC89C51單片機(jī)構(gòu)成的主控芯片、液晶顯示電路、調(diào)節(jié)按鍵、語音播放,電機(jī)驅(qū)動等模塊組成。其結(jié)構(gòu)框架如圖 3所示。
5.2.1 主要元器件的選擇
系統(tǒng)硬件主要包括單片機(jī)主控模塊、溫度檢測模塊、電機(jī)驅(qū)動模塊、無線控制模塊、語音模塊、按鍵設(shè)置模塊、顯示模塊及電源模塊。
6 功能模塊
主控模塊:以單片機(jī)作為主控芯片,此為控制系統(tǒng)核心,用來處理采集到的數(shù)據(jù)并協(xié)調(diào)控制整個設(shè)計。
液晶顯示模塊:使用LCD1602,主要功能是顯示實時時間以及當(dāng)前溫度。
電機(jī)驅(qū)動模塊:使用舵機(jī)驅(qū)動原理拉動食物容器底蓋進(jìn)行食物投放。
按鍵模塊:實現(xiàn)對時間的調(diào)控,包括實時時間與預(yù)定時間。
時鐘模塊:使用時鐘芯片DS1302來顯示實時時間,另外通過外加電源對其進(jìn)行掉電保護(hù),以保證實時時間的準(zhǔn)確性。
蜂鳴器模塊:設(shè)定時間到,蜂鳴器工作給寵物造成條件反射。
溫度感應(yīng)模塊:使用DS18B20溫度傳感器,對室內(nèi)溫度進(jìn)行實時測量,通過液晶顯示屏顯示出來。

附錄寵物喂食系統(tǒng)代碼
篇幅原因只列舉了舵機(jī)模塊與蜂鳴器模塊相關(guān)代碼,其他代碼請參考相關(guān)文件。
蜂鳴器模塊代碼
#include "beep.h"
void beep_alarm(u16 time,u16 fre)
{
    while(time--)
    {
        BEEP=!BEEP;
        delay_10us(fre);   
    }        
}
舵機(jī)驅(qū)動模塊代碼
#include "moto.h"
void zero(void) //45度 子程序
{   
        PWM=1;
        delay_ms(1);       //高電平 Delay(1)=1ms。因為周期為20ms,所以低電平就是19ms
        PWM=0;
        delay_ms(19);      //低電平 Delay(19)=19ms
}
void one(void) //135度 子程序
{
        PWM=1;
        delay_ms(2);       //Delay(2)=2ms
        PWM=0;
        delay_ms(18);      //18ms
}

單片機(jī)源程序如下:
  1. #include "calendar.h"
  2. #include "ds1302.h"
  3. #include "ds18b20.h"
  4. #include "lcd1602.h"
  5. #include "key.h"
  6. #include "beep.h"
  7. #include "time.h"
  8. #include "moto.h"


  9. code u8 alarm_switch_str[]="Alarm: OFF";
  10. code u8 alarm_on_str[]="ON ";
  11. code u8 alarm_off_str[]="OFF";


  12. u8 i,b;
  13. _calendar g_calendar;

  14. u8 g_keyvalue=0;

  15. void time0() interrupt 1
  16. {
  17.         static u8 cnt=0;
  18.         static u8 oneflag=1;
  19.         TH0=0xDC;
  20.         TL0=0x00;
  21.         cnt++;
  22.    
  23.         
  24.         if(cnt==50)
  25.         {
  26.                 cnt=0;
  27.                 if(g_calendar.mode==0)
  28.                         ds1302_read_time();                        
  29.                 if(oneflag==1)
  30.                 {
  31.                         oneflag=0;
  32.             g_calendar.alarm_time[0]=g_calendar.sec;
  33.                         g_calendar.alarm_time[1]=g_calendar.min;
  34.                         g_calendar.alarm_time[2]=g_calendar.hour;//記錄初始鬧鐘時間        
  35.             g_calendar.alarm_time0[0]=g_calendar.sec;
  36.                         g_calendar.alarm_time0[1]=g_calendar.min;
  37.                         g_calendar.alarm_time0[2]=g_calendar.hour;        
  38.                 }
  39.                 g_calendar.temperture=ds18b20_read_temperture();               
  40.         }

  41. }


  42. void alarm_compareproc(void)
  43. {
  44.         if(g_calendar.alarm&&g_calendar.setok)
  45.         {
  46.                 if(g_calendar.alarm_time[2]==g_calendar.hour)
  47.                 {   

  48.                         if(g_calendar.alarm_time[1]==g_calendar.min)//對比鬧鐘設(shè)置時間和當(dāng)前時間,相同則鬧鈴 提醒寵物應(yīng)該吃飯了
  49.             {
  50.             
  51.             beep_alarm(100,10);
  52.                     if(g_calendar.alarm_time[0]==g_calendar.sec)//投食開啟
  53.                               {
  54.                              one();

  55.                    }
  56.              }                     

  57.                            
  58.                 }        
  59.         }
  60.         
  61. }
  62. void alarm_compareproc0(void)
  63. {
  64.         if(g_calendar.alarm&&g_calendar.setok)
  65.         {
  66.                 if(g_calendar.alarm_time0[2]==g_calendar.hour)
  67.                 {   

  68.                         if(g_calendar.alarm_time0[1]==g_calendar.min)
  69.             {
  70.                     if(g_calendar.alarm_time0[0]==g_calendar.sec)
  71.                               {
  72.                              zero();

  73.                    }
  74.              }                     

  75.                            
  76.                 }        
  77.         }
  78.         
  79. }

  80. void calendar_test(void)
  81. {
  82.         u8 key_temp=0;

  83.         lcd1602_init();
  84.         ds1302_init();
  85.         ds18b20_init();
  86.         time0_init();//定時器10ms
  87.            
  88.         while(1)
  89.         {
  90.         
  91.                 key_temp=key_scan(0);
  92.                 if(key_temp==KEY1_PRESS)//模式設(shè)置
  93.                 {
  94.            
  95.                         g_calendar.mode++;
  96.                         if(g_calendar.mode==4)
  97.                                 g_calendar.mode=1;
  98.                         g_calendar.setok=0;
  99.                         g_calendar.time_choice=0;
  100.                         if(g_calendar.mode==2)
  101.                         {
  102.                                 lcd1602_clear();
  103.                                 lcd1602_show_string(0,0,alarm_switch_str);        
  104.                         }
  105.                   if(g_calendar.mode==3)
  106.                         {
  107.                                 lcd1602_clear();
  108.                                 lcd1602_show_string(0,0,alarm_switch_str);        
  109.                         }
  110.                         beep_alarm(100,10);        
  111.                 }                                
  112.                 else if(key_temp==KEY2_PRESS)//進(jìn)入設(shè)置模式時,對應(yīng)位選擇設(shè)置
  113.                 {
  114.                         g_calendar.time_choice++;
  115.                         if(g_calendar.time_choice==7)
  116.                                 g_calendar.time_choice=0;
  117.                         beep_alarm(100,10);
  118.                         
  119.                 }
  120.                 else if(key_temp==KEY3_PRESS)//進(jìn)入設(shè)置模式時,進(jìn)行數(shù)據(jù)加操作
  121.                 {
  122.                         g_calendar.add=1;
  123.                         beep_alarm(100,10);
  124.                 }        
  125.                 else if(key_temp==KEY4_PRESS)//設(shè)置完成,恢復(fù)正常顯示模式
  126.                 {
  127.                         g_calendar.setok=1;
  128.                         g_calendar.time_choice=0;
  129.                         g_calendar.mode=0;
  130.                         calendar_save_set_time();
  131.                         beep_alarm(100,10);                        
  132.                 }
  133.                 if(g_calendar.mode==1)//模擬光標(biāo)閃爍
  134.                 {
  135.                         if(g_calendar.time_choice<3)
  136.                                 lcd1602_show_string(7-g_calendar.time_choice*3,1," ");
  137.                         else if(g_calendar.time_choice>=3&&g_calendar.time_choice<4)
  138.                                 lcd1602_show_string(14,0," ");
  139.                         else if(g_calendar.time_choice>=4&&g_calendar.time_choice<7)
  140.                                 lcd1602_show_string(21-g_calendar.time_choice*3,0," ");               
  141.                 }
  142.                 else if(g_calendar.mode==2)//模擬光標(biāo)閃爍
  143.                 {
  144.                         if(g_calendar.time_choice<3)
  145.                                 lcd1602_show_string(7-g_calendar.time_choice*3,1," ");
  146.                         else if(g_calendar.time_choice==3)
  147.                                 lcd1602_show_string(9,0," ");
  148.                         else if(g_calendar.time_choice==4)
  149.                                 lcd1602_show_string(7,1," ");               
  150.                 }
  151.         else if(g_calendar.mode==3)//模擬光標(biāo)閃爍
  152.                 {
  153.                         if(g_calendar.time_choice<3)
  154.                                 lcd1602_show_string(7-g_calendar.time_choice*3,1," ");
  155.                         else if(g_calendar.time_choice==3)
  156.                                 lcd1602_show_string(9,0," ");
  157.                         else if(g_calendar.time_choice==4)
  158.                                 lcd1602_show_string(7,1," ");               
  159.                 }
  160.                                 
  161.                 calendar_set_time();
  162.                 calendar_set_alarm();        
  163.                 calendar_show();
  164.                 alarm_compareproc();
  165.         alarm_compareproc0();                        
  166.         }               
  167. }
復(fù)制代碼
本人初學(xué),僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
Keil代碼下載(僅供參考):
源代碼.7z (886.11 KB, 下載次數(shù): 52)



評分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表