1. 感应开关盖垃圾桶需求设计(196.41)
项目概述
- 功能描述
- 检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
- 发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
- 按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
- 硬件说明
- 接线说明
- 舵机控制口 P1.1;
- 超声波 Trig接 P1.5 ,Echo接 P1.6 ;
- 蜂鸣器接 P2.0 口;
- 震动传感器接 P3.2口(外部中断0)
2. 垃圾桶01_修改超声波为定时器一控制(197.42)
开发步骤:
- 舵机和超声波代码整合
- 舵机用定时器0
- 超声波用定时器1
- 实现物体靠近后,自动开盖,2秒后关盖
- 查询的方式添加按键控制
- 查询的方式添加震动控制
- 使用外部中断0配合震动控制
- 代码(13./垃圾桶01代码/11. 舵机控制)(舵机的代码不变)(舵机接P1.1口)
#include "reg52.h"
#include <intrins.h>
sbit sg90_con=P1^1;
int cnt=0;
int degree;
void Timer0Init()
{
TMOD=0x01;
TH0=0xFE;
TL0=0x33;
ET0=1;
EA=1;
TR0=1;
}
void Delay300ms()
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay2000ms()
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Delay300ms();
Timer0Init();
degree=1;
cnt=0;
sg90_con=1;
while(1)
{
degree=3;
cnt=0;
Delay2000ms();
degree=1;
cnt=0;
Delay2000ms();
}
}
void Timer0Helper() interrupt 1
{
cnt++;
TH0=0xFE;
TL0=0x33;
if(cnt<degree)
{
sg90_con=1;
}else
{
sg90_con=0;
}
if(cnt==40)
{
cnt=0;
sg90_con=1;
}
}
- 代码(13./垃圾桶01代码/12. 超声波测距)(修改超声波代码,定时器0改为定时器1)
#include "reg52.h"
#include <intrins.h>
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit trig = P1^5;
sbit echo = P1^6;
void Delay10us()
{
unsigned char i;
i = 2;
while (--i);
}
void Delay200ms()
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init()
{
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
}
void startHC()
{
trig=0;
trig=1;
Delay10us();
trig=0;
}
void main()
{
double time;
double dis;
Timer1Init();
while(1)
{
Delay200ms();
startHC();
while(echo==0);
TR1=1;
while(echo==1);
TR1=0;
time=(TH1*256 + TL1)*1.085;
dis=time * 0.017;
if(dis<10)
{
D5=0;
D6=1;
}
else
{
D5=1;
D6=0;
}
TH1 = 0;
TL1 = 0;
}
}
3. 垃圾桶02_封装超声波测距代码(198.43)
- 代码(13./垃圾桶02代码_超声波封装)(简化main主函数:封装测距函数、封装对应状态灯亮灭的函数)
#include "reg52.h"
#include <intrins.h>
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit trig = P1^5;
sbit echo = P1^6;
void Delay10us()
{
unsigned char i;
i = 2;
while (--i);
}
void Delay200ms()
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init()
{
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
}
void startHC()
{
trig=0;
trig=1;
Delay10us();
trig=0;
}
double getDistance()
{
double time;
TH1 = 0;
TL1 = 0;
Delay200ms();
startHC();
while(echo==0);
TR1=1;
while(echo==1);
TR1=0;
time=(TH1*256 + TL1)*1.085;
return (time * 0.017);
}
void open_lightStatus()
{
D5=0;
D6=1;
}
void close_lightStatus()
{
D5=1;
D6=0;
}
void main()
{
double dis;
Timer1Init();
while(1)
{
dis=getDistance();
if(dis<10)
{
open_lightStatus();
}
else
{
close_lightStatus();
}
}
}
4. 垃圾桶03_实现距离感应开关盖(199.44)
- 代码(13./垃圾桶03代码_测距开关盖)(超声波接P1.5、P1.6口)
#include "reg52.h"
#include <intrins.h>
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit trig = P1^5;
sbit echo = P1^6;
sbit sg90_con = P1^1;
int cnt = 0;
int degree;
void Delay10us()
{
unsigned char i;
i = 2;
while (--i);
}
void Delay200ms()
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay150ms()
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay2000ms()
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0=0xFE;
TL0=0x33;
ET0=1;
EA=1;
TR0=1;
}
void Timer1Init()
{
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
}
void startHC()
{
trig=0;
trig=1;
Delay10us();
trig=0;
}
double getDistance()
{
double time;
TH1 = 0;
TL1 = 0;
Delay200ms();
startHC();
while(echo==0);
TR1=1;
while(echo==1);
TR1=0;
time=(TH1*256 + TL1)*1.085;
return (time * 0.017);
}
void open_lightStatus()
{
D5=0;
D6=1;
}
void close_lightStatus()
{
D5=1;
D6=0;
}
void initSG90_0()
{
degree=1;
cnt=0;
sg90_con=1;
}
void openDustbin()
{
degree=3;
cnt=0;
Delay2000ms();
}
void closeDustbin()
{
degree=1;
cnt=0;
Delay150ms();
}
void main()
{
double dis;
Timer0Init();
Timer1Init();
initSG90_0();
while(1)
{
dis=getDistance();
if(dis<10)
{
open_lightStatus();
openDustbin();
}
else
{
close_lightStatus();
closeDustbin();
}
}
}
void Timer0Helper() interrupt 1
{
cnt++;
TH0=0xFE;
TL0=0x33;
if(cnt<degree)
{
sg90_con=1;
}else
{
sg90_con=0;
}
if(cnt==40)
{
cnt=0;
sg90_con=1;
}
}
5. 垃圾桶04_添加按键开盖功能(200.45)
- 思路
if(dis<10 || sw1==0)//距离小于10cm,或者sw1按键被按下
- 代码(13./垃圾桶04代码_测距开关盖添加按键开盖功能)
6. 垃圾桶05_添加震动开盖功能_使用外部中断优化(201.46)
- 思路(振动器接P3.2口)
- 配置外部中断0的触发方式为低电平触发
- 当外部引脚的电平由高变为低时,触发外部中断0
- 即 发生震动时(低电平触发),标记1
- 代码(13./垃圾桶05代码_测距开关盖添加按键开盖震动开盖)
7. 垃圾桶06_添加开盖滴滴声_项目完结(202.47)
- 蜂鸣器接P2.0口
- 代码(13./垃圾桶06代码_添加开盖滴滴声_项目完结)
8. 垃圾桶成品展示(203.48)
9. 垃圾桶的抽抽BUG解决(204.49)
- 思路
- 做一个back让back判断是否为一直触发开盖状态
- 如何让他一直开盖后还延时
- 代码(13./垃圾桶07代码_添加开盖滴滴声_项目完结_解BUG)
void openDustbin()
{
char n;
degree=3;
if(degree_back != degree){
cnt=0;
beep=0;
for(n=0;n<2;n++){
Delay150ms();
}
beep=1;
Delay2000ms();
}
if(degree_back = degree){
Delay2000ms();
}
degree_back = degree;
}
void closeDustbin()
{
degree=1;
degree_back = degree;
cnt=0;
Delay150ms();
}