找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2628|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的宠物喂食系统源程序及软件设计流程

[复制链接]
跳转到指定楼层
楼主
仅参考,文件中包括ppt,文档和程序,有问题评论下工程文件可到本帖附件中下载)

软件设计流程图


3 系统硬件技术
系统硬件主要包括单片机主控模块、温度检测模块、舵机驱动模块、蜂鸣器模块、按键设置模块、显示模块及电源模块

主控模块为单片机 STC89C51最小系统,在整个系统中负责连接并控制其它模块,包括:按键设置模块、电机驱动模块、显示模块、语音模块,温度检测模块等模块。
AT89C51单片机不仅拥有MCS-51系列单片机的优点,内部还有8K在系统可编程FLASH存储器,低功耗的电路设置和掉电模式极大降低电路功耗,还包含定时器、程序存储器和数据存储器等硬件,能满足整个控制系统的要求,不需外接其它存储器芯片和定时器件,方便构成一个最小系统。整个系统结构紧凑,抗干扰能力强,性价比高[4] 。
单片机主控模块。最小系统由单片机、时钟电路、复位电路等组成。其中电容器C2.C3起到稳定频率、提高电路运行速度、快速起振的作用。时钟电路选用12MHz的晶振时钟,作为单片机的时间基准单元[5] [9] 。通过高电平使单片机复位,时钟电路开始工作,当高电平的时间超过大约2us时,可实现复位,使得CPU及系统各部件回初始状态后立即开始工作。复位电路具备上电复位和手动复位的功能,开机加电时上电复位,由系统自动完成;当程序运行时,如遇到系统运行异常情况,通过手动复位即可实现重新启动[6] 。

3.2 LCD液晶显示模块
智能喂食系统通过LCD1602显示模块显示定时时间、步进电机旋转角度、时间表、温度。
LCD1602液晶模块最多可以显示32个字符,内部有字符发生存储器CGROM芯片,可存储160个点阵字符图形,显示模块通过指令编程控制读写的操作功能,实现屏幕文字及光标的移动与显示。
3.3 DS18B20温度检测模块
DS18B20是常用的温度传感器,具有体积小,成本低、抗干扰能力强、电路连接简单、精度高等特点。
DS18B20的温度系数晶振会伴随着温度的变化使其振荡频率发生变化,产生的脉冲信号将通过计数器2输入。计数器1以及温度寄存器都被预置为-55℃基数值。计数器1把低温度系数晶振产生的脉冲信号实行减法运算,当计数器1的预置值减至0时,温度寄存器的值会加1,它的预置值将会被重新输入。计数器1重新开始把低温度系数晶振产生的脉冲信号实行计数,如此循环直至计数器2计数为0,即停止对温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
3.4 舵机驱动模块
控制电路板接受来自信号线的控制信号(具体信号待会再讲),控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。
3.5 蜂鸣器模块
蜂鸣器模块可实现投食前蜂鸣提醒,提醒宠物喂食时间到,便于形成宠物及时进餐的条件反射。
4 需求分析
4.1 发展现状
宠物自动喂食器是一种非常具有实用价值的设备,它的应用给宠物爱好者带来了很大的便利。与市面上常见的传统的一体式宠物饲料投放器不同,智能宠物投喂机改善了投放器一次性过多投放食料的缺点,降低了宠物食料的浪费,更加满足现代宠物饲养的需求。以步进电机为执行元件,其结构简单,价格便宜。具有安全、稳定、可靠、简单、实用特点,实现了定时定量的投喂。
4.2 需求分析
现在年轻人特别是在一、二、三线城市的,工作节奏快、加班、出差、旅游成常态,无法经常在宠物身边照看,宠物喂食器能够解放宠物主人的双手和解决不能长时间在处的无奈,很好地满足了年轻宠物主照顾宠物的需求。宠物主人和宠物都需要陪伴的情况下,宠物喂食器就变得很好地实现了二者“即使彼此不在身边”的强连接,随时随地满足了爱宠人士们与“主子”互动交流的情感诉求。
近年来高颜值、用户体验好、智能化(自动化、物联网化)的宠物智能用品明显很受80后、90后、00后宠物主人的追捧。2020年双十一期间,宠物智能用品销量迎来暴涨,各大电商平台销售额均获得大幅提升,整体增速超过1000%。天猫精灵发布的数据显示,天猫精灵数据显示,11月1日至8日,宠物智能家居产品销量同比增长了58倍。
随着宠物“拟人化”的消费成为趋势,宠物也开始用上属于自已的“家电”。如今,宠物智能喂食器成为宠物智能家居的常用品。由此可见人们对宠物喂食系统的需求将不断增加。
5 系统总体设计
5.1 总方案设计思路
1.1    本设计是以STC89C51单片机作为主控芯片,利用对舵机角度的控制实现喂食功能,用按键进行设置喂食时间,LCD液晶显示屏显示当前时间以及室内温度。该系统主要由单片机控制系统、舵机及驱动电路、LCD显示器、按键控制和蜂鸣器控制电路组成。上电检测后,通过按键设置闹钟时间也就是喂食时间,控制系统在工作中通过中断程序不断检测时间,当系统时间达到喂食时间时,语音芯片控制蜂鸣器发声,吸引动物靠近,舵机同时会开始转动,打开容器的瓶口,食物从瓶口漏出来,瓶口再次回到关闭状态。

5.2 设计总体结构
本设计主要包括STC89C51单片机构成的主控芯片、液晶显示电路、调节按键、语音播放,电机驱动等模块组成。其结构框架如图 3所示。
5.2.1 主要元器件的选择
系统硬件主要包括单片机主控模块、温度检测模块、电机驱动模块、无线控制模块、语音模块、按键设置模块、显示模块及电源模块。
6 功能模块
主控模块:以单片机作为主控芯片,此为控制系统核心,用来处理采集到的数据并协调控制整个设计。
液晶显示模块:使用LCD1602,主要功能是显示实时时间以及当前温度。
电机驱动模块:使用舵机驱动原理拉动食物容器底盖进行食物投放。
按键模块:实现对时间的调控,包括实时时间与预定时间。
时钟模块:使用时钟芯片DS1302来显示实时时间,另外通过外加电源对其进行掉电保护,以保证实时时间的准确性。
蜂鸣器模块:设定时间到,蜂鸣器工作给宠物造成条件反射。
温度感应模块:使用DS18B20温度传感器,对室内温度进行实时测量,通过液晶显示屏显示出来。

附录宠物喂食系统代码
篇幅原因只列举了舵机模块与蜂鸣器模块相关代码,其他代码请参考相关文件。
蜂鸣器模块代码
#include "beep.h"
void beep_alarm(u16 time,u16 fre)
{
    while(time--)
    {
        BEEP=!BEEP;
        delay_10us(fre);   
    }        
}
舵机驱动模块代码
#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
}

单片机源程序如下:
  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)//对比闹钟设置时间和当前时间,相同则闹铃 提醒宠物应该吃饭了
  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)//模式设置
  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)//进入设置模式时,对应位选择设置
  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)//进入设置模式时,进行数据加操作
  121.                 {
  122.                         g_calendar.add=1;
  123.                         beep_alarm(100,10);
  124.                 }        
  125.                 else if(key_temp==KEY4_PRESS)//设置完成,恢复正常显示模式
  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)//模拟光标闪烁
  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)//模拟光标闪烁
  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)//模拟光标闪烁
  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. }
复制代码
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
Keil代码下载(仅供参考):
源代码.7z (886.11 KB, 下载次数: 52)



评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表