void main()
{
double dis;
Timer1Init();
Time0Init();
SG90_Init();
while(1){
dis = get_dis();
if(dis<10 || SW1 == 0||Vibrate == 0){
OpenTheLed5();
opengaizi();
}else{
CloseTheLed5();
closegaizi();
}
}
}
像这样只是简单的通过震动模块传给单片机一个让舵机转动,出来的现象使一卡一卡的,不是特别的灵敏,震动模块的反馈没有及时被捕获。
if(dis<10 || SW1 == 0||Vibrate == 0){
OpenTheLed5();
opengaizi(); //
}else{
CloseTheLed5();
closegaizi();
}
因为dis 大部分时间使大于0的,程序进行关盖的操作,并持续150ms后在进行下一步操作。
那为什么按键操作比震动模块操作的好呢?
因为按键的反馈的信号更加稳定持久。
持续的低电平更加容易钻到空子,而震动传感器发生震动的一瞬间 程序可能正在执行延迟。
因此 震动模块一但发生低电平,就触发中断,所以选用外部中断。
外部中断一定要要接P3^2
要用外部中断 EX0 = 1 (打开外部中断),EA= 1 总开关也要打开
中断的触发行为(这里我们用的使外部中断0)
所以我们想要用外部中断
打开外部中断
EX0 = 1;
触发中断
IT0 = 0;
总体整合代码如下
#include "reg52.h"
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit SW1 = P2^1;
sbit Trig = P1^5;
sbit Echo = P1^6;
sbit sg90_con = P1^1;
sbit Vibrate = P3^2;
int cnt;
int jd;
double time;
int mark_Vibrate = 0;
void Delay10us()
{
unsigned char i;
i = 2;
while (--i);
}
void Timer1Init()
{
TMOD &= 0x0F;
TMOD |= 0x10;
TL1 = 0;
TH1 = 0;
}
void startHC()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
double get_dis()
{
TL1 = 0;
TH1 = 0;
startHC();
while(Echo == 0);
TR1 = 1;
while(Echo == 1);
TR1 = 0;
time = (TH1*256 +TL1)*1.085 ;
return (0.017* time);
}
void OpenTheLed5()
{
D5 = 0;
D6 = 1;
}
void CloseTheLed5()
{
D5 = 1;
D6 = 0;
}
void Delay150ms()
{
unsigned char i, j, k;
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x33;
TH0 = 0xFE;
TR0 = 1;
TF0 =0;
ET0 = 1;
EA = 1;
}
void Delay2000ms()
{
unsigned char i, j, k;
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void opengaizi()
{
jd = 3;
cnt = 0;
Delay2000ms();
}
void closegaizi()
{
jd = 1;
cnt = 0;
Delay150ms();
}
void SG90_Init()
{
jd = 1;
cnt = 0;
sg90_con = 1;
}
void EX0_Init()
{
EX0 = 1;
EA = 1;
IT0 = 0;
}
void main()
{
double dis;
Timer1Init();
Time0Init();
EX0_Init();
SG90_Init();
while(1){
dis = get_dis();
if(dis<10 || SW1 == 0||mark_Vibrate==1){
OpenTheLed5();
opengaizi();
mark_Vibrate=0;
}else{
CloseTheLed5();
closegaizi();
}
}
}
void Time0ZD() interrupt 1
{
cnt++;
TL0 = 0x33;
TH0 = 0xFE;
if(cnt<jd){
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){
cnt = 0;
sg90_con = 1;
}
}
void EX0_ZD() interrupt 0
{
mark_Vibrate =1;
}