硬件: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;
}