【51单片机】【protues仿真】基于51单片机宠物投食器系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、LCD1602液晶显示当前时间
2、按键设置时间,5个定时投喂时间​
3、可以通过手动按键进行投喂食物
4、步进电机模拟投喂食物

二、使用步骤

基于51单片机的宠物自动投食器系统设计可实现定时喂食、手动喂食及状态监测等功能。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、时钟模块
4、蜂鸣器模块
5、步进电机模块
6、LCD1602显示模块

四、软件设计

#include "common.h"
#include "lcd1602.h"
#include "eeprom52.h"
#include "DS1302.h"

sbit key1 = P1^0;//切换键
sbit key2 = P1^1;//加键
sbit key3 = P1^2;//减键
sbit key4 = P1^3;//开启
sbit key5 = P1^4;//关闭

sbit beep = P3^7;//蜂鸣器

#define  angle  360  //电机旋转的角度
uchar code Clock[]={0x01,0x02,0x04,0x08};             // 步进电机顺时针旋转数组
uchar code AntiClock[]={0x08,0x04,0x02,0x01};        // 步进电机逆时针旋转数组
unsigned char setn = 0;//设置标志
uchar  DS1302_Table[7]={0};
uchar  sec, min, hour, day, month, week, year;
bit   open_flag=0;
bit   feeding_time = 0;

typedef struct {
    unsigned char  shi;      //时
    unsigned char     fen;        //分
}user;

user  foodtime1={7,00};    //喂食时间1
user  foodtime2={11,03};   //喂食时间2
user  foodtime3={14,0};   //喂食时间3
user  foodtime4={17,0};   //喂食时间4
user  foodtime5={22,19};   //喂食时间5

/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
    uint i,j;
    for(i=0;i<time;i++)
        for(j=0;j<112;j++);
}

/*********************************************************/
// 开
/*********************************************************/
void Ul2003_Open()
{
    uint i,j;
        for(j=0;j<10;j++)        // 控制步进电机正转
        {
            for(i=0;i<4;i++)
            {
                P2=Clock[i]|0xf0;
                DelayMs(10);
            }
        }
}

/*********************************************************/
// 关
/*********************************************************/
void Ul2003_Close()
{
    uint i,j;
        for(j=0;j<10;j++)        // 控制步进电机反转
        {
            for(i=0;i<4;i++)
            {
                P2=AntiClock[i]|0xf0;
                DelayMs(10);
            }
        }
}


void time_init(void)      //定时器初始化
{
    TMOD |= 0x01;      //定时器0工作方式1
  TL0 = 0xCD;        
    TH0 = 0xF8;  //定时器定时2ms
     TR0 = 1;
    ET0 = 1;          //开定时器0中断 
    EA  = 1;           //开总中断
}

void eepromWriteByte(void)
{
      uint addr=0x2000;
    
         SectorErase(addr);//扇区擦除
       byte_write(addr++, foodtime1.shi);
       byte_write(addr++, foodtime1.fen);
       byte_write(addr++, foodtime2.shi);
       byte_write(addr++, foodtime2.fen);
       byte_write(addr++, foodtime3.shi);
       byte_write(addr++, foodtime3.fen);
       byte_write(addr++, foodtime4.shi);
       byte_write(addr++, foodtime4.fen);
       byte_write(addr++, foodtime5.shi);
       byte_write(addr++, foodtime5.fen);
       byte_write(0x2014, 0xAA);
}

void eepromInit(void)
{
      uint addr=0x2000;
    
        if(byte_read(0x2014)!=0xAA)//校验是不是新的单片机
        {
                eepromWriteByte();
              delay_ms(100);
        }
}

void displayTime(void)
{
     //显示时间
     lcd_write_com(0x80);
     lcd_write_data(DS1302_Table[0]/10+0x30);
     lcd_write_data(DS1302_Table[0]%10+0x30);
     lcd_write_data('/');
     lcd_write_data(DS1302_Table[1]/10+0x30);
     lcd_write_data(DS1302_Table[1]%10+0x30);
     lcd_write_data('/');
     lcd_write_data(DS1302_Table[2]/10+0x30);
     lcd_write_data(DS1302_Table[2]%10+0x30);

     lcd_write_com(0x80+0x40);
     lcd_write_data(DS1302_Table[4]/10+0x30);
     lcd_write_data(DS1302_Table[4]%10+0x30);
     lcd_write_data(':');
     lcd_write_data(DS1302_Table[5]/10+0x30);
     lcd_write_data(DS1302_Table[5]%10+0x30);
     lcd_write_data(':');
     lcd_write_data(DS1302_Table[6]/10+0x30);
     lcd_write_data(DS1302_Table[6]%10+0x30);
}

void write_week(uchar week)//写星期函数
{
    lcd_write_com(0x80+9);//星期字符的显示位置
    switch(week)
    {
    case 1:
        lcd_write_data('M');//星期数为1时,显示
        lcd_write_data('O');
        lcd_write_data('N');
        break;

    case 2:
        lcd_write_data('T');//星期数据为2时显示
        lcd_write_data('U');
        lcd_write_data('E');
        break;

    case 3:
        lcd_write_data('W');//星期数据为3时显示
        lcd_write_data('E');
        lcd_write_data('D');
        break;

    case 4:
        lcd_write_data('T');//星期数据为4是显示
        lcd_write_data('H');
        lcd_write_data('U');
        break;

    case 5:
        lcd_write_data('F');//星期数据为5时显示
        lcd_write_data('R');
        lcd_write_data('I');
        break;

    case 6:
        lcd_write_data('S');//星期数据为6时显示
        lcd_write_data('A');
        lcd_write_data('T');
        break;

    case 0:
        lcd_write_data('S');//星期数据为7时显示
        lcd_write_data('U');
        lcd_write_data('N');
        break;
    }

}

void Run_DS1302(void)//DS1302运行
{
      //获取时间:年月日时分秒
        v_W1302(0x8f, 0);
        sec = bcdtodec(uc_R1302(0x81));      
        v_W1302(0x8f, 0);
        min = bcdtodec(uc_R1302(0x83));      
        v_W1302(0x8f, 0);
        hour = bcdtodec(uc_R1302(0x85)); 
        v_W1302(0x8f, 0);
        day = bcdtodec(uc_R1302(0x87));     
        v_W1302(0x8f, 0);
        month = bcdtodec(uc_R1302(0x89)); 
        v_W1302(0x8f, 0);
        week = bcdtodec(uc_R1302(0x8b)); 
        v_W1302(0x8f, 0);
        year = bcdtodec(uc_R1302(0x8d)); 
        
      DS1302_Table[0]=year;
        DS1302_Table[1]=month;
        DS1302_Table[2]=day;
        DS1302_Table[3]=week;
        DS1302_Table[4]=hour;
        DS1302_Table[5]=min;
        DS1302_Table[6]=sec;
        
        displayTime();
//    write_week(week);
}

void displayUserSetValue(const user * const date)//显示设置值
{
     lcd_write_char(6,1,date ->shi / 10+'0');
     lcd_write_char(7,1,date ->shi % 10+'0');
     lcd_write_char(9,1,date ->fen / 10+'0');
     lcd_write_char(10,1,date ->fen % 10+'0');
}

void keyscan()
{
  if(key1 == 0)//设置键
    {
        delay_ms(10);
        if(key1 == 0)
        {
            beep = 0;
            delay_ms(100);
            beep = 1;
            while(key1 == 0);//等待按键松开
            setn++;
            if(setn > 16)//按下次数超过16次,退出设置
            {
                setn = 0;
                lcd_write_com(0x0c);//关闭光标
                lcd_clear();
                lcd_write_str(0, 0, "  /  /          ");
            lcd_write_str(0, 1, "  :  :          ");
                eepromWriteByte();    //退出设置之后,把数据保存一遍
            }
            
            if(setn == 1)//设置年
            {
                 displayTime();
                
                 lcd_write_com(0x80+1);
                 lcd_write_com(0x0f);
            }
            if(setn == 2)//设置月
            {
                 lcd_write_com(0x80+4);
                 lcd_write_com(0x0f);
            }
            if(setn == 3)//日
            {
                 lcd_write_com(0x80+7);
                 lcd_write_com(0x0f);
            }
            if(setn == 4)//时
            {
                 lcd_write_com(0x80+0x40+1);
                 lcd_write_com(0x0f);
            }
            if(setn == 5)//分
            {
                 lcd_write_com(0x80+0x40+4);
                 lcd_write_com(0x0f);
            }
            if(setn == 6)//秒
            {
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 7)
            {
                lcd_write_str(0, 0, "set food time 1 ");
                lcd_write_str(0, 1, "      00:00     ");
                
                displayUserSetValue(&foodtime1);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 8)
            {
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
            if(setn == 9)
            {
                lcd_write_str(0, 0, "set food time 2 ");
                lcd_write_str(0, 1, "      00:00     ");
                
                displayUserSetValue(&foodtime2);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 10)
            {
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
            if(setn == 11)
            {
                lcd_write_str(0, 0, "set food time 3 ");
                lcd_write_str(0, 1, "      00:00     ");
                
                displayUserSetValue(&foodtime3);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 12)
            {
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
            if(setn == 13)
            {
                lcd_write_str(0, 0, "set food time 4 ");
                lcd_write_str(0, 1, "      00:00     ");
                
                displayUserSetValue(&foodtime4);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 14)
            {
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
            if(setn == 15)
            {
                lcd_write_str(0, 0, "set food time 5 ");
                lcd_write_str(0, 1, "      00:00     ");
                
                displayUserSetValue(&foodtime5);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
            if(setn == 16)
            {
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        }
    }
    if(key2 == 0)
    {
        delay_ms(10);
        if(key2 == 0)
        {
            beep = 0;
            delay_ms(100);
            beep = 1;
            while(key2 == 0);
             if(setn == 1)//设置年
             {
                     DS1302_Table[0]++;
                     if(DS1302_Table[0] == 100)//最大到100 
                     DS1302_Table[0] = 0;
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+1);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else if(setn == 2)//设置月
             {
                    DS1302_Table[1]++;
                    if(DS1302_Table[1]==13)//最大12个月
                    DS1302_Table[1]=1;

                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+4);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else if(setn == 3)//设置日
             {
                     DS1302_Table[2]++;

                    if(DS1302_Table[2]==32)
                            DS1302_Table[2]=1;

                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+7);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else if(setn == 4)//设置时
             {
                     DS1302_Table[4]++;
                     if(DS1302_Table[4] == 24)//到0点
                     DS1302_Table[4] = 0;
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+0x40+1);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else  if(setn == 5)//设置分
             {
                     DS1302_Table[5]++;
                     if(DS1302_Table[5] == 60)//60分钟
                     DS1302_Table[5] = 0;
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+0x40+4);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else  if(setn == 6)//设置分
             {
                     DS1302_Table[6]++;
                     if(DS1302_Table[6] == 60)//60秒
                     DS1302_Table[6] = 0;
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//写入DS1302
                     
                     displayTime();//显示
                     
                     lcd_write_com(0x80+0x40+7);
                     lcd_write_com(0x0f);//光标闪烁
             }
             else if(setn == 7)
            {
                foodtime1.shi++;
                if(foodtime1.shi==24)
                foodtime1.shi=0;
                
                displayUserSetValue(&foodtime1);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
         else    if(setn == 8)
            {
                foodtime1.fen++;
                if(foodtime1.fen==60)
                foodtime1.fen=0;
                
                displayUserSetValue(&foodtime1);
                
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
         else    if(setn == 9)
            {
                foodtime2.shi++;
                if(foodtime2.shi==24)
                foodtime2.shi=0;
                
                displayUserSetValue(&foodtime2);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 10)
            {
                  foodtime2.fen++;
                if(foodtime2.fen==60)
                foodtime2.fen=0;
                displayUserSetValue(&foodtime2);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 11)
            {
                foodtime3.shi++;
                if(foodtime3.shi==24)
                foodtime3.shi=0;
                
                displayUserSetValue(&foodtime3);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 12)
            {
                   foodtime3.fen++;
                if(foodtime3.fen==60)
                foodtime3.fen=0;
                displayUserSetValue(&foodtime3);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 13)
            {
                foodtime4.shi++;
                if(foodtime4.shi==24)
                foodtime4.shi=0;
                
                displayUserSetValue(&foodtime4);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 14)
            {
                  foodtime4.fen++;
                if(foodtime4.fen==60)
                foodtime4.fen=0;
                displayUserSetValue(&foodtime4);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 15)
            {
                foodtime5.shi++;
                if(foodtime5.shi==24)
                foodtime5.shi=0;
                
                displayUserSetValue(&foodtime5);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 16)
            {
                  foodtime5.fen++;
                if(foodtime5.fen==60)
                foodtime5.fen=0;
                
                displayUserSetValue(&foodtime5);
                
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        }
    }
    if(key3 == 0)
    {
        delay_ms(10);
        if(key3 == 0 )
        {
            beep = 0;
            delay_ms(100);
            beep = 1;
            while(key3 == 0);
            if(setn == 1)//设置年
             {
                     if(DS1302_Table[0] == 0)
                     DS1302_Table[0] = 100;
                     DS1302_Table[0]--;
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                     
                     displayTime();
                     
                     lcd_write_com(0x80+1);
                     lcd_write_com(0x0f);
             }
             else if(setn == 2)//设置月
             {
                    DS1302_Table[1]--;
                    if(DS1302_Table[1]==0)
                            DS1302_Table[1]=12;

                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                     
                     displayTime();
                     
                     lcd_write_com(0x80+4);
                     lcd_write_com(0x0f);
             }
             else if(setn == 3)//设置日      
             {
                     DS1302_Table[2]--;

                        if(DS1302_Table[2]==0)
                            DS1302_Table[2]=31;
   
                     Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                     
                     displayTime();
                     
                     lcd_write_com(0x80+7);
                     lcd_write_com(0x0f);
             }
                else    if(setn == 4)//设置时
                 {
                         if(DS1302_Table[4] == 0)
                         DS1302_Table[4] = 24;
                         DS1302_Table[4]--;
                         Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                         
                         displayTime();
                         
                         lcd_write_com(0x80+0x40+1);
                         lcd_write_com(0x0f);
                 }
                 else  if(setn == 5)//设置分
                 {
                         if(DS1302_Table[5] == 0)
                         DS1302_Table[5] = 60;
                         DS1302_Table[5]--;
                         Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                         
                         displayTime();
                         
                         lcd_write_com(0x80+0x40+4);
                         lcd_write_com(0x0f);
                 }
                 else  if(setn == 6)//设置秒
                 {
                         if(DS1302_Table[6] == 0)
                         DS1302_Table[6] = 60;
                         DS1302_Table[6]--;
                         Write_DS1302Init(DS1302_Table[0],DS1302_Table[1],DS1302_Table[2],0,DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);
                         
                         displayTime();
                         
                         lcd_write_com(0x80+0x40+7);
                         lcd_write_com(0x0f);
                 }
                 else if(setn == 7)
            {
                
                if(foodtime1.shi==0)
                foodtime1.shi=24;
                foodtime1.shi--;
                displayUserSetValue(&foodtime1);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
         else    if(setn == 8)
            {
                if(foodtime1.fen==0)
                foodtime1.fen=60;
                foodtime1.fen--;
                displayUserSetValue(&foodtime1);
                
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
         else    if(setn == 9)
            {
                
                if(foodtime2.shi==0)
                foodtime2.shi=24;
                foodtime2.shi--;
                displayUserSetValue(&foodtime2);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 10)
            {
                if(foodtime2.fen==0)
                foodtime2.fen=60;
                 foodtime2.fen--;
                displayUserSetValue(&foodtime2);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 11)
            {
                
                if(foodtime3.shi==0)
                foodtime3.shi=24;
                foodtime3.shi--;
                displayUserSetValue(&foodtime3);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 12)
            {
                if(foodtime3.fen==0)
                foodtime3.fen=60;
                foodtime3.fen--;
                displayUserSetValue(&foodtime3);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 13)
            {
                if(foodtime4.shi==0)
                foodtime4.shi=24;
                foodtime4.shi--;
                displayUserSetValue(&foodtime4);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 14)
            {
                if(foodtime4.fen==0)
                foodtime4.fen=60;
                foodtime4.fen--;
                displayUserSetValue(&foodtime4);
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        else    if(setn == 15)
            {
                
                if(foodtime5.shi==0)
                foodtime5.shi=24;
                foodtime5.shi--;
                displayUserSetValue(&foodtime5);
                
                lcd_write_com(0x80+0x40+7);
                lcd_write_com(0x0f);
            }
        else    if(setn == 16)
            {
                if(foodtime5.fen==0)
                foodtime5.fen=60;
                foodtime5.fen--;
                displayUserSetValue(&foodtime5);
                
                    lcd_write_com(0x80+0x40+10);
                    lcd_write_com(0x0F);
            }
        }
    }
    if(key4 == 0)   //手动开
    {
        delay_ms(10);
        if(key4 == 0 )
        {
            beep = 0;
            delay_ms(100);
            beep = 1;
            while(key4 == 0);
            if(setn != 0)
            {
                setn = 0;
                lcd_write_com(0x0c);//关闭光标
                lcd_clear();
                lcd_write_str(0, 0, "  /  /          ");
            lcd_write_str(0, 1, "  :  :          ");
                eepromWriteByte();    //退出设置之后,把数据保存一遍
            }
            else
            {
                Ul2003_Open();
                open_flag=1;                
            }
        }
    }
    if(key5 == 0)      //手动关
    {
        delay_ms(10);
        if(key5 == 0 )
        {
            beep = 0;
            delay_ms(100);
            beep = 1;
            while(key5 == 0);
            if(setn != 0)
            {
                setn = 0;
                lcd_write_com(0x0c);//关闭光标
                lcd_clear();
                lcd_write_str(0, 0, "  /  /          ");
            lcd_write_str(0, 1, "  :  :          ");
                eepromWriteByte();       //退出设置之后,把数据保存一遍
            }
            else
            {
                  Ul2003_Close();    
                    open_flag=0;
            }
        }
    }
}

void main()
{
      
    
      lcd_init();//1602液晶初始化
      eepromInit();
      lcd_write_str(0, 0, "00/00/00         ");
        lcd_write_str(0, 1, "00:00:00 ClOSE   ");
        time_init();
      while(1)
      {
         keyscan();//按键扫描

            if(setn == 0)
            {
                 Run_DS1302();   //获取时间
                 if(open_flag==0)lcd_write_str(9, 1, "ClOSE");
                 else            lcd_write_str(9, 1, "OPEN ");
                  /***************************************************/
                 /*************    喂食时间到了           ************/
                  /***************************************************/
                 if( (foodtime1.shi == hour && foodtime1.fen == min && sec == 0) || 
                       (foodtime2.shi == hour && foodtime2.fen == min && sec == 0) || 
                     (foodtime3.shi == hour && foodtime3.fen == min && sec == 0) || 
                     (foodtime4.shi == hour && foodtime4.fen == min && sec == 0) || 
                     (foodtime5.shi == hour && foodtime5.fen == min && sec == 0) 
                 )
                 {
                        if(feeding_time==0)
                        {
                            open_flag=1;   //开启喂食标志            
                            Ul2003_Open();
                        }
                        feeding_time = 1;
                 }
             }             
       delay_ms(1);         
       }
}

五、实验现象

演示视频:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94155.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握设计模式--命令模式

命令模式&#xff08;Command Pattern&#xff09; 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求&#xff08;命令&#xff09;封装成对象&#xff0c;从而使您能够参数化客户端&#xff08;调用者&#xff09;使用不同的请求、…

STM32之beep、多文件、延迟、按键以及呼吸灯

一、Beep控制 原理图分析&#xff1a; 蜂鸣器三极管控制引脚对应 MCU PB8。当前蜂鸣器对应的电路中&#xff0c;三极管是 NPN 三极管&#xff0c;当前【基极】存在小电流&#xff0c;当前三极管导通。要求对应 PB8 引脚对外输出电压 / 电流。当前 PB8 输出高电平&#xff0c;当…

C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别

我们来看一个C代码下面的struct结构体: struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【构造函数】UserValue() {setZero();}// 【成员函数】void setZero() {lx 0;ly 0;rx 0;ry 0;L2 0;} };在这篇文章中&#xff0c;我们将来详细解释一下为什么 U…

【Kubernetes知识点】资源配额与访问控制

目录 1.解释ResourceQuota的作用。 2.解释Service Account的用途。 3.详细解释Role和ClusterRole。 4.什么是K8s的NetworkPolicy&#xff1f; 5.详细描述在K8s中如何控制跨Namespace的Pod访问&#xff1f; 1.解释ResourceQuota的作用。 ResourceQuota&#xff08;资源配额…

在SAP Query中添加双击事件

在SAP系统中&#xff0c;SAP Query是一个强大的工具&#xff0c;允许用户自定义报告以满足特定的数据查询需求。它提供了灵活的报表设计功能&#xff0c;使非编程背景的用户也能创建和修改查询。在某些情况下&#xff0c;我们可能希望在查询结果上添加交互性&#xff0c;比如通…

c++:MFC中sqlite3的使用(附实际案例)

MFC中sqlite3的使用sqlite3介绍sqlite3安装常用API函数操作流程接口函数执行sql语句函数回调函数MFC中案例实践控制台实践sqlite3介绍 SQLite 是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL …

LeetCode第1019题 - 链表中的下一个更大节点

题目 解答 class Solution {Stack<Integer> stack new Stack<>();List<Integer> values new LinkedList<>();public int[] nextLargerNodes(ListNode head) {nextLargerNodes2(head);return values.stream().mapToInt(x -> x).toArray();}publi…

STM32 硬件I2C读写MPU6050

本文代码基于 STM32 单片机&#xff0c;通过 I2C 总线驱动 MPU6050 六轴传感器&#xff08;集成加速度计与陀螺仪&#xff09;&#xff0c;实现传感器初始化、ID 读取、原始数据采集&#xff0c;并借助 OLED 显示屏实时展示加速度&#xff08;AccX、AccY、AccZ&#xff09;与角…

倍福下的EC-A10020-P2-24电机调试说明

今天调试EC-A10020-P2-24电机&#xff0c;采用力位混合控制指令进行控制&#xff0c;无前馈力矩&#xff0c;只调节Kp和Kd,跟踪红色轨迹&#xff08;正弦信号&#xff1a;幅值10&#xff0c;频率0.5Hz&#xff09;&#xff0c;结果显示Kp 180, Kd 40&#xff0c;实际上Kp进一步…

SQL注入1----(sql注入原理)

一.前言前面我们讲解了一下信息收集&#xff0c;本章节我们来讲解一下sql注入的基本原理&#xff0c;我们拿之前搭建的测试网站pikachu来测试&#xff0c;对应工具包也已经放在了工具里面&#xff0c;大家可以自行去下载。SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写…

C++智能指针详解:用法与实践指南

C智能指针详解&#xff1a;用法与实践指南 在C编程中&#xff0c;动态内存管理始终是开发者面临的重要挑战。手动分配和释放内存不仅繁琐&#xff0c;还容易因疏忽导致内存泄漏、悬垂指针等问题。为解决这些痛点&#xff0c;C标准库引入了智能指针&#xff08;Smart Pointers&a…

fastdds qos:DurabilityQosPolicy

假如DataWriter先起来&#xff0c;并且已经写了一些数据&#xff0c;之后有新的DataReader起来&#xff0c;那么新起来的DataReader能不能接收到它启动之前&#xff0c;DataWriter发布的数据呢。DurabilityQosPolicy用来做这种控制。VOLATILE_DURABILITY_QOS&#xff1a;易失的…

【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践

一、项目简介 SQLBot 是 DataEase 团队开源的自然语言转 SQL 智能助手,致力于让非技术用户也能通过自然语言与数据库对话,自动生成 SQL 查询,实现自助数据分析、智能BI问答、报表生成等场景。SQLBot 结合了大语言模型(LLM)、数据库元数据解析、SQL解析与执行等多项技术,…

开题报告被退回?用《基于大数据的慢性肾病数据可视化分析系统》的Hadoop技术,一次通过不是梦

&#x1f496;&#x1f496;作者&#xff1a;计算机编程小咖 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括大数…

HEVC(H.265)与HVC1的关系及区别

HEVC&#xff08;H.265&#xff09;与HVC1的关系及区别可归纳如下&#xff1a;一、技术定义差异‌HEVC&#xff08;H.265&#xff09;‌国际标准化组织制定的通用视频编码标准&#xff0c;由ITU-T和ISO/IEC联合开发‌1支持8K分辨率&#xff0c;压缩效率较H.264提升约50%‌1‌HV…

Java获取被nginx代理的emqx客户端真实ip

Java获取被nginx代理的emqx客户端真实ip 契机 ⚙ 使用nginx作为负载均衡&#xff08;Load Balancing&#xff09;的时候&#xff0c;发现真实ip无法获取。几经折腾终于拿到真实ip&#xff0c;又发现被代理的端口又无法使用非代理模式连接&#xff0c;由于之前暴露的docker端口有…

Jenkins自动化部署服务到Kubernetes环境

在现代软件开发中,持续集成和持续部署(CI/CD)已成为提高开发效率和软件质量的关键实践。本文将介绍如何使用Jenkins自动化部署服务到Kubernetes环境,并重点介绍Maven与私服的配置。 环境准备 在开始之前,请确保您已准备好以下环境: Jenkins服务器 Kubernetes集群 Docker镜…

OpenAI重新开源!gpt-oss-20b适配昇腾并上线魔乐社区

2025年8月5日&#xff0c;OpenAI发布了两款全新的开源权重语言模型&#xff0c;均为混合专家&#xff08;MoE&#xff09;架构&#xff0c;其规模设计可在消费级GPU和云端的多种硬件上高效运行。这些模型采用 Apache 2.0 许可协议&#xff0c;因此可用于蒸馏到其他推理模型中、…

SpringCloud入门(简洁明了)

目录 一.创建微服务项目 (一)环境准备 (二)项目结构图 (三)流程 二. Nacos (一)注册中心 1.服务注册 2.服务发现 3.编写微服务API 4.远程调用基本实现 5.负载均衡 6.LoadBalanced注解式注解均衡 7.注册中心宕机&#xff0c;远程调用还能成功吗 (二)配置中心 1.基…

集成算法学习笔记

一、集成算法简介1. 核心思想类比“多个专家综合判断优于单个专家”&#xff0c;通过构建并结合多个个体学习器&#xff0c;提升模型的泛化能力&#xff08;降低过拟合风险、提高预测准确性&#xff09;&#xff0c;完成复杂的学习任务。2. 个体学习器与结合模块个体学习器&…