【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();//显示时间

}

}

五、实验现象

演示视频:

相关推荐
2601_949146536 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x9 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
2的n次方_10 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫11 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
xuxg200511 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
凡人叶枫13 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CODECOLLECT13 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen14 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
傻乐u兔14 小时前
C语言进阶————指针3
c语言·开发语言