1912基于单片机宠物智能定时喂食投食系统设计(仿真 、程序、原理图)【毕设课设】

摘要

本文设计了一种基于STC89C52单片机的宠物智能定时喂食投食系统。该系统通过MQ-2烟雾检测模块检测喂食器内的食物余量,结合DS1302时钟芯片实现定时喂食功能。同时,系统通过WT588D语音模块提供语音提示,并通过按键进行时间设置和校准。通过Protues仿真验证了系统的可行性和稳定性。

关键词:STC89C52单片机;宠物喂食;定时投食;MQ-2烟雾检测;DS1302;WT588D;Protues仿真

一、引言

随着人们生活水平的提高,宠物已经成为许多家庭的重要成员。然而,由于工作繁忙或其他原因,许多宠物主人在喂食方面存在困难。为了解决这一问题,本文设计了一种基于STC89C52单片机的宠物智能定时喂食投食系统。该系统能够根据预设的时间段自动打开继电器,实现定时喂食功能,并通过MQ-2烟雾检测模块检测食物余量,确保宠物的健康饮食。

二、系统设计方案

本系统主要由STC89C52单片机、MQ-2烟雾检测模块、DS1302时钟芯片、WT588D语音模块、继电器和按键组成。其中,STC89C52单片机作为系统的核心控制器,负责接收各模块的信号并控制继电器的开关;MQ-2烟雾检测模块用于检测喂食器内的食物余量;DS1302时钟芯片提供时间信息;WT588D语音模块用于提供语音提示;继电器用于控制喂食器的开关;按键用于设置和校准时间。

三、硬件设计

  1. STC89C52单片机

STC89C52是一款常用的8位单片机,具有高性能、低功耗的特点。在本系统中,它负责接收各模块的信号,并根据预设的时间段控制继电器的开关。

  1. MQ-2烟雾检测模块

MQ-2是一款常用的烟雾检测传感器,对烟雾有良好的灵敏度。在本系统中,它用于检测喂食器内的食物余量,当食物不足时发出信号,提醒主人添加食物。

  1. DS1302时钟芯片

DS1302是一款高性能、低功耗的实时时钟芯片,具有掉电时钟仍在走的特点。在本系统中,它提供时间信息,确保喂食时间的准确性。

  1. WT588D语音模块

WT588D是一款高性能的语音模块,支持多种语音格式。在本系统中,它用于提供语音提示,例如提醒主人添加食物或喂食时间已到等。

  1. 继电器与按键

继电器用于控制喂食器的开关;按键用于设置和校准时间。

四、软件设计

软件设计主要包括单片机初始化、时间设置与校准、食物余量检测、定时喂食控制等部分。单片机首先进行初始化设置,然后通过按键设置和校准时间。在预设的时间段内,单片机根据DS1302提供的时间信息控制继电器的开关,实现定时喂食功能。同时,MQ-2烟雾检测模块不断检测食物余量,当食物不足时发出信号,单片机接收到信号后通过WT588D语音模块发出提示。

五、Protues仿真

利用Protues软件对系统进行仿真测试。在仿真环境中搭建系统的电路模型,设置各模块的工作参数和初始状态。通过模拟按键操作设置时间,观察继电器的开关状态以及WT588D语音模块的提示情况。通过调整MQ-2烟雾检测模块的输入信号,验证食物余量检测功能的准确性。通过多次仿真测试,验证系统的稳定性和可靠性。

六、结论

本文设计了一种基于STC89C52单片机的宠物智能定时喂食投食系统。通过硬件和软件的设计实现了定时喂食、食物余量检测、语音提示等功能。通过Protues仿真验证了系统的可行性和稳定性。该系统具有结构简单、成本低廉、操作方便等优点,可广泛应用于宠物喂食领域。

 

 

 

#include <reg52.h>
#include"LCD1602.h"//液晶
#include" 1302.h"		//DS1302时钟芯片
#include "EepRom.h"
#include"wt588.c" //语音播报


#define uchar unsigned char
#define uint unsigned int


//-------------------------------------------硬件定义
sbit key1=P3^3;//按键
sbit key2=P3^4;
sbit key3=P3^5;
sbit key4=P3^6;
sbit key5=P3^7;



//---------------------------------------> Dis variable
bit ShanShuo=0;   //闪烁

//------------------------------》时间
uchar state=0 ;

///----步进电机--------------------------------------------
unsigned char code gaofz[]=	 //正转数据	高四位
{0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
unsigned char code gaozz[]=	 //反转数据	 高四位
{0x90,0x80,0xC0,0x40,0x60,0x20,0x30,0x10};

#define QuanShu 2050
#define DelayS 1
uchar FangXiang = 0;  //电机转动方向	   = 0表示关但是已经关上了所以不动
unsigned char loop = 0;

//---定时------------------------------------------
uchar ding_shi[4] = {0};//定时小时存储
uchar ding_fen[4] =	{0};//定时分钟存储
bit kai_guan1= 0;  //开关定时标志位
bit kai_guan2= 0;
bit kai_guan3= 0;
bit kai_guan4= 0;
bit shou_dongF = 0; 
uchar i = 0;
bit only_flag=0; //只允许播报一次  
//---函数初始化------------------------------------------------
void Timer0Init(void);		//50毫秒@11.0592MHz
void Read_Memory();//读存储
void Key_Dispose();	  //按键处理函数
void Display();		//显示函数
void BuJinDianJi() ;   //步进电机驱动函数

/****语音播报  显示有冲突**/
//********************************************************************************************
void main()	   //主函数
{
	Timer0Init();
	LCD1602_cls(); //定时器初始化以及液晶初始化
	Read_Memory();//读存储
	while(1)
	{
		Key_Dispose();
		Display();  	//显示函数
		if(!state)read_time1(); //读取时间函数

		if(FangXiang==0)	    only_flag=1;
		else if(FangXiang==1)
		{
		 	if(only_flag==1)
			{
			 	only_flag=0;	//清零  只允许播报一次
				Send_threelines(0);   //语音播报  吃饭了
			}
		}
		BuJinDianJi();			  
	}
}


//==========================================延时函数
void Delay(uint delayi)		//短延时函数
{
	while (delayi)
	{
		    delayi--;
			time_data[0]=ds1302read(0x81);
	    	time_data_1[0]=time_data[0]/16*10+time_data[0]%16;
			time_data[1]=ds1302read(0x83);
			time_data_1[1]=time_data[1]/16*10+time_data[1]%16;
			LCD1602_write(0,0xC0+3);

			LCD1602_write(1,0x30+time_data_1[1]/10);
			LCD1602_write(1,0x30+time_data_1[1]%10);

			LCD1602_write(1,':');

			LCD1602_write(1,0x30+time_data_1[0]/10);
			LCD1602_write(1,0x30+time_data_1[0]%10);


	}
}

//===============================================步进电机
bit jishi_J = 0;
void BuJinDianJi()    //步进电机驱动函数
{
	static uint  bujin1i = 0 ;
 	if(FangXiang==0)
	{
	 	P1&=0x0F;
	}
	else if(FangXiang==1)
	{
		for(; bujin1i<QuanShu; bujin1i++) 
		{
			P1&=0x0F;      //步进电机用到的四个口清零

			P1|=gaozz[loop];     //给电机的四个口中有1为1,其他口数值不变
			loop=(loop+1)%8;    //循环加,Loop变化范围是 0 -  7,这样结合上一句话就可循环将转动数据送给P2
			Delay(DelayS);//;      //短延时一下,调节这个短延时,可以控制步进电机的转动速度,越小就越快

		}
		jishi_J = 1;
	}

部分代码....

 

资料下载地址:

https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值