功能描述
1,用无线遥控器控制垃圾站是否开始工作。
2,
检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
项目代码:
#include "reg52.h"
#include "intrins.h" //暂称内置函数
sbit sm9g=P1^1;//舵机引脚
char count=0;//用于舵机的定时器1的计时次数
char jd;//舵机角度
sbit SW1=P2^1;//按键引脚
sbit D6=P3^6;//led2引脚
sbit D5=P3^7;//led1引脚
//433接收器引脚,开启应用了外部中断1,关闭在main函数中实现。
sbit sigal_Start=P3^3;//433无线模块d4引脚,设置为外部中断1
sbit sigal_Shut=P3^4;//433模块d3引脚
char sigal433=0;//433的信号标志位
sbit vibration =P3^2;//振动传感器引脚,外部中断0
char insertvib=0;//振动器的标志位
//超声模块引脚
sbit echo=P1^6;
sbit trig=P1^5;
//sbit relay=P2^1;//继电器引脚
sbit beep=P2^0;//蜂鸣器引脚
//蜂鸣器宏定义
#define beep_ON 0;
#define beep_OFF 1;
void EX0_init()//外部中断0的初始化
{
IT0=0;
EX0=1;
}
/*void EX1_init()//外部中断1的初始化
{
IT1=1;
EX1=1;
}*/
void Delay500ms() //500ms延时
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay5000ms()//5000ms延时
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 211;
j = 30;
k = 11;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10us()//10us延时
{
unsigned char i;
i = 2;
while (--i);
}
void buzzer()//蜂鸣器短响
{
beep=beep_ON;
Delay500ms();
beep=beep_OFF;
}
void buzzer1()//蜂鸣器长响
{
beep=beep_ON;
Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();
beep=beep_OFF;
}
void ultrasound()//启动超声 ,给10us高电平
{
trig=0;
trig=1;
Delay10us();
trig=0;
}
double dis_Sound()//超声测距函数
{
double dds;//距离单位m
TH0 = 0;
TL0 = 0;
ultrasound();//启动超声
while(echo==0) //等待开始发送超声,echo=1进入下一步
TR0 = 1;//定时器0进行计时
while(echo==1)//收到回来的信号
TR0=0;//停止计时
dds=(TH0*256+TL0)*1.08507*0.00017; //正常返回距离数值,单位m
return dds;
}
void InitTimer0(void)//定时器0的初始化函数,用于超声计时
{
TMOD &= 0xF0; //定时器0设定重置
TMOD |= 0x01; //设置16位计时器
TH1 = 0x0FE;
TL1 = 0x33;
EA = 1;//总开关连接
ET0 = 1;//定时器0支路开关连接
TF0=0;//溢出标志位清零
}
void Timer1Init(void) //500微秒@11.0592MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10;
TL1 = 0x33; //设置定时初值
TH1 = 0xFE; //设置定时初值
ET1 = 1;//定时器0支路开关连接
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void main ()
{
char latejd;//上一次的角度
double dis1=10;//定义超声距离
Delay500ms();//等待硬件稳定
InitTimer0();//定时器0初始化
Timer1Init();//定时器1初始化
EX0_init();//振动器中断硬件初始化
jd=1;//刚开机角度设置为0度
latejd=0;//把开始角度赋给上一次角度
count=0;//计时次数再次设置为0
sm9g=1;
if(sigal_Start==1)//433按键B按键按下,关闭总开关标志位
{
// buzzer1();//蜂鸣器长响
D5=0;//打开D5
Delay500ms();
D5= 1;//关闭D5
sigal433=1;//关闭标志位
}
while(sigal433==1)//433总开关标志位为1进入循环
{
// dis1=dis_Sound();//返回超声探测距
if(insertvib==1||SW1==0) //发生了震动/SW1长按/超声探测到小于设置距离(m)||dis1<0.03
{
jd=3;
if(latejd!=jd)//本次和上一次角度相同时不重置count,作用防舵机摆动
{
jd=3;//舵机角度为90
count=0; D5 = 0;
Delay500ms(); Delay500ms(); Delay500ms(); Delay500ms();
D5 = 1;
insertvib=0;
latejd=jd;
}
}
else
{
jd=1;
if(jd!=latejd)//本次和上一次角度相同时不重置count,作用防舵机摆动
{
jd=1;//初始舵机角度为0
count=0;
Delay500ms(); Delay500ms(); Delay500ms(); Delay500ms();
latejd=jd;
}
}
if(sigal_Shut==1)//433按键B按键按下,关闭总开关标志位
{
// buzzer1();//蜂鸣器长响
D6=0;//
Delay500ms();
D6 = 1;
sigal433=0;//关闭标志位
}
}
}
void MS9g() interrupt 3 //计时器1,舵机PWM函数
{
count++;
//重新赋初值
TH1 = 0x0FE;
TL1 = 0x33;
if(count<jd)
{
sm9g=1;
}
else
{
sm9g=0;
}
if(count==40)
{
count=0;
sm9g=1;
}
}
void EX_VIBRATE ()interrupt 0 //振动器模块,使用外部中断1
{
buzzer();
Delay500ms();
buzzer();
Delay500ms();
buzzer();
Delay500ms();
insertvib=1;
}