基于51单片机宠物喂食定时系统设计

时间:2024-12-11 18:40:07



基于51单片机宠物喂食定时系统设计 毕业设计

  • 1、项目简介
  • 1.1 系统功能
  • 1.2 演示视频
  • 2、部分电路设计
  • 2.1 51单片机核心板电路设计
  • 2.2 压力传感器模块电路
  • 2.3 温湿度传感器模块电路
  • 2.4、LCD1602显示电路设计
  • 3、单片机代码展示
  • 3.1 LCD1602显示程序
  • 3.2 DHT11温湿度采集电路
  • 3.3 hx711称重电路


1、项目简介

1.1 系统功能

  • 功能介绍:
  • 1、LCD1602液晶显示当前的时间和温湿度、食物重量
  • 2、hx711压力传感器检测当前食物重量
  • 3、通过按键可设置喂养时间(3个时间段)
  • 4、通过按键可设置每次投放食物重量
  • 5、如果时间到了喂养时间,并且食物剩余量小于设置的食物重量电机才会正转,模拟进行投食,重量达到投放标准后,电机反转模拟停止喂食。
  • 6、还可以进行手动喂食。

1.2 演示视频

2、部分电路设计

2.1 51单片机核心板电路设计

  • 51单片机最小系统是确保51系列单片机能够正常工作的最基本电路配置,通常包括电源电路、晶振电路、复位电路。这些组件共同为单片机提供稳定的工作环境和必要的时钟信号,确保单片机能够准确地执行程序指令。
  • 电源电路:为单片机提供稳定的工作电压,通常采用5V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
  • 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
  • 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
  • 单片机最小系统原理图如下图所示:
  • 基于51单片机宠物喂食定时系统设计_毕业设计

2.2 压力传感器模块电路

  • 本次设计在重量检测方面采用HX711压力传感器,其工作原理是通过检测物体与传感器接触面的压力值,然后按照特点的线型比例,将压力值转换成重量值,然后发送给单片机,最后显示在液晶屏上。
  • 我们采用型号为CZL-A、量程大小为100kg的电阻应变式重量传感器进行重量检测,一旦被测物体受到重量重量传感器就会将采集到的信号转换成为电压信号,并输出电压信号,因为采集到的重量信号比较小我们需要使用信号放大,本设计系统采用的是HX711转换模块进行数据采集和编程。此模块检测到模拟电压进过24位A/D转换芯片把模拟量转换成为数字量,然后通过串行方式来和单片机进行通信,这样就完成数据的采集功能。其中U9为外接电阻式重量传感器。连接U2图中相对于的OUT、A+、A-、H。OUT对应重量传感器白色,A-对应为红色,A+对于为黑色,H对于为绿色。GND为电源负极、PDSCLK为数据传输、DOUT为输出、VCC为电源。

电路原理图:


基于51单片机宠物喂食定时系统设计_毕业设计_02

实物图:

基于51单片机宠物喂食定时系统设计_毕业设计_03


2.3 温湿度传感器模块电路

  • 本设计采用的是DHT11数字温湿度传感器[9],它是一款含有已校准数字信号输出的温度和湿度的复合传感器。
  • DHT11温湿度传感器包括一个电阻式感湿元件和一个NTC测温元件,能分别检测湿度数据和温度数据。它的工作电压范围3.5~5.5V,它能输出单总线数字信号,由于输出的是数字信号,就不需要进行模数转换,这大大简化了硬件设计。

其具体电路原理图如下图所示:


基于51单片机宠物喂食定时系统设计_毕业设计_04

实物图如下:

基于51单片机宠物喂食定时系统设计_毕业设计_05


2.4、LCD1602显示电路设计

  • LCD的D0~D7分别接单片机的的P2口,作为数据线,因为P0口内部没有上拉电阻,所以外部另外加上10K的上拉电阻;P1.0—P1.2分别接LCD的RS、RW、E三个控制管脚;RV1用来调节LCD的显示灰度;BLK、BLA为背光的阴极和阳极,接上相应电平即点亮背光灯。

引脚说明:


基于51单片机宠物喂食定时系统设计_51单片机_06

其具体电路原理图如下图所示:

基于51单片机宠物喂食定时系统设计_stm32_07


实物图:

基于51单片机宠物喂食定时系统设计_课程设计_08


3、单片机代码展示

3.1 LCD1602显示程序

void lcd_clear(void)
{
   lcd_write_com(0x01);
	 delay_ms(5);
}

void lcd_write_com(unsigned char byte)//写指令
{
		RS = 0;//命令
	  RW = 0;//写
	  E = 1;
	  DataPort = byte;//装载指令码
	  _nop_();
	  _nop_();
	  delay_ms(1);
	  E = 0;
	    
}

void lcd_write_data(unsigned char byte)//写数据
{
	  RS = 1;//数据
	  RW = 0;//写
	  E = 1;
	  DataPort = byte;//数据装载
	  _nop_();
	  _nop_();
	  delay_ms(1);
	  E = 0;
}

void lcd_init()
{
	  delay_ms(5);
	  lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	  delay_ms(5);
	  lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	  delay_ms(5);
	  lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	  delay_ms(5);
	  lcd_write_com(0x08); //关闭显示
	  delay_ms(5);
	  lcd_write_com(0x01);//清屏指令
	  delay_ms(5);
	  lcd_write_com(0x06);
	  delay_ms(5);
	  lcd_write_com(0x0c);
	  delay_ms(5);
	  
}
void lcd_write_char(unsigned char x,unsigned char y,unsigned char byte)//在指定位置显示一个字符
{
	  if(0 == y)
		{
			lcd_write_com(0x80 + x);//第一行
		}
	  else if(1 == y)
		{
			lcd_write_com(0x80 + 0x40 + x);//第二行
		}
		lcd_write_data(byte);
}

void lcd_write_str(unsigned char x, unsigned char y, unsigned char *s)//在指定位置显示一个字符串
{
	 if(0 == y)
		{
			lcd_write_com(0x80 + x);//第一行
		}
	  else
		{
			lcd_write_com(0x80 + 0x40 + x);//第二行
		}
		
		while(*s)//判断是否检测到结束符
		{
			lcd_write_data(*s);//显示一个字符
			s++;//指针加1
		}
		
}

3.2 DHT11温湿度采集电路

//--------------------------------
//-----温湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM(); 
//--------------------------------
unsigned char RH(void)
{
    //主机拉低18ms 
    DATA=0;
	Delay1(18); //延时18毫秒 
	DATA=1;
	//总线由上拉电阻拉高 主机延时20us
	Delay_10us();
	Delay_10us();
	Delay_10us();
	Delay_10us();
	//主机设为输入 判断从机响应信号 
	DATA=1;
	//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
	if(!DATA)		 //T !	  
	{
	    U8FLAG=2;
	    //判断从机是否发出 40-50us 的低电平响应信号是否结束	 
	    while((!DATA)&&U8FLAG++);
	    U8FLAG=2;
	    //判断从机是否发出 40-50us 的高电平,如发出则进入数据接收状态
	    while((DATA)&&U8FLAG++);
	    //数据接收状态		 
	    COM();
	    U8RH_data_H_temp=U8comdata;//湿度整数
	    COM();
	    U8RH_data_L_temp=U8comdata;//湿度小数
	    COM();
	    U8T_data_H_temp=U8comdata;//温度整数
	    COM();
	    U8T_data_L_temp=U8comdata;//温度小数
	    COM();
	    U8checkdata_temp=U8comdata;//校验和
	    DATA=1;
	    //数据校验 
	    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
	    if(U8temp==U8checkdata_temp)
	    {
	   	   U8RH_data_H=U8RH_data_H_temp;
	   	   U8RH_data_L=U8RH_data_L_temp;
	   	   U8T_data_H=U8T_data_H_temp;
	   	   U8T_data_L=U8T_data_L_temp;
	   	   U8checkdata=U8checkdata_temp;
	    }//fi
		return 1;
	}//fi
	else   //传感器不响应
	{
	   return 0;
	}
}

3.3 hx711称重电路

unsigned long ReadCount(void)//根据HX711芯片手册编写,请自行查阅
{
   unsigned long Count;
   unsigned char i;
   ADSK=0;
   Count=0;
   while(ADDO);
   for (i=0;i<24;i++)
   {
      ADSK=1;
      Count=Count<<1;
      ADSK=0;
      if(ADDO) Count++;
   }
   ADSK=1;
   Count=Count^0x800000;
   ADSK=0;
   return(Count);
}