说 明:振动检测模块DO引脚与单片机相连P当振动检测模块检测到10时 到振动时,DO通过检测口输出低电平P控制状态10LED1灭, 当检测到振动时,LED一亮两秒后,熄灭。(此程序分别使用延迟。 中断完成亮两秒的任务) 注:下载时勾选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();
}
}