一、项目功能
通过51单片机控制垃圾桶,实现三种不同的开盖方式
1、通过超声波检测距离,当人体靠近垃圾桶时自动开盖,并且随着开盖声音和开盖指示灯亮起,远离自动关盖,关盖指示灯亮起。
2、用震动传感器检测垃圾桶附近是否发生震动,发生震动时自动开盖。
3、通过单片机上按键对垃圾桶进行控制,当按键被按下实现开盖。
二、主要模块组成
1.超声波模块:通过用51单片机的定时器1进行处理。
2.舵机模块:通过用51单片机的定时器0中断进行处理。
3.震动模块:通过用51单片机的外部中断0低电平触发控制。
二、代码实现
1.超声波部分代码
double get_distance()
{
double time;
TH1 = 0; //重新给初值,方便下次超声波测距
TL1 = 0;
//1.给Trig引脚至少10us的高电平
startHC();
//2.当接受到高电平的那一下 开始计时
while(Echo == 0);
TR1= 1;
//3.当高电平转低电平那一刻 结束计时
while(Echo == 1);
TR1= 0;
//4.计算时间
time = (TH1 * 256 + TL1)*1.085;//把定时器高低八位整合在一起计算时间
return (time * 0.017); //5.函数返回距离
}
2.舵机部分代码
void initSg90_0() //舵机初始位置函数
{
jd=4;
cnt=0;
sg90_con=1;
}
void openDusbin() //开盖函数
{
char n;
//舵机开盖
jd=2;
cnt=0;
jd_bak=jd;
BEEP=0;
for(n=0;n<2;n++)
Delay150ms();
BEEP=1;
Delay2000ms();
}
void closeDusbin() //关盖函数
{
//舵机关盖
jd=4;
if(jd_bak !=jd){ //消除垃圾桶一直抖动bug
cnt=0;//角度变了cnt重新开始算
Delay150ms();
}
jd_bak=jd;
}
void Time0Handler() interrupt 1
{
cnt++;
TL0=0x33;
TH0=0xFE;//重新赋初值
if(cnt<jd){
sg90_con=1;//模拟pwm脉冲
}else{
sg90_con=0;
}
if(cnt==40){//爆表40次,20ms
cnt=0;
sg90_con=1;
}
}
3.主函数代码
void main()
{
double dis;
Time1Init();//定时器1初始化
Time0_init();//定时器0初始化
EX0_init();//外部中断0初始化
initSg90_0();//舵机的初始位置,关盖状态
while(1){
//超声波测距
dis=get_distance();
if(dis < 10||SW1==0||mark_vibrate==1){
//D5亮
openStatusLight();//开盖指示灯
//舵机关盖
openDusbin();//舵机开盖
mark_vibrate=0;//震动传感器标志位
}else{
//D6亮
closeStatusLight(); //关盖指示灯
//舵机开盖
closeDusbin();//舵机开盖
}
Delay150ms();
}
}
四、项目展示
详细项目视频
见主页 基于51单片机的智能垃圾桶视频!!!!!!