说明:振动检测模块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(); }}