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