標(biāo)題: 基于51單片機(jī)的寵物喂食系統(tǒng)源程序及軟件設(shè)計(jì)流程 [打印本頁]

作者: 阿砂    時(shí)間: 2022-5-20 14:56
標(biāo)題: 基于51單片機(jī)的寵物喂食系統(tǒng)源程序及軟件設(shè)計(jì)流程
僅參考,文件中包括ppt,文檔和程序,有問題評(píng)論下工程文件可到本帖附件中下載)

軟件設(shè)計(jì)流程圖


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

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

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

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

附錄寵物喂食系統(tǒng)代碼
篇幅原因只列舉了舵機(jī)模塊與蜂鳴器模塊相關(guān)代碼,其他代碼請(qǐng)參考相關(guān)文件。
蜂鳴器模塊代碼
#include "beep.h"
void beep_alarm(u16 time,u16 fre)
{
    while(time--)
    {
        BEEP=!BEEP;
        delay_10us(fre);   
    }        
}
舵機(jī)驅(qū)動(dòng)模塊代碼
#include "moto.h"
void zero(void) //45度 子程序
{   
        PWM=1;
        delay_ms(1);       //高電平 Delay(1)=1ms。因?yàn)橹芷跒?0ms,所以低電平就是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;//記錄初始鬧鐘時(shí)間        
  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)//對(duì)比鬧鐘設(shè)置時(shí)間和當(dāng)前時(shí)間,相同則鬧鈴 提醒寵物應(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();//定時(shí)器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è)置模式時(shí),對(duì)應(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è)置模式時(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é),僅供參考,存在錯(cuò)誤和不足之處,請(qǐng)大家回帖多多指教,切勿照搬,文件下載:
Keil代碼下載(僅供參考):
源代碼.7z (886.11 KB, 下載次數(shù): 52)








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1