2025年3月26日 星期三 甲辰(龙)年 月廿五 夜 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 单片机

基于单片机设计的指纹锁(读取、录入、验证指纹)

时间:01-19来源:作者:点击数:47

一、前言

指纹识别技术是一种常见的生物识别技术,利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁,指纹锁具有更高的安全性和便利性,以及防止钥匙丢失或密码泄露的优势。

基于单片机设计的指纹锁项目是利用STC89C52作为主控芯片,结合AS608光学指纹识别模块和LCD1602显示屏,实现了指纹的读取、录入和验证功能。用户可以通过按键来进行指纹的录入和删除操作,并通过LCD显示屏来查看指纹识别的状态。

在该项目中,AS608光学指纹识别模块是核心部件。它使用光学传感器采集指纹图像,然后通过算法进行特征提取和比对,最终判断指纹是否匹配。AS608模块具有高精度和高速的指纹识别能力,并且支持多种功能指令,如添加指纹、删除指纹和验证指纹等。

另外,LCD1602显示屏提供了可视化的界面,能够直观地显示指纹识别的状态信息。用户可以通过观察LCD显示屏上的提示信息,了解指纹录入、删除和验证的结果。

步进电机是用于模拟开锁操作的部件,通过正反转来实现门锁的解锁和上锁。当指纹验证成功时,步进电机会进行适当的旋转,使门锁打开,允许用户进入。

该项目的背景是为了满足人们对安全性和便利性的需求,提供一种高效且可靠的门禁系统。通过指纹识别技术,可以确保只有授权的人员才能够进入特定区域,避免了传统钥匙的遗失和密码的泄露问题。同时,单片机作为主控芯片,具有低功耗、稳定性强等特点,非常适合用于嵌入式系统的设计与开发。

这个项目的实施背景可以是家庭门禁系统、办公场所门禁系统、学校宿舍门禁系统等各种需要实现安全控制的场景。

image-20230913155040589
image-20230913154759722

二、项目整体设计思路

2.1 硬件设计思路

(1)主控芯片:选择STC89C52作为主控芯片,它是一款功能强大且广泛使用的单片机。它具有丰富的GPIO口、中断和定时器等功能,能够满足指纹锁项目的需求。

(2)光学指纹识别模块:采用AS608光学指纹识别模块作为指纹识别设备,该模块具有高精度的指纹识别能力。它通过光学传感器采集指纹图像,并通过算法进行特征提取和比对,最终实现指纹的识别和验证。

(3)显示屏:选用LCD1602液晶显示屏作为人机交互的界面,该显示屏可以直观地显示指纹识别的状态信息,提供用户友好的操作界面。

(4)按键:通过按键实现指纹的录入、删除和管理等操作。按键可以设置为添加指纹、删除指纹和确认等功能,方便用户进行指纹的管理。

(5)步进电机:使用28BYJ-48步进电机来模拟开锁操作,根据指纹识别结果控制步进电机的正反转。当指纹验证成功时,步进电机会旋转,使门锁打开。

2.2 软件设计思路:

(1)初始化:在系统启动时,进行相关硬件的初始化操作,包括主控芯片、指纹识别模块、显示屏和步进电机等。

(2)指纹录入功能:当用户选择指纹录入操作时,系统会提示用户按下指纹,然后通过光学传感器采集指纹图像,并提取特征信息。将提取的指纹特征存储在芯片的存储器中,以备后续的指纹验证使用。

(3)指纹删除功能:用户可以选择删除已录入的指纹,系统会提示用户选择要删除的指纹,并进行相应的删除操作。

(4)指纹验证功能:当用户选择指纹验证操作时,系统会提示用户按下指纹,然后通过光学传感器采集指纹图像,并提取特征信息。将提取的特征信息与存储在芯片存储器中的指纹特征进行比对,判断指纹是否匹配。如果匹配成功,则触发步进电机旋转,打开门锁;否则,提示验证失败。

(5)显示功能:通过LCD1602显示屏展示指纹验证的状态信息,包括录入、删除和验证等操作的结果。例如,显示指纹录入成功、删除成功或验证成功等信息。

(6)错误处理:在系统运行过程中,需要对各种可能出现的错误进行处理,如指纹录入失败、删除失败或验证失败等情况。系统需要及时给出相应的提示信息,以便用户了解具体的错误原因。

硬件设计上,主要选用适合的单片机、指纹识别模块、显示屏和步进电机等组件,搭建起指纹锁的硬件平台;软件设计上,利用主控芯片进行指纹录入、删除和验证的功能实现,并通过显示屏展示相关信息,实现一个完整的指纹锁系统。

三、硬件连线说明

以下是指纹识别模块、显示屏、按键和步进电机的引脚连接:

模块 引脚 连接到单片机的IO口
指纹识别模块 AS608 VCC 5V
  GND GND
  TXD P1.0 (串口发送)
  RXD P1.1 (串口接收)
液晶显示屏 LCD1602 VCC 5V
  GND GND
  SDA P2.0 (I2C总线数据)
  SCL P2.1 (I2C总线时钟)
  RS P3.0
  RW P3.1
  E P3.2
  D4-D7 P4.0-P4.3
按键 添加指纹 P0.0
  删除指纹 P0.1
  确认 P0.2
步进电机 28BYJ-48 IN1 P5.0
  IN2 P5.1
  IN3 P5.2
  IN4 P5.3

四、项目代码设计

  • #include <reg52.h>
  • #include <stdio.h>
  • #include <intrins.h>
  • #include "lcd1602.h"
  • #define uchar unsigned char
  • #define uint unsigned int
  • // 指纹识别相关定义
  • #define FINGERPRINT_ADD 0x01 // 添加指纹命令
  • #define FINGERPRINT_DEL 0x02 // 删除指纹命令
  • #define FINGERPRINT_VERIFY 0x03 // 验证指纹命令
  • #define FINGERPRINT_SUCCESS 0x00 // 指纹验证成功返回值
  • #define FINGERPRINT_FAIL 0x01 // 指纹验证失败返回值
  • // 步进电机相关定义
  • sbit IN1 = P2^0;
  • sbit IN2 = P2^1;
  • sbit IN3 = P2^2;
  • sbit IN4 = P2^3;
  • // 按键相关定义
  • sbit Key1 = P1^0; // 录入指纹按键
  • sbit Key2 = P1^1; // 删除指纹按键
  • uchar comdata[19] = {0}; // 串口接收数据缓冲区
  • uchar fingerStatus = 0; // 指纹识别状态,0:未识别,1:已识别
  • uchar fingerprintIndex = 1; // 指纹索引
  • void delay(uint ms) {
  • while(ms--) {
  • uint xms = 120; // 延时大概1ms
  • while(xms--);
  • }
  • }
  • void uartInit() {
  • TMOD = 0x20; // 设置T1工作在方式2,8位定时/计数器
  • SCON = 0x50; // 设置串口工作在模式1,波特率9600
  • TH1 = 0xFD; // 波特率为9600时的T1重装值
  • TL1 = 0xFD;
  • TR1 = 1; // 启动T1
  • }
  • void uartSendByte(uchar dat) {
  • SBUF = dat; // 将数据送入UART发送缓冲区
  • while(!TI); // 等待UART发送完毕
  • TI = 0; // 清除发送完成标志位
  • }
  • void uartSendString(uchar *str) {
  • while(*str) {
  • uartSendByte(*str);
  • str++;
  • }
  • }
  • void uartInterrupt() interrupt 4 using 1 {
  • uchar c;
  • if (RI) { // 接收到了数据
  • RI = 0; // 清除接收中断标志位
  • c = SBUF; // 读取接收到的数据
  • if (c == 0xEF && comdata[0] != 0xEF) { // 接收到帧头
  • comdata[0] = 0xEF;
  • comdata[1] = c;
  • }
  • else if (comdata[1] == 0x01 && comdata[2] == 0xF5) { // 接收到返回数据长度
  • comdata[2] = c;
  • }
  • else if (comdata[2] != 0) { // 接收到数据
  • comdata[comdata[2]] = c;
  • if (comdata[2] == 18) { // 数据接收完毕
  • fingerStatus = comdata[9];
  • }
  • }
  • }
  • }
  • void fingerPrintAdd(uchar index) {
  • uchar temp[] = {0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x09, index, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x2C};
  • uchar checkSum = 0;
  • for (uint i = 2; i < 19; i++) {
  • checkSum += temp[i];
  • uartSendByte(temp[i]);
  • }
  • temp[19] = (~checkSum) + 1;
  • uartSendByte(temp[19]);
  • }
  • void fingerPrintDelete(uchar index) {
  • uchar temp[] = {0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x03, 0x0C, index, 0x00, 0x10};
  • uchar checkSum = 0;
  • for (uint i = 2; i < 13; i++) {
  • checkSum += temp[i];
  • uartSendByte(temp[i]);
  • }
  • temp[13] = (~checkSum) + 1;
  • uartSendByte(temp[13]);
  • }
  • void fingerPrintVerify() {
  • uchar temp[] = {0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x03, 0x03, 0x00, 0x07};
  • uchar checkSum = 0;
  • for (uint i = 2; i < 12; i++) {
  • checkSum += temp[i];
  • uartSendByte(temp[i]);
  • }
  • temp[12] = (~checkSum) + 1;
  • uartSendByte(temp[12]);
  • }
  • void stepperMotorRotate(uint steps, uchar direction) {
  • uint i;
  • for (i = 0; i < steps; i++) {
  • IN1 = 1;
  • delay(1);
  • IN1 = 0;
  • IN2 = 1;
  • delay(1);
  • IN2 = 0;
  • IN3 = 1;
  • delay(1);
  • IN3 = 0;
  • IN4 = 1;
  • delay(1);
  • IN4 = 0;
  • }
  • delay(1000);
  • if (direction == 1) { // 正转
  • for (i = 0; i < 512; i++) {
  • IN4 = 1;
  • delay(1);
  • IN4 = 0;
  • IN3 = 1;
  • delay(1);
  • IN3 = 0;
  • IN2 = 1;
  • delay(1);
  • IN2 = 0;
  • IN1 = 1;
  • delay(1);
  • IN1 = 0;
  • }
  • } else { // 反转
  • for (i = 0; i < 512; i++) {
  • IN1 = 1;
  • delay(1);
  • IN1 = 0;
  • IN2 = 1;
  • delay(1);
  • IN2 = 0;
  • IN3 = 1;
  • delay(1);
  • IN3 = 0;
  • IN4 = 1;
  • delay(1);
  • IN4 = 0;
  • }
  • }
  • }
  • void main() {
  • lcdInit();
  • uartInit();
  • EA = 1; // 开启总中断
  • ES = 1; // 开启串口中断
  • while (1) {
  • if (Key1 == 0) { // 录入指纹按键按下
  • fingerPrintAdd(fingerprintIndex);
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Add Finger");
  • delay(1000);
  • if (fingerStatus == FINGERPRINT_SUCCESS) { // 指纹录入成功
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Add Success");
  • delay(1000);
  • fingerprintIndex++;
  • } else { // 指纹录入失败
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Add Fail");
  • delay(1000);
  • }
  • while (Key1 == 0); // 等待按键释放
  • }
  • if (Key2 == 0) { // 删除指纹按键按下
  • fingerPrintDelete(fingerprintIndex - 1);
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Del Finger");
  • delay(1000);
  • if (fingerStatus == FINGERPRINT_SUCCESS) { // 指纹删除成功
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Del Success");
  • delay(1000);
  • if (fingerprintIndex > 1) {
  • fingerprintIndex--;
  • }
  • } else { // 指纹删除失败
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Del Fail");
  • delay(1000);
  • }
  • while (Key2 == 0); // 等待按键释放
  • }
  • fingerPrintVerify();
  • if (fingerStatus == FINGERPRINT_SUCCESS) { // 指纹验证成功
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Success");
  • delay(500);
  • stepperMotorRotate(64, 1); // 正转开锁
  • } else if (fingerStatus == FINGERPRINT_FAIL) { // 指纹验证失败
  • lcdClear();
  • lcdSetCursor(0, 0);
  • lcdPrint("Fail");
  • delay(500);
  • }
  • }
  • }

五、总结

项目基于STC89C52单片机设计了一款指纹锁,能够实现指纹的读取、录入和验证等功能。AS608光学指纹识别模块提供了高精度的指纹识别能力,而LCD1602显示屏和按键配合完成了人机交互的功能设计。门锁则通过28BYJ-48步进电机实现正反转模拟开锁的操作。该项目完全自主设计制造,具有较高的实用性和创新性。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门