单片机制作智能垃圾桶

  硬件:STC89C51单片机 、 sg90舵机 、 超声波测距模块 、震动模块 、蜂鸣器。

  程序:

#include "reg52.h"
 sbit D6 =       P3^6;
 sbit D5 =       P3^7;
 sbit Trig =     P1^5;
 sbit Echo =     P1^6; 
 sbit sg90_con = P1^1;
 sbit sw1 =      P2^1;
 sbit vibrate =  P3^2;
 sbit beep    =  P2^0;

int cnt = 0;
int angle;
int angle_bak;
int mark_vibrate = 0;

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

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

//	_nop_();
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
//0.15s
void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	//_nop_();
	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
 
 void startHC()
 {
	 Trig = 0;
	 Trig = 1;
	 Delay10us();
	 Trig = 0;
 }

 void Timer0_init()
{
	  
    TMOD &= 0xF0;		
	  TMOD |= 0x01;
   
    TH0=0xFE;
    TL0=0x33;

    TR0 = 1;
	  TF0 = 0;
	
	  ET0 = 1;
	  
	  EA = 1;
} 
 
 void Timer1_init()
 {
	 TMOD &= 0x0F;		
	 TMOD |= 0x10;
   TH1 = 0x00;
	 TL1 = 0;
 }

 void EX0_init()
 {
	  EX0 = 1;
	 IT0 = 0;
 }

 void init_sg_90()
 {
	 sg90_con = 1;
	 angle = 1;
 }
 
 double get_distance()
 {
	 double time;
	 TH1 = 0;
	 TL1 = 0;
	 while(1)
	 {
		 startHC();
     while(Echo == 0);
		 TR1 = 1; 
		 while(Echo == 1);  
		 TR1 = 0;
		 time = (TH1*256+TL1)*1.085;  
		 return 0.017*time;/
	 }
 }
 
 void turn_light()
 {
	 D5 = 0;
	 D6 = 0;
 }

 void off_light()
 {
	 D5 = 1;
	 D6 = 1;
 }

 void turn_garbage()
 {
	  angle = 3;
	  if(angle_bak != angle)
		{
	  beep =  0;
		//cnt = 0;
	  Delay150ms();
    Delay150ms();		 
	  beep =  1;
    Delay2000ms();
		}
		angle_bak = angle;
 }
 
 void off_garbage()
 {
	  angle = 1;
	  angle_bak = angle;
	  //cnt = 0;
    Delay150ms();	
 }
 
 void main()
{
	 double dis;
	 Timer0_init();
	 Timer1_init();
	 EX0_init();
	 init_sg_90();
	while(1)
	  {
        dis =get_distance();
	      if(dis<10||sw1 == 0 || mark_vibrate == 1)
	       {
		         turn_light();
					   turn_garbage();
					   mark_vibrate = 0;
	       }
	      else
	       {
		         off_light();
					   off_garbage();
	       }
    }
}  

void Timer0handle() interrupt 1
{
				 cnt++;
	       
				 TH0=0xFE;
         TL0=0x33;
	      
	      if(cnt<angle)
				{
	       sg90_con = 1;
				}
				else
				{
					sg90_con = 0;
				}
				if(cnt == 40)//20ms
				{
					cnt = 0;
					sg90_con = 1;
				}
}

void EX0_handle() interrupt 0
{
	mark_vibrate = 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值