这篇文章我们就来简单聊一聊怎么用51做一个简易的电动车报警装置,本来还想用32也实现一下的,但是不知道为什么用32的话一把继电器接上去就把433M无线发送接收模块给烧了(有知道原因的大佬可以在评论区聊一聊哈)。好了,正式进入今天的主题。
首先当然是准备工作,我们需要准备一块51单片机开发板、震动传感器、继电器、电池盒、两节南孚电池、433M无线发送接收模块和警报喇叭。
先来大概了解一下各个模块
震动传感器
注意的是DO接单片机的信号线,AO啥也不用接,发生震动时DO输出低电平。
继电器
如上图所示,我们可以看见NC、COM和NO三个接口,NC是常闭端,COM是公共端,NO是常开端;三个引脚分别对应着IN-信号触发端、GND-直流负极和VCC-直流正极。通过查找资料我们知道,该模块由低电平触发,即当信号触发端有低电平触发时,根据我们的接线看继电器是否工作。NC端和COM端在不工作的状态下是导通的,所以我们只需要给IN端一个低电平,就可以使COM端和NO端导通,继电器就可以处在工作状态。我的接线是这样子的:
电池和警报喇叭的GND相连,电池的VCC接NO端,警报喇叭的VCC接COM端(两者可调换),当有低电平触发时,这个回路就会导通。
433M无线发送接收模块
该模块分为信号发射和接收两部分,遥控器上四个按键对应接收板上的四个输出引脚A-D0、B-D1、C-D2和D-D3,当按键按下时,对应数据就会输出高电平。
听完各个模块的介绍,我相信大家应该都知道要怎么做了。
代码的实现
先简单分析一下,我们应该要在51上给震动传感器供上电,上电后开关指示灯会长亮绿灯,DO指示灯会在震动时亮绿灯,表示DO端输出低电平,所以我们还得在51上找个引脚接DO端来接收信号;接着就是继电器,同样的,先给模块供上电,再在51上找个引脚接IN端,控制电平的高低,该引脚输出0时,继电器处于工作状态;最后一个就是433M无线发送接收模块,供电不必说了,在51上也找两个引脚分别接D1和D2,来接收信号。
上代码:
#include <reg52.h>
#include <intrins.h>
sbit Do_shake = P1^0;
sbit Switcher = P1^1;
sbit SwitchB = P3^2;
sbit SwitchC = P3^3;
sbit LED1 = P3^7;
sbit LED2 = P3^6;
int flag = 0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay400ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 206;
k = 43;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Exit0_Init(void)
{
EA = 1;
EX0 = 1;
IT0 = 1;
}
void Exit1_Init(void)
{
EA = 1;
EX1 = 1;
IT1 = 1;
}
void main(void)
{
Exit0_Init();
Exit1_Init();
while(1)
{
if (flag == 1)
{
if (Do_shake == 0) //发生震动
{
Switcher = 0; //有报警声
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
}
else
{
Switcher = 1; //无报警声
}
}
}
}
void Int0_Routine(void) interrupt 0
{
LED1 = 0;
Switcher = 0; //报警声响1s
Delay1000ms();
Switcher = 1;
flag = 1;
}
void Int1_Routine(void) interrupt 2
{
LED1 = 1;
Switcher = 0; //报警声响0.4s
Delay400ms();
Switcher = 1;
flag = 0;
}
其中flag时解锁标志位,为1时上锁,震动会报警,为0时解锁,震动不会报警。大家可能会想为什么要用中断,因为我在后续的调试中发现,当一直发生震动时,报警器会一直报警,我如果要中途解锁的话按解锁键是没用的,所以加了中断来解决这一问题。整个代码逻辑应该不难看懂,接下来我们来聊一聊中断。
中断
中断的概念我在这就不和大家啰嗦啦,主要是想讲一下怎么通过数据手册、使用手册等一些参考资料来写代码,而不是靠大脑死记下来。
首先我们打开手册,我们要用中断,自然就去找中断相关的内容,第一张图:
中断相关内容的我们需要看的第一页就是这个,我们这里使用的是外部中断,就找INT0(外部中断0)和INT1(外部中断1),发现涉及IT0、IT1,IE0、IE1,EX0、EX1和EA,而且框框上面还写了对应的寄存器IE和XICON寄存器,这个项目并未涉及优先级问题所以不用往后看了。所以我们往下一页翻。
第二张图:
从这段话红色框框中我们可以得出中断可以怎样触发,再参考下图:
第三张图:
回顾我们这个项目,遥控器按键按下时接收模块对应的引脚会输出高电平,按道理我们应该要配置成高电平触发,但是手册里并没有高电平触发,所以我们想一想有没有其他办法呢?既然按下按键为高电平,那么松开按键时是不是变为了低电平呢,那我们可不可以把它配置成下降沿触发呢,事实证明是可以的,所以IT0和IT1我们配置成1。再往下走:
我们找到和IE寄存器相关的内容,第四张图:
根据这张图,我们知道要开总中断,EA要配置为1,即EA=1;要允许外部中断0和1,即EX0=1,EX1=1;
到此,我们需要用的中断就配置完了,这里需要注意的是IE0和IE1这两个位,配置时不需要把IE0和IE1置1或置0,手册中说到这是标志位,我们可以用来查询啥的,具体大家可以自己在手册上看看。
这个项目到此也就完成了,但是有一个地方我觉得可能需要修改一下,就是433M无线发送接收模块那块,我们需不需要将接D1和D2的这两个引脚初始化电平为0呢,因为我查资料说普通51单片机引脚默认是高电平,现在这个模块被我玩32的时候给烧了,没办法自己实操了哈哈哈,有知道的大佬可以在评论区聊一聊。最后祝大家学业有成,共勉。