最近设计了一个项目基于单片机的智能宠物喂食器的系统设计,与大家分享一下:
一、基本介绍
项目名:宠物喂食(仿真)
项目编号:mcuclub-fz-015
单片机类型:STC89C52
具体功能:
1、通过DS1302获取时间
2、通过AT24C02存储设定的投喂时间
3、通过HX711称量食物重量,每次分配食物为固定重量
4、通过按键可修正实时时间、添加或删除投喂时间、查看投喂时间、设置重量
5、当投喂时间到达时,蜂鸣器报警提醒(2s),并开启继电器(喂食)
6、通过LCD1602显示屏显示数据
二、仿真图
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、系统框图
本设计以单片机为核心控制器,加上其他模块一起组成此次设计宠物喂食器的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由四个部分组成,第一部分是时钟电路模块,通过该模块获取时间等;第二部分是存储模块,通过该模块存储设定的投喂时间等;第三部分是按键模块,该模块通过按键可修正实时时间、添加或删除投喂时间、查看投喂时间、设置重量等;第四部分是供电模块,通过该模块可给整个系统进行供电。输出由三部分组成,第一部分是显示模块,通过该模块可以显示投喂时间;第二部分是存储模块,存储设定的投喂时间;第三部分是继电器模块,该模块由继电器组成;第四部分是当投喂时间到达时,蜂鸣器报警提醒(2s),并开启继电器(喂食)。具体系统框图如图3.1所示。
五、软件设计流程
六、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
uchar i = 0;
if(flag_display == 0) //测量界面
{
if(flag_time_feed == 0)
{
for(i = 0; i < set_feed_count; i++) //判断当前时间是否是投喂时间,如果是,开始投喂5S,且开启两秒蜂鸣器
{
if(p_feeddata[i].time_shi == ds1302_buf[4] && p_feeddata[i].time_fen == ds1302_buf[5] && ds1302_buf[6] == 0)
{
BEEP = 0;
RELAY_TS = 0;
//RELAY_WS = 0;
beep_crtl = 1;
flag_timer_begin = 1;
flag_time_feed = 1;
break;
}
}
}
else
{
if(flag_1s < 2)
{
if(time_num % 20 == 0)
BEEP = ~BEEP;
}
else
{
BEEP = 1;
beep_crtl = 0;
if(flag_1s >= 5)
{
flag_timer_begin = 0;
flag_time_feed = 0;
flag_1s = 0;
RELAY_TS = 1;
}
}
}
if(flag_time_feed == 0 && flag_manu == 1) //手动喂食,定时到达时,关闭继电器
{
if(flag_1s >= 3)
{
flag_timer_begin = 0;
flag_manu = 0;
RELAY_TS = 1;
beep_crtl = 0;
BEEP = 1;
}
else
{
if(beep_crtl == 1)
{
if(time_num % 20 == 0)
BEEP = ~BEEP;
}
}
}
}
else //设置界面
{
BEEP = 1;
RELAY_TS = 1;
}
}