【51单片机】【protues仿真】基于51单片机宠物投食系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、LCD1602液晶显示时间、温度、食物重量
2、按键手动投喂食物
3、称重模块检测当前食物重量
4、食物重量小于阈值会声光警报并自动投喂
二、使用步骤
基于51单片机的宠物投食系统通常包含以下功能显示模块使用LCD1602液晶屏,实时展示时间、温度及食物重量数据,投喂执行机构采用步进电机(ULN2003驱动)或舵机,实现正反转控制投食口开关。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、温度传感器、称重传感器模块、步进电机模块
4、蜂鸣器模块、继电器模块
5、时钟模块、数模转换模块
6、LCD1602显示模块
四、软件设计
#include "reg52.h"
#include "ds1302.h"
#include "lcd.h"
#include "temp.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define ulong unsigned long
#define GPIO_MOTOR P1
sbit KEY1 = P3^0;
sbit BEEP = P2^7;
sbit LED1 = P3^3;
sbit DOUT=P3^4; //定义2543数据读取口
sbit DIN =P3^5; //定义2543数据写入口
sbit CS =P3^6; //定义2543片选信号口
sbit CLK =P3^7; //定义时钟信号口
bit adjust;//调节标志位 0-1
u8 num;//闹钟调节位
u8 hour_shi, hour_ge, minute_shi, minute_ge;//闹钟调节
ulong Volt;//测量的电压值
ulong AD_Volt;//测量的电压值
ulong quality;//检测重量
ulong quality_set=2000;//设置的重量阈值200克
unsigned char code FFW_X[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //X反转顺序
unsigned char code FFZ_X[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //X正转顺序
unsigned char Direction,stop=0;
void delay30ms(void) //误差 0us
{
unsigned char a,b;
for(b=101;b>0;b--)
for(a=147;a>0;a--);
}
void Delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<80; k++)
{ }
}
}
void Motor()
{
unsigned char a=30;
unsigned char i;
for(i=0;i<8;i++)
{
if(Direction==1&&stop==0) //正转电机&电机没按下停止
GPIO_MOTOR = FFW_X[i]&0x0F;//取数据
if(Direction==2&&stop==0) //反转&X电机&电机没按下停止
GPIO_MOTOR = FFZ_X[i]&0x0F;
Delay(a);
}
}
void Read2543(uchar addr)
{
uint ad=0;
uchar i;
CLK=0;
CS=0;//片选段,启动2543
addr<<=4;//对地址位预处理
for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量
{
if(DOUT==1)
ad=ad|0x01;//单片机读取ad数据
DIN=addr&0x80;//2543读取测量地址位
CLK=1;
;;;//很短的延时
CLK=0;//产生下降沿,产生时钟信号
;;;
addr<<=1;
ad<<=1;//将数据移位准备下一位的读写
}
CS=1;//关2543
ad>>=1;
Volt=ad;//取走转换结果
//Volt=Volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV
Volt=Volt*5000/4095;
quality=(Volt/5.12+40)*10/4;//计算压力
//Pressure=(Volt/5.41+40)*10/4;
}
void KEY_Control()//按键调节
{
if(KEY1==0)
{
delay30ms();
if(KEY1==0)
{
stop=0;
Direction=1;
}
}
}
void show_quality(void)//显示重量
{
quality=quality-30;
DisplayOneChar(11,0,(char)(quality/1000+'0'));
DisplayOneChar(12,0,(char)(quality%1000/100+'0'));
DisplayOneChar(13,0,(char)((quality%100)/10+'0'));
if( quality <= quality_set )
{
stop=0;
Direction=1;
BEEP=0;
LED1=0;
Delay(200);
BEEP=1;
LED1=1;
Delay(300);
}
if( quality > quality_set )
{
stop=1;
BEEP=1;
LED1=1;
}
}
void main()//主函数
{
LcdInit();
DisplayOneChar(0,0,'2'); DisplayOneChar(1,0,'0'); DisplayOneChar(4,0,'-'); DisplayOneChar(7,0,'-');//2022-05-05 6
DisplayOneChar(2,1,':'); DisplayOneChar(5,1,':'); DisplayOneChar(2,1,':');//13:39:40
DisplayListChar(9,1,"T:"); DisplayOneChar(13,1,'.'); DisplayOneChar(15,1,'C');//T:23.5C
DisplayOneChar(15,0,'g');
while(1)
{
KEY_Control();//按键控制
Motor();//步进电机控制
Read2543(0);//检测重量
show_quality();//显示重量
ReadTemperature();//读取温度
DisplayTemp();//显示温度
Ds1302ReadTime();//读取时间
DisplayTime();//显示时间
}
}
五、实验现象
演示视频: