【Proteus仿真】基于51单片机的宠物喂食系统设计

ops/2024/9/23 6:26:32/

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于单片机>51单片机,两个按键调整重量阈值的大小,如果mpx4117压力传感器测重没超过阈值,
则电机转动,表示投喂,蜂鸣器发出滴滴声,如果超过阈值,则全部停止;
同时,再加三个按键,一个按键按下切换到闹钟设置模式,一个按键按下切换时和分的调整,
一个按键按下则增加时或者分,当系统时间到达所设置的时间后,显示屏显示50,
表示要投喂的重量,此时电机转动,蜂鸣器发出滴滴声

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include "LCD1602.h"
#include "DS1302.h"//IO设置
//****************************************************
sbit CS   =  P2^3;        //ADC0832引脚定义
sbit CLK  =  P2^4;
sbit DIO  =  P2^5;
sbit key1 =  P1^3;
sbit key2 =  P1^4;
sbit key3 =  P1^5;
sbit key4 =  P1^6;
sbit key5 =  P1^7;
sbit beep =  P2^6;
sbit out1 =  P3^0;
sbit out2 =  P3^1;unsigned char KEY_NUM = 0;
bit Flag\_KEY\_Set = 0;
unsigned char KEY2_Count = 0;
static uchar u,U,YL;
static int numbermax=100,flag=0,time_num,flag1=0,hournum=8,minutenum=0,miaonum=0,flag2 = 0;void ajpd(void);
void twpd(void);
void sjqh(void);
void nzpd(void);
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}uchar get\_AD\_Res()          //ADC0832启动读取函数
{uchar i, data1=0, data2=0;CS=0;CLK=0;DIO=1;\_nop\_();CLK=1;\_nop\_();CLK=0;DIO=1;\_nop\_(); CLK=1;\_nop\_();CLK=0;DIO=0;\_nop\_();CLK=1;\_nop\_();CLK=0;DIO=1;\_nop\_(); for(i=0; i<8; i++){CLK=1;\_nop\_();CLK=0;\_nop\_();data1=(data1<<1)|(uchar)DIO; }for(i=0; i<8; i++){data2=data2|(uchar)DIO<<i;CLK=1;\_nop\_();CLK=0;\_nop\_();}CS=1;return(data1 == data2)?data1:0;
}//显示实时时钟
//****************************************************
void Display_RTCC()
{unsigned char *weeklist\[7\]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};LCD1602\_write\_com(0x80);							//指针设置到第一行第1列LCD1602_prints("20");LCD1602_printc(DS1302Buffer.Year/10 + 0x30);	 //显示Year高位LCD1602_printc(DS1302Buffer.Year%10 + 0x30);	 //显示Year低位LCD1602_printc('-');LCD1602_printc(DS1302Buffer.Month/10 + 0x30);	 //显示Month高位LCD1602_printc(DS1302Buffer.Month%10 + 0x30);	 //显示Month低位LCD1602_printc('-');LCD1602_printc(DS1302Buffer.Day/10 + 0x30);		 //显示Day高位LCD1602_printc(DS1302Buffer.Day%10 + 0x30);		 //显示Day低位LCD1602\_write\_com(0x80+13);							 //指针设置到第一行第14列LCD1602_prints(weeklist\[DS1302Buffer.Week -1\]);LCD1602\_write\_com(0xc0);				 //指针设置到第二行第1列LCD1602_printc(DS1302Buffer.Hour/10 + 0x30);	 //显示Hour高位LCD1602_printc(DS1302Buffer.Hour%10 + 0x30);	 //显示Hour低位LCD1602_printc(':');LCD1602_printc(DS1302Buffer.Minute/10 + 0x30);	 //显示Minute高位LCD1602_printc(DS1302Buffer.Minute%10 + 0x30);	 //显示Minute低位LCD1602_printc(':');LCD1602_printc(DS1302Buffer.Second/10 + 0x30);	 //显示Second高位LCD1602_printc(DS1302Buffer.Second%10 + 0x30);	 //显示Second低位	
}void main()
{LCD1602_Init();									//初始化LCD1602LCD1602\_delay\_ms(1);LCD1602\_set\_position(0,0);//指针设置到第一行第1列LCD1602_prints("Hello World!");LCD1602\_set\_position(0,13);//指针设置到第一行第13列LCD1602_prints("STC");LCD1602\_delay\_ms(500);LCD1602\_write\_com(0x01);					//清屏指令DS1302_Init();									//初始化DS1302beep = 0;while(1){if(flag==0){DS1302_GetTime(&DS1302Buffer);							//获取当前RTCC值if(Flag\_Time\_Refresh==1&& Flag\_KEY\_Set == 0)			//数据更新时才刷新LCD{Flag\_Time\_Refresh = 0;Display_RTCC();				//显示实时时钟		}u=get\_AD\_Res();	   //压力传感器U=(250*u)/128;    YL=200*U/250;LCD_ShowNum(2,14,YL,3);LCD_ShowNum(2,10,numbermax,3);}ajpd(); //按键判断twpd();  //投喂判断nzpd(); //闹钟判断sjqh(); // 时间切换time_num++;											    //计时变量+1if(time_num == 5000){time_num = 0;}}
}void nzpd() //闹钟判断
{if(flag==0){if(DS1302Buffer.Hour == hournum && DS1302Buffer.Minute == minutenum && DS1302Buffer.Second > miaonum){flag2 = 1;numbermax = 50;LCD_ShowNum(2,10,numbermax,3);out1 = 1;out2 = 0;beep=1;Delay(300);beep=0;Delay(300);}else{flag2 = 0;}
}
}
void sjqh() //时间切换
{if(flag == 2){if(flag1 == 1){if(time_num % 100 == 0 ){LCD1602\_set\_position(0,0);//指针设置到第一行第1列LCD1602_prints("nao zhong");LCD1602\_set\_position(1,0);//指针设置到第二行第1列LCD1602_printc(hournum/10 + 0x30);	 //显示Hour高位LCD1602_printc(hournum%10 + 0x30);	 //显示Hour低位LCD1602_printc(':');LCD1602_printc(minutenum/10  + 0x30);	 //显示Minute高位LCD1602_printc(minutenum/10  + 0x30);	 //显示Minute低位LCD1602_printc(':');LCD1602_printc(miaonum/10  + 0x30);	 //显示Second高位LCD1602_printc(miaonum/10  + 0x30);	 //显示Second低位	}if(time_num % 200 == 0 ){LCD1602\_set\_position(1,1);LCD1602_printc("      ");}}if(flag1 == 2){if(time_num % 100 == 0 ){LCD1602\_set\_position(0,0);//指针设置到第一行第1列LCD1602_prints("nao zhong");LCD1602\_set\_position(1,0);//指针设置到第二行第1列LCD1602_printc(hournum/10 + 0x30);	 //显示Hour高位LCD1602_printc(hournum%10 + 0x30);	 //显示Hour低位LCD1602_printc(':');LCD1602_printc(minutenum/10  + 0x30);	 //显示Minute高位LCD1602_printc(minutenum%10  + 0x30);	 //显示Minute低位LCD1602_printc(':');LCD1602_printc(miaonum/10  + 0x30);	 //显示Second高位LCD1602_printc(miaonum/10  + 0x30);	 //显示Second低位	}if(time_num % 200 == 0 ){LCD1602\_set\_position(1,4);LCD1602_printc("      ");}}if(flag1 == 3){if(time_num % 100 == 0 ){LCD1602\_set\_position(0,0);//指针设置到第一行第1列LCD1602_prints("nao zhong");LCD1602\_set\_position(1,0);//指针设置到第二行第1列LCD1602_printc(hournum/10 + 0x30);	 //显示Hour高位LCD1602_printc(hournum%10 + 0x30);	 //显示Hour低位LCD1602_printc(':');LCD1602_printc(minutenum/10  + 0x30);	 //显示Minute高位LCD1602_printc(minutenum%10  + 0x30);	 //显示Minute低位LCD1602_printc(':');LCD1602_printc(miaonum/10  + 0x30);	 //显示Second高位LCD1602_printc(miaonum/10  + 0x30);	 //显示Second低位	}if(time_num % 200 == 0 ){LCD1602\_set\_position(1,7);LCD1602_printc("      ");}}}
}void ajpd()  //按键判断
{if(!key4){numbermax++;while(!key4);}if(!key5){numbermax--;while(!key5);}if(!key1) //切换模式{flag++;if(flag>2){flag=0;}if(flag==1){LCD1602\_write\_com(0x01);					//清屏指令LCD1602\_set\_position(0,0);//指针设置到第一行第1列LCD1602_prints("nao zhong");LCD1602\_set\_position(1,0);//指针设置到第二行第1列LCD1602_printc(0 + 0x30);	 //显示Hour高位LCD1602_printc(8 + 0x30);	 //显示Hour低位LCD1602_printc(':');LCD1602_printc(0 + 0x30);	 //显示Minute高位LCD1602_printc(0 + 0x30);	 //显示Minute低位LCD1602_printc(':');LCD1602_printc(0 + 0x30);	 //显示Second高位LCD1602_printc(0 + 0x30);	 //显示Second低位	}while(!key1);}if(!key2) //切换时间{flag1++;if(flag1>3){flag1=1;}while(!key2);}if(!key3){if(flag1==1){hournum++;if(hournum>24){hournum=0;}}if(flag1==2){minutenum++;if(minutenum>60){minutenum=0;}}while(!key3);}
}void twpd() //投喂判断
{if(flag2 == 0){if(YL>numbermax){out1=0;out2=0;beep=0;}else{out1=1;out2=0;beep=1;Delay(300);beep=0;Delay(300);}}}

四、实现现象

具体动态效果看B站演示视频:

基于单片机>51单片机的宠物喂食系统设计_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、演示视频):

通过百度网盘分享的文件:基于单片机>51单片机的宠物喂食系统设计.zip
链接:https://pan.baidu.com/s/1hxCikh5QDz6SodvzQIOn4w 
提取码:hszh 
–来自百度网盘超级会员V4的分享


http://www.ppmy.cn/ops/114626.html

相关文章

计算机毕业设计springboot+vue高校教学实施评教系统springcloud微服务分布式

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

mockito+junit搞定单元测试(2h)

一&#xff0c;简介 1.1 单元测试的特点 配合断言使用(杜绝 System.out )可重复执行不依赖环境不会对数据产生影响spring 的上下文环境不是必须的一般都需要配合 mock 类框架来实现 1.2 mock 类框架使用场景 要进行测试的方法存在外部依赖(如 db, redis, 第三方接口调用等)…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

【数据结构与算法 | 灵神题单 | 栈基础篇】力扣155, 1472, 1381

1. 力扣155&#xff1a;最小栈 1.1 题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆…

修复 blender 中文输入 BUG (linux/wayland/GNOME/ibus)

blender 是一个很好的 开源 3D 建模/动画/渲染 软件, 功能很强大, 跨平台 (GNU/Linux, Windows 等系统都支持). 然而, 窝突然发现, blender 居然不支持中文输入 (linux) ! 这怎么能忍 ? 再一查, 不得了, 这居然是个 3 年前一直未解决的陈年老 BUG. 不行, 这绝对忍不了, 这个 …

招联金融秋招-2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营…

SpringBoot中对数据库连接配置信息进行加密处理

1 在项目中加密 1.1 导包 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> </dependency>1.2 加密 配置文件 jasypt:encryptor:p…