基于51单片机的智能宠物喂养机仿真
采用51单片机作为控制器,最小系统由晶振和复位电路组成液晶显示采用LCD1602用于显示该项目的参数信息具有多个功能按键,分别是设置、加、减和确认切换按键采用重力检测传感器检测食物重量,步进电机模拟喂食的过程具有LED和蜂鸣器组成的声光报警电路,
仿真图:
功能简介:
采用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++;
}
}
}
//程序结束
设计文件:
更多推荐



所有评论(0)