单片机垃圾桶项目

#include <REGX52.H>

//距离小于10cm,D5亮,D6灭,反之相反现象 

sbit D5  =P2^7;

sbit D6  =P2^0;

sbit Trig =P1^5;

sbit Echo =P1^6;

sbit sg90_con=P1^2;

sbit SW1=P3^1;

sbit vibrate = P3^2;

sbit beep=P2^5;

int cnt=0; //配置为全局变量
int jd;
int mark_vibate=0;
int jd_back;

void Timer0Init()
{
//	1.配置定时器0工作模式  16位计时
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;	
	
//	2.给初值,定一个10ms出来
	TL0 = 0x33;		//设置定时初值
	TH0 = 0xFE;		//设置定时初值
//	3.开始计时
	TR0=1;
	
	TF0=0;//可有可无,稳妥起见,可以先初始化一下
	
	//4.打开定时器0中断
	ET0=1;
	
	//5.打开总中断
	EA=1;
	
}

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;


	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Timer1Init()
{
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;	
	TL1=0;
	TH1=0;
	//设置定时器0工作模式,初始值设定为0开始数数,不着急启动定时器
	

}
void Delay10us()		//@11.0592MHz
{
	unsigned char i;

	i = 2;
	while (--i);
}
void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;


	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay300ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	
	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void startHC()
{
	Trig=0;
	Trig=1;
	Delay10us();
	Trig=0;
	
}
double get_distance()
{
	double time;
		//定时器清零以便下一次计算
	TL1=0;
	TH1=0;
	//1.Trig,给一个10us脉冲信号
	startHC();
	
//	2.由低电平跳转到高电平,表示开始发波
//	
	
	while(Echo==0);
	//波发出去的那一下,开始启动定时器
	
	TR1=1;
	
//	3.由高电平跳转到低电平,表示波回来了
	while(Echo==1);
	//波回来了定时器停止计时
	TR1=0;
	
//	4.计算出中间经过了多少时间
//	
	time=(TH1*256+TL1)*1.085;//us 单位
	
//	5.距离=速度(340m/s)*时间
	return (time*0.017);

}

void openStatusLight()
{
	D5=0;
	D6=1;
	
}	

	
void closeStatusLight()
{
	D5=1;
	D6=0;
	
}	

void initSG90_0()
{
	jd=1;//初始化角度是0度0.5ms高电平
	cnt=0;
	sg90_con=1;//一开始为高电平

}

void openDusbin()
{
	int n;
	jd=3;//90度 1.5ms高电平
	//舵机开盖
	if(jd_back!=jd)
	{
		
		cnt=0;
//		beep=0;
//		beep=1;
		Delay2000ms();
	}
	
	jd_back=jd;
	
}

voidcloseDusbin()
{
	//舵机开盖
		jd=1;//90度 1.5ms高电平
		jd_back=jd;
		cnt=0;
		Delay300ms();
}
void EX0_Init()
{
		//打开外部中断
	EX0=1;
	//低电平触发
	IT0=0;
}

void main()
{
	
	double dis;
	Timer0Init();
	Timer1Init();
	EX0_Init();
	//舵机的初始位置
	initSG90_0();
	
	while(1)
	{
		//超声波测距 
		dis=get_distance();
	
	if(dis<10||SW1==0||mark_vibate==1)//距离小于10
	{
		//灯开
		openStatusLight();
		openDusbin();
		mark_vibate=0;
	}
	else
	{
		//灯灭
		closeStatusLight();
		closeDusbin();
	
	}
	

	}
}



void Timer0Handler() interrupt 1
{


	cnt++;//统计爆表次数
			
	//重新给初值
	TL0 = 0x33;		
	TH0 = 0xFE;
	
	if(cnt<jd)
	{
		sg90_con=1;	
	}
			
			
	else
	{
		sg90_con=0;
	}	
			
			
	if(cnt == 40)//爆表了100次,经过了1s
	{
		cnt=0;  //当100次表示1s,重新让cnt从0计算,计算一下次的1s
		sg90_con=1;					
			
	}
		
	

}

void EX0_Handler() interrupt 0
{
	mark_vibate=1;

}

做垃圾桶项目需要注意的几点问题:

1.对于两个定时器,定时器0和1初始化错误导致浪费大量时间;

2.主函数中,定时器的初始化,传感器的初始化,一些状态的初始化(IO口高低电平的状态);

3.该项目中能利用模块化编程的思想;

4.代码编写过程中,注意规范问题,避免小失误的出现;

5.编程的思想建立,通过项目学会知识点与传感器的驱动方式。

6.功力尚浅,效率太低,望自己能够加油,继续冲冲冲!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值