38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动,
然后串口连接P3.0和P3.1模拟ESP8266,
红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.2口,
MPX4117重量传感器连接ADC0832数模转换器连接单片机的P1.3~P1.5口,
然后LCD1602连接单片机的P0.0P0.7口和P2.0P2.2口;

红外检测到动物靠近,则单片机控制电机转动,重量检测低于5G,则控制电机转动,
串口可以远程发送信息控制电机转动,
各项参数通过LCD1602显示屏显示

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

复制代码
#include <REGX52.H>#include<intrins.h>#include<stdio.h>#include "Delay.h"#include "LCD1602.h"#define uchar unsigned char#define uint unsigned  intsbit CS=P1^0;                 //adc0832引脚sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;                 //adc0832引脚sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit out1 = P2^3;
sbit out2 = P2^4;static uchar u,U;static char Dat_rxd;static int num;
uchar a\[3\];static int flag,flag1,flag2,flag3=0;uchar get\_AD\_Res()            //ADC0832启动读取函数 红外{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;	
	return(data1 == data2)?data1:0;
}uchar get\_AD\_Res1()            //ADC0832启动读取函数 重量{
	uchar i, data1=0, data2=0;
	CS1=0;
	
	CLK1=0;DIO1=1;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=0;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO1; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO1<<i;
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
	}
	CS1=1;	
	return(data1 == data2)?data1:0;
}void Com0_Init(void){
    EA=1;        //开总中断
    ES=1;        //允许串口中断
    TMOD=0x20;   //定时器T1,在方式3中断产生波特率
    SCON=0x50;
    TH1=0xfd;    //波特率设置为9600(晶振12M)
    TL1=0xfd;
    TR1=1;       //开定时器T1运行控制位
	}void Com0(void) interrupt 4 using 1{    if(RI)
    {
        Dat_rxd=SBUF;                 //串口接收
        Dat\_rxd=Dat\_rxd-0x30;
        RI=0;
    }
   
}void main()					  //主函数{	
	LCD_Init();         //显示屏初始化
	Com0_Init();//串口初始化 
	LCD\_ShowString(1,1,"-----kaiji-----");	Delay(1000);	LCD\_Init();         //显示屏初始化
	LCD_ShowString(1,9,"zidong  ");	while(1)
	{
		u=get\_AD\_Res(); //红外
	  U=get\_AD\_Res1();//重量
		
		if(Dat_rxd==0x01) //启动
		{ 
		 flag3 = 1;
		}		else if(Dat_rxd==0x02) // 停止
		{
		flag3 = 2;
		}		else if(Dat_rxd==0x03) // 切换
		{
			flag3 = 0;
		}		
		
		if(u<100)
		{			LCD_ShowString(1,1,"youren");
		  flag = 1;
		}		else
		{			LCD_ShowString(1,1,"wuren ");
			flag = 2;
		}
		a\[0\]=U/100;
		a\[1\]=(U/10)%10;
		a\[2\]=U%100;		LCD\_ShowNum(2,1,a\[0\],1);		LCD\_ShowNum(2,2,a\[1\],1);		LCD\_ShowString(2,3,".");		LCD\_ShowNum(2,4,a\[2\],1);		LCD_ShowString(2,5,"g");		
		if(a\[1\]<5)
		{
			flag1=1;
		}		else
		{
			flag1=2;
		}
		flag2 = flag*flag1;		if(flag3 == 0)
		{		LCD_ShowString(1,9,"zidong  ");		if(flag2 == 1 || flag2 == 2 )
		{
			out1 = 1;
			out2 = 0;
		}		else if(flag2 == 4)
		{
			out1 = 0;
			out2 = 0;
		}
	 }		
		if(flag3 == 1)
		{
			out1 = 1;
			out2 = 0;			LCD_ShowString(1,9,"shoudong");
		}		
		else if(flag3 == 2)
		{
			out1 = 0;
			out2 = 0;
		}
	}
}

四、实现现象

具体动态效果看B站演示视频:

B站演示视频

基于单片机的宠物喂食

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载https://pan.baidu.com/s/1y_5fXiGptsymw0wqOdKHXw?pwd=kev8

相关推荐
代码总长两年半2 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
咕咚.萌西2 小时前
RISC-V体系架构
嵌入式硬件·架构·risc-v
玉~你还好吗2 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件
猫头虎2 小时前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程
学生董格2 小时前
[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行
stm32·单片机·嵌入式硬件
gmmi4 小时前
ARM 基础(3)
嵌入式硬件
蜀黍@猿5 小时前
【GD32】存储器架构介绍
单片机·mcu
Aczone288 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
EkihzniY14 小时前
OCR 证件识别:驱动澳门酒店自助入住智能化
嵌入式硬件·ocr
好家伙VCC15 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模