仿真图:在这里插入图片描述

功能简介:

采用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++;
        }
    }

}
//程序结束

设计文件:

链接:https://pan.baidu.com/s/10mvKkbvpWWYEWVzoxbiekw?pwd=jdqv

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐