说 明:将振动检测模块的DO引脚连接至单片机的P10,当振动检测模块检测
到振动时,DO口输出低电平,通过检测P10的状态来控制LED1灭,
当检测到振动的时候,LED1亮两秒后,熄灭。(此程序分别用了延时
和中断来完成亮两秒的任务)
注:下载时勾选使能6T(双倍速)模式
代码:
#include <STC89C5xRC.H>
#include "intrins.h"
sbit led_1=P3^7;
sbit led_2=P3^6;
sbit vibrate=P1^0; //振动检测 振动时输出低电平
int led_2_temp; //LED2的标志物
//=======================================================
void Delay2000ms() //@11.0592MHz 延时2秒
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void vibrate_detection_1() //振动检测(延时模式)
{
if(vibrate==0)
{
led_1=0;
Delay2000ms();
led_1=1;
}
}
//=======================================================
//=======================================================
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0xEE; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
int count_1;
void timer0_service() interrupt 1 //定时器0的服务函数,LED2每次亮2秒
{
if(led_2_temp==0)
{
count_1++;
if(count_1>=400)
{
led_2_temp=1;
count_1=0;
}
}
}
void led_control() //通过LED2标志位来控制LED2的状态
{
led_2=led_2_temp;
}
void vibrate_detection_2() //振动检测(定时器模式)
{
if(vibrate==0&&led_2_temp==1)
{
led_2_temp=0;
}
}
//=======================================================
void main()
{
led_1=led_2=1;
Timer0Init();
while(1)
{
// vibrate_detection_1();
vibrate_detection_2();
led_control();
}
}