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

相关推荐
茯苓gao7 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉10 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者11 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间12 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious12 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng16 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计17 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试一、基本概念
嵌入式硬件·通信与接口协议
wuyk5551 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
☆cwlulu1 天前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu