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

一、前言

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

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

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

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

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

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

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

二、项目整体设计思路

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

四、项目代码设计

cpp 复制代码
#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步进电机实现正反转模拟开锁的操作。该项目完全自主设计制造,具有较高的实用性和创新性。

相关推荐
2401_895521347 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare7 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL7 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本9 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole12 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉12 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠13 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet13 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明13 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff13 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法