51单片机练习-感应开关盖垃圾桶

功能描述
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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值