知乎:Fragtex
代码
代码速览:
源码
【闲鱼】https://m.tb.cn/h.U1SDh0Z?tk=npyX2Dqp114 CZ0001 「我在闲鱼发布了【单片机指纹锁代码!!注释详尽!!耦合性低!!模块化封装!!完】」
产品描述
本门禁拥有两个检验模块,指纹识别模式和密码输入模式:
在使用指纹或者密码打开门禁后可以更改密码或者增删指纹,键入密码一共有三次机会,使用完以后会进入锁定状态并且蜂鸣器报警。
![](
硬件原理图
需要将舵机和指纹模块的的VCC、GND和单片机链接,然后将舵机的PWM线(我这个舵机的是橙色线)连到P10,然后将指纹模块的TX和RX与单片机的RX和TX相连。接线图如下
软件逻辑图
指纹解锁逻辑
AS608的使用
此处将所有的可能会用到的代码指令封装成了数组,便于下面指纹功能调用的时候调用串口Uart发送指令。
我们将所有的功能通过层层封装,最后只保留了几个接口
- 添加指纹
- 搜索指纹
- 删除指纹库
- 模式初始化
最后封装出来的头文件如下图所示,在主函数中只要包含这个头就可以直接使用该库了(当然需要你讲串口正确链接)
AS608的串口通信
该模块主要是为了为单片机与指纹模块通信服务的,主要封装了三个功能:
- 串口初始化
- 串口发送一个Byte
- 串口接受一个Byte
此处有坑我们踩到了:就是串口通信在使用之前要用初始化函数配置好定时器,不然单片机会一直连不上指纹 模块。
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】
功能流图
成品展示:
详情可以看我们在B站发的视频:
点击查看【bilibili】