首页 > 分享 > 基于51单片机的智能宠物喂养机仿真

基于51单片机的智能宠物喂养机仿真

仿真图:在这里插入图片描述

功能简介:

采用51单片机作为控制器,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
具有多个功能按键,分别是设置、加、减和确认切换按键
采用重力检测传感器检测食物重量,步进电机模拟喂食的过程
具有LED和蜂鸣器组成的声光报警电路,

芯片/模块的特点:

HX711特点:
高精度: HX711芯片具有高分辨率和高精度的AD转换能力。它能够实现24位的数据输出,有效提高了传感器的精度和测量的准确性。

低噪声: HX711芯片采用了低噪声放大器和滤波电路,有效地抑制了环境噪声对测量结果的干扰,提高了传感器的信噪比,使得测量结果更加稳定和可靠。

可编程增益: HX711芯片具备可编程增益功能,可以根据不同的传感器和应用需求进行灵活的增益配置,适应不同范围的测量。

低功耗: HX711芯片设计紧凑,功耗低,适合应用于对电池供电或功耗要求较低的场合。

多种通信接口: HX711芯片支持SPI和I2C两种通信接口,方便与不同的控制器和主机进行连接和通信,实现数据的传输和控制。

DS1302特点:
高精度时间计数:DS1302能够提供高精度的实时时钟计数,可以记录年、月、日、星期、小时、分钟和秒等时间信息。它内部集成了晶体振荡器,提供稳定的时钟信号。

低功耗设计:DS1302采用低功耗设计,可以在低功耗模式下运行,有效延长电池寿命。即使在停电情况下,它也能保持时间数据,并通过外部连接电池继续提供计时功能。

串行接口:DS1302通过串行实时时钟接口(SPI)进行通信和控制。使用少数几个引脚,可以与主控器件进行数据交换和时钟同步。

容易集成:DS1302集成了时钟计数和RAM存储器功能,并具有简单的接口和命令,容易与各种微控制器和单片机集成。它不需要复杂的控制信号,可以通过简单的读写命令进行操作。

可编程控制功能:DS1302具有可编程的控制功能,可以设置闹钟、写保护等特殊功能。它还支持多种时间格式的选择,例如24小时制或12小时制。

温度补偿:DS1302内置温度补偿功能,可以校正温度对时钟频率的影响,提高时钟计数的准确性。

高稳定性和抗震动能力:DS1302具有高稳定性和抗震动能力,适用于各种工业和消费类应用场景。

DHT11特点:

温湿度测量功能:DHT11能够实时测量环境中的温度和湿度,并提供数字输出。它可以给出相对湿度(20-90% RH)和温度(0-50摄氏度)的测量结果。

数字输出信号:DHT11通过单线数字信号输出温度和湿度数据。这使得读取和解析数据变得简单方便,适用于各种微控制器和单片机系统。

低成本:DHT11是一种经济实惠的温湿度传感器,适用于低成本应用。

简单的接口和使用:DHT11只需要连接一个数据线和供电线,使用起来非常简单。它采用了专用的通信协议,可以直接与各种数字系统集成。

快速响应时间:DHT11具有快速的响应时间,可以在1-2秒内测量出温度和湿度值。这使得它适用于需要快速获得环境参数的应用。

低功耗:DHT11在工作期间能够保持较低的功耗,这使得它可以在电池供电的应用中长时间工作而不消耗太多的能量。

可靠性:DHT11具有较好的可靠性和稳定性,适用于长期稳定监测环境温湿度的应用。

主程序:

#include "main.h" char dis[16]; enum _MODE_DF_ dispMode; unsigned char setIndex = 0; bit refreshFlag = 1; unsigned long initialWeight = 0; //单位g float objectWeight = 0; //单位g unsigned char feedTime[3] = {18, 0, 0}; //投喂时间18:00:00 int feedWeight = 100; //100g bit feedFlag1 = 0; //自动喂食启动标志1 bit feedFlag2 = 0; //手动喂食启动标志2 sbit buzzer = P2^1;//蜂鸣器 void main(void) { BYJ48 = ((BYJ48 & 0xF0) | REV[0]); //取数据 ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0; Timer0_Init(); Timer1_Init(); DS1302_Init(); // DS1302_Write_Time(); DelayMs(10); LCD_Init(); LCD_DispStr(0, 0, " Welcome! "); DelayMs(200); initialWeight = HX711_GetInitialWeight(); LCD_Clear(); while (1) { if (refreshFlag == 1) //每400ms刷新一次屏幕 { refreshFlag = 0; if (dispMode == NORMAL) { DispNormal(); } } if (timeBufDec[4] == feedTime[0] && timeBufDec[5] == feedTime[1] && timeBufDec[6] == feedTime[2]) { feedFlag1 = 1; //启动喂食 } if (objectWeight >= feedWeight) //超过喂食重量 { feedFlag1 = 0; //停止喂食 } KeyProcess(); } } void DispNormal() { DS1302_Read_Time(); //读取实时时间 objectWeight = HX711_Read(); objectWeight = (objectWeight - initialWeight) / GAPVALUE; //读取实物重量 objectWeight = (objectWeight<0)?0:objectWeight; DHT11_0_ReadData(); //读取温湿度 sprintf(dis, "W:%6.3fkg %2d", objectWeight/1000, (int)U8T_data_H); LCD_DispStr(0, 0, dis); LCD_DispOneChar(13, 0, 0xdf); LCD_DispOneChar(14, 0, 'C'); sprintf(dis, "%02d:%02d:%02d Hm:%2d%%", (int)timeBufDec[4], (int)timeBufDec[5], (int)timeBufDec[6], (int)U8RH_data_H); LCD_DispStr(0, 1, dis); } /************************* 设置当前时间 *************************/ void DispSetTime(unsigned char setIndex) { sprintf(dis, "%02d:%02d:%02d", (int)timeBufDec[4], (int)timeBufDec[5], (int)timeBufDec[6]); LCD_DispStr(0, 1, dis); switch (setIndex) { case 1: LCD_SetCursor(1, 1, 1); break; case 2: LCD_SetCursor(4, 1, 1); break; case 3: LCD_SetCursor(7, 1, 1); break; default:break; } } /************************* 设置喂食时间 *************************/ void DispSetFeedTime(unsigned char setIndex) { LCD_DispStr(0, 0, " Feed Time "); //LCD_DispStr(0, 0, " TIME 2 "); sprintf(dis, " %02d:%02d:%02d ", (int)feedTime[0], (int)feedTime[1], (int)feedTime[2]); LCD_DispStr(0, 1, dis); switch (setIndex) { case 1: LCD_SetCursor(5, 1, 1); break; case 2: LCD_SetCursor(8, 1, 1); break; case 3: LCD_SetCursor(11, 1, 1); break; default:break; } } /************************* 设置喂食量 *************************/ void DispSetFeedWeight(unsigned char setIndex) { LCD_DispStr(0, 0, " Food Weight "); sprintf(dis, " %6.3fkg ", (float)feedWeight/1000); LCD_DispStr(0, 1, dis); switch (setIndex) { case 1: LCD_SetCursor(8, 1, 1); break; default:break; } } void Timer0_Init() { TMOD &= 0xF0; TMOD |= 0x01; //T0 T1 均在工作方式1 PT0 = 1; //优先级设置 TR0 = 0; ET0 = 1; //T0开中断 EA = 1; //CPU开中断 } void Timer1_Init() { TMOD &= 0x0F; TMOD |= 0x10; //T0 T1 均在工作方式1 TH1 = (65536 - 18432) / 256; //定时20ms TL1 = (65536 - 18432) % 256; TR1 = 1; ET1 = 1; //T0开中断 EA = 1; //CPU开中断 } void Timer1(void) interrupt 3 //T1中断程序 { static unsigned char cnt = 0; static unsigned char time20ms = 0; static unsigned char motorCnt = 0; TH1 = (65536 - 18432) / 256; //定时20ms TL1 = (65536 - 18432) % 256; cnt++; if (cnt >= 20) { refreshFlag = 1; cnt = 0; } if (feedFlag1 == 1 || feedFlag2 == 1) //启动喂食,正转 {buzzer = 0; //蜂鸣器报警 if (time20ms >= 20) { time20ms = 0; if (motorCnt <= 8) { BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据 ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0; motorCnt++; } } else { time20ms++; } } else //停止喂食反转 {buzzer = 1; //蜂鸣器关闭 if (time20ms >= 20) { time20ms = 0; if (motorCnt > 0) { BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据 ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0; motorCnt--; } } else { time20ms++; } } } //程序结束

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212

设计文件:

链接:https://pan.baidu.com/s/10mvKkbvpWWYEWVzoxbiekw?pwd=jdqv

相关知识

基于51单片机智能鱼缸温度控制系统设计
基于51单片机的水族箱控制系统的设计与实现
基于单片机的宠物喂食系统设计(51基础版)
基于51单片机的智能宠物喂食系统
基于51单片机控制的智能鱼缸系统设计
【Proteus仿真】基于51单片机的宠物喂食系统设计
基于51单片机的宠物自动喂食项目:实现自动手动模式切换、定时喂食和液晶屏显示
基于单片机的智能宠物喂食器开题报告
基于单片机的智能鱼缸
基于51单片机的智能鱼缸宠物喂食养殖系统

网址: 基于51单片机的智能宠物喂养机仿真 https://m.mcbbbk.com/newsview761593.html

所属分类:萌宠日常
上一篇: 宠物喂食机调查问卷
下一篇: 我的宠物POU3D版下载1.0最