目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
基于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();//初始化LCD1602 LCD1602_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();//初始化DS1302 beep = 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);} } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348具体动态效果看B站演示视频:
基于51单片机的宠物喂食系统设计_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
通过百度网盘分享的文件:基于51单片机的宠物喂食系统设计.zip
链接:https://pan.baidu.com/s/1hxCikh5QDz6SodvzQIOn4w
提取码:hszh
–来自百度网盘超级会员V4的分享
相关知识
基于单片机的宠物喂食系统设计(51基础版)
基于Proteus学习单片机系列(十)——LCD1602
基于51单片机的宠物自动喂食项目:实现自动手动模式切换、定时喂食和液晶屏显示
基于单片机智能无线蓝牙定时器宠物喂食器、药盒系统设计
基于单片机的宠物喂食系统设计(32基础版)
基于单片机的智能宠物喂食器开题报告
基于单片机的宠物喂食系统设计(32+蓝牙+WIFI版)
51单片机与1602制作的多功能电子表资源
1912基于单片机宠物智能定时喂食投食系统设计(仿真 、程序、原理图)【毕设课设】
基于51单片机的智能宠物喂食系统
网址: 【Proteus仿真】基于51单片机的宠物喂食系统设计 https://m.mcbbbk.com/newsview456232.html
上一篇: 最大值(客户价值)=完好率×吨位 |
下一篇: 揭秘!6种“短命猫”,可能赔不了 |