知乎:Fragtex


代码

代码速览:

accesscontrol门禁机接线图_初始化

源码

【闲鱼】https://m.tb.cn/h.U1SDh0Z?tk=npyX2Dqp114 CZ0001 「我在闲鱼发布了【单片机指纹锁代码!!注释详尽!!耦合性低!!模块化封装!!完】」

产品描述

本门禁拥有两个检验模块,指纹识别模式密码输入模式
在使用指纹或者密码打开门禁后可以更改密码或者增删指纹,键入密码一共有三次机会,使用完以后会进入锁定状态并且蜂鸣器报警。

![](

accesscontrol门禁机接线图_嵌入式硬件_02

硬件原理图

accesscontrol门禁机接线图_初始化_03


需要将舵机和指纹模块的的VCC、GND和单片机链接,然后将舵机的PWM线(我这个舵机的是橙色线)连到P10,然后将指纹模块的TX和RX与单片机的RX和TX相连。接线图如下

accesscontrol门禁机接线图_单片机_04

accesscontrol门禁机接线图_单片机_05


软件逻辑图

指纹解锁逻辑

accesscontrol门禁机接线图_51单片机_06

AS608的使用

此处将所有的可能会用到的代码指令封装成了数组,便于下面指纹功能调用的时候调用串口Uart发送指令。

accesscontrol门禁机接线图_单片机_07

accesscontrol门禁机接线图_accesscontrol门禁机接线图_08


我们将所有的功能通过层层封装,最后只保留了几个接口

  • 添加指纹
  • 搜索指纹
  • 删除指纹库
  • 模式初始化

最后封装出来的头文件如下图所示,在主函数中只要包含这个头就可以直接使用该库了(当然需要你讲串口正确链接)

accesscontrol门禁机接线图_accesscontrol门禁机接线图_09

AS608的串口通信

该模块主要是为了为单片机与指纹模块通信服务的,主要封装了三个功能:

  • 串口初始化
  • 串口发送一个Byte
  • 串口接受一个Byte

accesscontrol门禁机接线图_accesscontrol门禁机接线图_10

此处有坑我们踩到了:就是串口通信在使用之前要用初始化函数配置好定时器,不然单片机会一直连不上指纹 模块。

SG90舵机的使用

SG90外部流出了三个引脚分别是GND、VCC、PWM,我们需要在单片机中模拟符合SG90标准的脉冲信号,改变脉冲信号的占空比来实现,此处详见代码

#include <REGX52.H>
#include "Delay.h"

static int k=0;
sbit signal=P1^0;						//SG90PMW的引脚接线的时候要注意接到这个口

//旋转度数的宏定义,更改旋转角度
#define spin0 1
#define spin45 2
#define spin90 3
#define spin135 4
#define spin180 5
unsigned int spin;

void timer_init()				//0.5ms定时器初始化
{
	TMOD=0x01;						//定时器0工作模式16位计数器
	ET0=1;								//允许定时器0中断
	TR0=1;								//开启定时器0中断
	EA=1;									//开启总中断
	TH0=0xFE;
	TL0=0x33;							//0.5ms定时对应到Unlock里面那个Delay(500)
	
}

void timer_close()
{
	ET0=0;								//不允许定时器0中断
	TR0=0;								//关闭定时器0中断
	EA=0;									//关闭总中断
}

void Timer0() interrupt 1
{
	TR0=0;								//关闭计数
	k=k+1;
	TH0=0xFE;
	TL0=0x33;							//重置使得下次定时器只计时0.5ms
	if(k<=spin)
	{
		signal=1;
	}
	else
	{
		signal=0;
		if(k==40)
		{
			k=0;
		}
	}
	TR0=1;								//开启计数
	
}
void delayms(int ms)
{
	int i,j;
	for(j=ms;j>0;j--)
		for(i=110;i>0;i--);
}
void Unlock()
{
		P1=0x00;
		timer_init();				//0.5ms定时器初始化
		spin=spin180;
		delayms(500);
		timer_close();			//关闭其中断
}
void Lock()
{
	P1=0x00;
	timer_init();					//0.5ms定时器初始化
	spin=spin0;
	delayms(500);
	P1=0x00;
	timer_close();				//关闭其中断

}

在这个代码中,我们将SG90的PWM引脚插在单片机的P1-0位置

其他

其他模块使用了江科大自化协老师封装的非常好用的模块如LCD1602,Delay,MatrixKey
大家如果想要了解的话可以转至B站深入学习,在此非常感谢他们的精品课程
点击查看【bilibili】


功能流图

accesscontrol门禁机接线图_accesscontrol门禁机接线图_11


成品展示:

详情可以看我们在B站发的视频:
点击查看【bilibili】