提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
传统垃圾桶存在诸多不便,如需要手动开盖、容易滋生细菌、无法提醒清理等问题。为了解决这些问题,我们设计了这款智能垃圾桶,它结合了传感器技术、单片机控制和自动化机械结构,实现了自动开盖、垃圾满溢提醒,为人们的生活带来了全新的体验。
题目要求
蜂鸣和led报警、超声波传感器检测垃圾高度,进行垃圾桶状态检测、红外对管进行人体检测、按键电路手动控制垃圾桶开关
1、 上电液晶显示“欢迎使用智能垃圾桶系统”,5秒后显示 “垃圾桶状态:正常”
2、 白天有人的时候,垃圾桶打开,液晶显示“垃圾桶状态:打开”
3、 晚上有人扔垃圾,绿色照明灯打开,垃圾桶打开,5秒后,垃圾桶关闭,液晶显示“垃圾桶状态:关闭”
4、 超声波测距检测垃圾桶的容量,容量满,蜂鸣器报警,红色指示灯闪烁,液晶显示,“垃圾桶状态:异常”
5、 此时,如果有人继续投放垃圾,垃圾桶盖不再打开,蜂鸣器报警,红色指示灯闪烁,频率加快。
6、 手动按键可手动打开垃圾桶。若垃圾桶状态已满,则手动按键失去作用。
一、protues仿真图
二、相关程序
1.头文件,引脚定义及延时函数
代码如下(示例):
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
//1602
sbit cs=P1^5;
sbit clk=P1^6;
sbit di=P1^7;
//0832
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
//开关
sbit md=P1^4;
//舵机
sbit pwm=P2^7;
//超声波
sbit trig=P3^0;
sbit echo=P3^1;
//led灯
sbit green=P3^6;
sbit red=P3^7;
//蜂鸣器
sbit buzz=P3^5;
//按键
sbit key=P1^0;
u8 h[5];
u16 h1=0;
unsigned long dist;
u8 open=0;
u8 a=150;
u8 dev=1;
u8 on_off=0;
u8 be=0;
u8 op=0;
u16 time=0;
u16 tt;
u16 flag;
u8 display[6];
void us(u16 u)//10us
{
while(u--);
}
void ms(u16 ms)//1ms
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
2.驱动程序
代码如下(示例):
void write_cmd(u8 cmd)
{
rs=0;
rw=0;
e=0;
P0=cmd;
ms(1);
e=1;
ms(1);
e=0;
}
void write_data(u8 dat)
{
rs=1;
rw=0;
e=0;
P0=dat;
ms(1);
e=1;
ms(1);
e=0;
}
void init()
{
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
}
void lcd_str(u8 x,u8 y, u8 *str)
{
u8 i=0;
if(y==0)
write_cmd(0x80+x);
if(y==1)
write_cmd(0xc0+x);
if(y==2)
write_cmd(0x94+x);
if(y==3)
write_cmd(0xd4+x);
for(i=0;str[i]!='\0';i++)
{
write_data(str[i]);
}
}
u8 ad0832()
{
u8 i,k,j;
cs=0;
for(j=0;j<3;j++)
{
clk=1;
di=1;
us(2);
clk=0;
us(2);
}
for(i=0;i<8;i++)
{
clk=1;
us(2);
clk=0;
us(2);
k=(k<<1)|di;
}
cs=1;
us(2);
return k;
}
void count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
dist=(int)(time*0.1725);
}
3.打开定时器程序
代码如下(示例):
void timeinit()
{
TMOD=0X11;
TH0=0;
TL0=0;
TH1=0XFF;
TL1=0X00;
EA=1;
ET1=1;
ET0=1;
TR1=1;
TR0=1;
}
4.main函数
void main()
{
init();
lcd_str(0,0,"Welcome to the smart trash can system");
ms(5000);
write_cmd(0x01);
timeinit();
red=1;
while(1)
{
while(!echo);
TR0=1;
while(echo);
TR0=0;
count();
lcd_str(0,3,h);
if(dist<501)
{
lcd_str(3,1,"normal");
red=1;
on_off=1;
}
if(dist>500)
{
lcd_str(3,1,"adnormal");
lcd_str(12,1,"overflow");
dev=1;
on_off=2;
}
lcd_str(0,0,"Trash can ststus:");
lcd_str(11,1,"-");
h1=ad0832()/2.55;
if(h1<51)
{
lcd_str(0,2,"night");
open=1;
}
if(h1>50)
{
lcd_str(0,2,"night");
open=2;
}
if(on_off==1)
{
if(md==1)
{
lcd_str(12,1,"close");
op=0;
dev=1;
}
if(md==0)
{
lcd_str(12,1,"close");
if(open==1)
{
dev=7;
}
if(open==2&&op==0)
dev=7;
}
}
if(on_off==1)
{
if(md==0&&open==2&&op==0)
{
green=0;
dev=7;
ms(2000);
green=1;
dev=1;
op=1;
}
}
if(key==0)
{
if(on_off==1)
{
md=~md;
}
if(on_off==2&&a>10)
{
a-=10;
}
while(key==0);
}
if(on_off==2)
{
red=~red;
ms(a);
buzz=~buzz;
ms(a);
}
}
}
5.定时器程序
void time0() interrupt 1
{
flag=1;
}
void time1_time() interrupt 3
{
TH1=0XFF;
TL1=0X00;
tt++;
if(on_off==1)
{
time++;
if(time>199)
{
time=0;
}
if(time<dev)
{
pwm=1;
}
if(time>dev)
{
pwm=0;
}
}
if(tt>=100)
{
tt=0;
trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
}
}
总结
以上是智能垃圾桶的protues仿真及程序编写,如有不足请各位大佬指正。
通过百度网盘分享的文件:51智能垃圾箱.rar
链接: https://pan.baidu.com/s/18qWvPb3PFq1md9AE44hkWg?pwd=4cps 提取码: 4cps