简易电动车报警装置基于51单片机

        这篇文章我们就来简单聊一聊怎么用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的时候给烧了,没办法自己实操了哈哈哈,有知道的大佬可以在评论区聊一聊。最后祝大家学业有成,共勉。

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...