-
定义特殊功能位:使用
sbit
关键字定义了四个特殊功能位,这些位分别连接到单片机的I/O端口P1的第0到第3位。switcher
用于控制继电器的开关,D0_ON
和D1_OFF
分别用于检测两个按键的状态,vibrate
用于检测振动传感器的状态。 -
延时函数:定义了两个延时函数
Delay2000ms
和Delay500ms
,它们通过嵌套循环和while
循环实现大约2000毫秒和500毫秒的延时。这些延时用于模拟报警和解除报警的声音。 -
主函数
main
:程序的入口点,包含一个无限循环,表示系统将持续运行。 -
初始化变量:定义了一个整型变量
mark
并初始化为J_OFF
,用于存储报警模式的状态。 -
按键检测:
- 当
D0_ON
按键被检测为按下(状态为1),则设置switcher
为0,实现长响,并通过Delay2000ms
延时,之后将mark
设置为J_ON
,表示进入报警模式。 - 当
D1_OFF
按键被检测为按下(状态为1),则设置switcher
为0,实现短响,并通过Delay500ms
延时,之后将mark
设置为J_OFF
,表示关闭报警模式。
- 当
-
报警模式逻辑:
- 如果
mark
等于J_ON
,表示当前处于报警模式。 - 在报警模式下,程序会检测
vibrate
状态:- 如果
vibrate
为0(检测到振动),则设置switcher
为0,继电器导通,激活报警。 - 如果
vibrate
不为0(未检测到振动),则设置switcher
为1,继电器不导通,不触发报警。
- 如果
- 如果
-
无限循环:由于使用了
while(1)
,程序会无限循环执行上述逻辑,持续检测按键和振动状态,并根据当前的报警模式做出响应。
材料清单
#include "reg52.h"
#include<intrins.h>
#define J_ON 1
#define J_OFF 0
sbit switcher = P1^0;
sbit D0_ON = P1^1;
sbit D1_OFF = P1^2;
sbit vibrate = P1^3;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int mark = J_OFF;
while(1)
{
//1. 如果a按键被按下,设定为开启警报模式
if(D0_ON == 1){
//长响,表示进入警报模式
switcher = 0;
Delay2000ms();
switcher = 1;
//设定警报模式标记
mark = J_ON ;
}
//2. 如果b按键被按按下,设定为关闭警报模式
if(D1_OFF == 1){
//短响,表示进入解除警报模式
switcher = 0;
Delay500ms();
switcher = 1;
//设定警报解除模式标记
mark = J_OFF ;
}
//3. 如果标记是在警报模式下
if(mark == J_ON){
//3.1 如果发生了震动
if(vibrate == 0){
//喇叭响,给继电器低电平,导通
switcher = 0;
}//3.2 如果不发生震动
else{
//喇叭不响,给继电器高电平,不导通
switcher = 1;
}
}
}
}