基于单片机的指纹门禁设计

news/2024/5/14 8:22:32/文章来源:https://blog.csdn.net/qq_63964231/article/details/127839189

 功能:

研究内容:本课题以单片机为核心采用C语言来开发一指纹电子密码锁。系统拟在Altium Designer9开发平台上设计原理图,并绘制PCB并制成单片机开发板,然后根据原理图将相关元器件焊接到开发板上。软件部分在Keil uVision4开发平台上进行相关代码的编写和调试。然后利用串口助手工具将代码下载到开发板进行运行,观察硬件各模块是否可以正常运行。以及测试结果是否能够满足需求,便于及时调整设计。 

课题的主要任务是设计出一个可以录入指纹,并可对录入指纹进行匹配比较,如果正确即可开锁。

  1. 设置有管理员密码,管理员密码内置不可修改,密码具有掉电存储功能。
  2. 输入管理员密码后进入指纹录制模式,录入自己的指纹
  3. 录制成功后,支持指纹开锁,指纹匹配成功后,继电器吸合表示开门,并且语音提示开锁成功
  4. 当遇到震动时,语音提示,请勿强行开锁,并且可以通过sim模块发送报警短信
  5. 单片机内置用户密码,匹配成功后可以通过app使用密码开锁。

重点难点:指纹的录制与识别,语音提示,并且具有报警系统,当遇到震动时时可以发出语音报警和sim短信报警,硬件元器件较多使用了大量串口,pcb排版要注意,避免各个部件之间的干扰。

电路原理图:

 资料内容包括:

 

 

部分程序:

#include <intrins.h>
#include <INTRINS.H> 
#include"lcd1602.h"
#include "string.h" 

sbit led= P0^7;
sbit buz= P2^0;
sbit j1= P2^1;
sbit shock= P2^2;


sbit in_1 = P1^4; //°´¼ü
sbit in_2 = P1^5;
sbit in_3 = P1^6;
sbit in_4 = P1^7;

sbit out_1 = P3^7; //°´¼ü
sbit out_2 = P3^6;
sbit out_3 = P3^5;
sbit out_4 = P3^4;

unsigned char password[6] = {1,2,3,4,5,6};
unsigned char password2[6] = {1,2,3,4,5,6};
unsigned char runCount=0;
unsigned char R_flag=0;

unsigned char number = 0;
unsigned char recSign = 0;//½ÓÊÕÊý¾Ý±êÖ¾
unsigned char rec[16]; //½ÓÊÕÊý¾Ý»º´æ
unsigned char recIndex = 0;//½ÓÊÕÊý¾Ý
unsigned char recTemp = 0;//½ÓÊÕÊý¾Ý
char zf[3];
char rec_num = 0; //½ÓÊÕÊý¾Ý¸öÊý

uchar sign = 0;


#define Max_User 10
#define error 2
#define S2RI 0x01    //´®¿Ú2½ÓÊÕÖжÏÇëÇó±ê־λ
#define S2TI 0x02    //´®¿Ú2·¢ËÍÖжÏÇëÇó±ê־λ


unsigned char num_4x4=0;
char KeyVal = 0;


int count = 0; //¶¨Ê±Æ÷±äÁ¿


#define Max_User 10
#define error 2

char user_num = 0;   
unsigned char     SaveNumber=0,searchnum=0;
unsigned int      SearchNumber=0;        
unsigned int     clk0=0;
unsigned int     rec_number = 0; //½ÓÊÕÊý¾Ý
unsigned char str[3]={0,'\0','\0'};


bit modeflag=0,clearallflag=0,changeflag=0;//ĬÈÏΪʶ±ðģʽ£¬Èç¹ûΪ1Ϊ¼ÈëÖ¸ÎÆģʽ,ÿ¼ÈëÒ»´ÎSaveNumber++

//³£ÓÃÖ¸ÁÒå/

//Verify  Password   £ºÑéÖ¤É豸ÎÕÊÖ¿ÚÁî
unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};     //»ØËÍ12¸ö

//ÉèÖÃÉ豸ÎÕÊÖ¿ÚÁî
unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};     //»ØËÍ12¸ö

//GetImage           £ºÌ½²âÊÖÖ¸²¢´Ó´«¸ÐÆ÷É϶ÁÈëͼÏñ
unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05};    //»ØËÍ12¸ö

//Gen Templet1        £º¸ù¾ÝԭʼͼÏñÉú³ÉÖ¸ÎÆÌØÕ÷1
unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};    //»ØËÍ12¸ö

//Gen Templet2        £º¸ù¾ÝԭʼͼÏñÉú³ÉÖ¸ÎÆÌØÕ÷2
unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //»ØËÍ12¸ö    

    
//Search Finger      £ºÒÔCharBufferA»òCharBufferBÖеÄÌØÕ÷ÎļþËÑË÷Õû¸ö»ò²¿·ÖÖ¸ÎÆ¿â
unsigned char code SEAT[18]={17,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,8, 4,1,0,0,    0,0x65,  0x00,0x73};    //»ØËÍ12¸ö


//Merge Templet      ;½«CharBufferAÓëCharBufferBÖеÄÌØÕ÷ÎļþºÏ²¢Éú³ÉÄ£°å£¬½á¹û´æÓÚModelBuffer¡£
unsigned char code MERG[14]={12,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,3,5 , 0x00,0x09};//»ØËÍ12¸ö    

//Store Templet      £º½«ModelBufferÖеÄÎļþ´¢´æµ½flashÖ¸ÎÆ¿âÖÐ
unsigned char code STOR[16]={15,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,6,6,2,     0x00,0x00,     0x00,0x0f}; //»ØËÍ12¸ö

//DEL one templet
unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,7,  0x0c,    0x00,0x00, 0,1, 0x00,0x15};

//DEL templet      ;Çå¿ÕÖ¸ÎÆ¿â
unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,  0x0d,0x00,0x11};

//³£ÓÃÖ¸ÁÒå-------½áÊø///

                                                      
//ºê¶¨Òå
#define FALSE 0
#define TURE  1

//״̬¶¨Òå±í
#define on        1
#define off       0

#define MAX_NUMBER    63 
#define _Nop()  _nop_()

unsigned char           FifoNumber=0; 
unsigned char   FIFO[MAX_NUMBER+1]={0};


//ºê¶¨Òå------------½áÊø

/*********1ºÁÃëÑÓʱ³ÌÐò**********/
void delay1ms(unsigned int t)
{
    unsigned int i,j;
    for(i=0;i<t;i++)
       for(j=0;j<120*6;j++)
       ;
}
void delay10ms(unsigned int c)   //Îó²î 0us
{
    unsigned char a, b;
    //--cÒѾ­ÔÚ´«µÝ¹ýÀ´µÄʱºòÒѾ­¸³ÖµÁË£¬ËùÒÔÔÚforÓï¾äµÚÒ»¾ä¾Í²»Óø³ÖµÁË--//
    for (;c>0;c--)
    {
        for (b=38*6;b>0;b--)
        {
            for (a=130;a>0;a--);
        }          
    }       
}
/********************************************************************
* Ãû³Æ : delay()
* ¹¦ÄÜ : ÑÓʱ,ÑÓʱʱ¼äΪ 100us * t¡£ÕâÊÇͨ¹ýÈí¼þÑÓʱ£¬ÓÐÒ»¶¨Îó²î¡£
* ÊäÈë : t
* Êä³ö : ÎÞ
***********************************************************************/
void delay(unsigned int t)
{
    unsigned int i,j;
    for(i=0; i<t;  i++)
    for(j=0; j<10; j++);
}

void beep()
{
    buz=0;
    delay10ms(30);
    buz=1;
    delay10ms(30);
}


void KeyDown(void)  //ʵÏÖ¾ØÕó¼üÅÌ¡£·µ»ØֵΪ£¬¸÷°´¼üµÄ¼üÖµ£¬´Ë¼üÖµÓÉÓû§×Ô¼º¶¨Òå¡£
{
    KeyVal = 99;
    num_4x4 = 99;
    out_1 = 0;
    out_2 = 1;
    out_3 = 1;
    out_4 = 1;
    delay10ms(2);
    if(in_1==0)
    {
         KeyVal = 0;
    }
    else if(in_2==0)
    {
         KeyVal = 1;
    }
    else if(in_3==0)
    {
         KeyVal = 2;
    }
    else if(in_4==0)
    {
         KeyVal = 3;
    }
    delay10ms(2);
    out_1 = 1;
    out_2 = 0;
    out_3 = 1;
    out_4 = 1;
    delay10ms(2);
    if(in_1==0)
    {
         KeyVal = 4;
    }
    else if(in_2==0)
    {
         KeyVal = 5;
    }
    else if(in_3==0)
    {
         KeyVal = 6;
    }
    else if(in_4==0)
    {
         KeyVal = 7;
    }
    delay10ms(2);
    out_1 = 1;
    out_2 = 1;
    out_3 = 0;
    out_4 = 1;
    delay10ms(2);
    if(in_1==0)
    {
         KeyVal = 8;
    }
    else if(in_2==0)
    {
         KeyVal = 9;
    }
    else if(in_3==0)
    {
         KeyVal = 10;
    }
    else if(in_4==0)
    {
         KeyVal = 11;
    }
    delay10ms(2);
    out_1 = 1;
    out_2 = 1;
    out_3 = 1;
    out_4 = 0;
    delay10ms(2);
    if(in_1==0)
    {
         KeyVal = 12;
    }
    else if(in_2==0)
    {
         KeyVal = 13;
    }
    else if(in_3==0)
    {
         KeyVal = 14;
    }
    else if(in_4==0)
    {
         KeyVal = 15;
    }
    
    if(KeyVal!=99)
    {
        beep();
        switch(KeyVal)
        {    
            case 0:     num_4x4 = 1;
                break;
            case 1:     num_4x4 = 4;
                break;
            case 2:     num_4x4 = 7;
                break;
            case 3:     num_4x4 = 10;
                break;
            case 4:     num_4x4 = 2;
                break;
            case 5:     num_4x4 = 5;    
                break;             
            case 6:     num_4x4 = 8;
                break;
            case 7:     num_4x4 = 0;
                break;
            case 8:     num_4x4 = 3;
                break;
            case 9:     num_4x4 = 6;
                break;          
            case 10: num_4x4 = 9;
                break;
            case 11: num_4x4 = 11;
                break;
            case 12: num_4x4 = 12;
                break;
            case 13: num_4x4 = 13;
                break;
            case 14: num_4x4 = 14;
                break;
            case 15: num_4x4 = 15;
                break;
        }
    }
//    Lcd1602_Com(0x80);
//    Lcd1602_Data('0'+num_4x4%100/10);
//    Lcd1602_Data('0'+num_4x4%10);
    delay10ms(50);        
}

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_224039.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

餐饮美食网页设计(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

目标检测算法——自动驾驶开源数据集汇总2(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、Highway Driving 二、Mapillary Vistas 三、Cityscapes 四、CamVid >>>一起交流&#xff01;互相学习&#xff01;共同进步&#xff01;<<< 近期&#xff0c;小海带在空闲之余…

【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现

EEPROM读写控制模块实现一、模块功能分析二、输入/输出信号三、EEPROM读写控制模块状态机四、EEPROM读写控制模块实现五、仿真测试写在前面&#xff1a; FPGA实现IIC协议读写EEPROM相关文章&#xff1a; IIC通信协议 【FPGA】FPGA实现IIC协议读写EEPROM&#xff08;一&#xff…

Kafka消费者之相关参数及分区分配再平衡

一、消费者重要参数 深刻的理解这些参数有利于大家在面对自己的项目场景上对配置文件有更好的把握&#xff01; 参数名称描述bootstrap.servers向 Kafka 集群建立初始连接用到的 host/port 列表。key.deserializer 和value.deserializer指定接收消息的 key 和 value 的反序列…

Spring--基于注解管理bean

基于注解管理bean 实验一&#xff1a;标记与扫描 注解 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测到注解标记 的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作。 本质…

【ASM】字节码操作 工具类与常用类 asm-utils 与 asm-commons

1.概述 本章节主要是对 ASM中的 工具类与常用类 ,包asm-utils 与 asm-commons 两个包中的一些类进行讲解的介绍。 2. asm-util 在asm-util.jar当中,主要介绍CheckClassAdapter和TraceClassVisitor类。在TraceClassVisitor类当中,会涉及到Printer、ASMifier 和Textifier类。…

Vue中 引入使用 element-resize-detector 监听 Dom 元素 宽度、高度 变化

1. 前言 很多做pc端平台的小伙伴都遇到过这样一个问题&#xff1a;在做侧边栏菜单时会有一个收缩和展开的一个功能&#xff0c;在伸缩的过程中右边的页面的宽度就会随之改变。我上网查了查 &#xff0c;也动手试了试 window.onresize ()>{}。却不尽人意&#xff0c;因为它…

进程管理命令 动态监控进程 rpm yum

学习视频:074_韩顺平Linux_服务管理(2)_哔哩哔哩_bilibili 目录 进程管理命令基本介绍 PS命令 显示系统执行的进程 终止进程kill和killall 查看进程树pstree 服务管理 服务管理 打开或者关闭指定端口 动态监控进程 监控网络状态 …

数字IC手撕代码-XX公司笔试真题(脉冲密度调制)

前言&#xff1a; 本专栏旨在记录高频笔面试手撕代码题&#xff0c;以备数字前端秋招&#xff0c;本专栏所有文章提供原理分析、代码及波形&#xff0c;所有代码均经过本人验证。 目录如下&#xff1a; 1.数字IC手撕代码-分频器&#xff08;任意偶数分频&#xff09; 2.数字I…

nginx之https加密网站

目录 一、密钥算法 二、SSL虚拟主机 一、密钥算法 常见密钥算法&#xff1a; 对称加密&#xff1a;AES、DES 非对称加密&#xff1a;RSA、DSA 【注】对称加密的加密和解密使用的是同一把钥匙&#xff0c;非对称加密的加密和解密使用的不是一把钥匙&#xff0c;在对网…

0093 二分查找算法,分治算法

/* * 二分查找算法 * 前提&#xff1a;数组必须有序 * 1.确定该数组的中间值下标 mid(leftright)/2 * 2.让需要查找的数target和arr[mid]比较 * * 非递归算法 * 递归算法 */ public class BinarySearch_ { public static void main(String[] args) { int[…

【Python】常量和变量类型

目录 1.常量和表达式 2. 变量和类型 2.1 变量是什么 2.2 变量的语法 2.3 变量的类型 2.4 动态类型特性 1.常量和表达式 我们可以把Python当成一个计算器&#xff0c;来进行一些算式运算&#xff0c;如 print(1 2 - 1) print(1 2 * 2) print(1 2 / 2) 注&#xff1a;在…

pta-sql补题(2)

目录​​​​​​​ 插入insert&#xff1a; 两种语法形式&#xff1a; 插入记录&#xff08;一&#xff09; 表结构: 表样例 输出 插入记录&#xff08;二&#xff09; 表结构: 表样例 结果判定: 更新update 语法 更新记录&#xff08;一&#xff09; 表结构: …

Python——正则表达式的应用

文章目录前言正则表达式方法re.search方法group方法re.match方法re.findall方法re.finditer方法re.split方法re.sub方法正则表达式的应用前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 正则表达式是字符串处理的有力工具和技术。 使用正在表达式的目的…

Hackthebox系列 Starting point Tier0 Meow记录

免责声明&#xff1a;本教程仅限学术讨论使用&#xff0c;请勿作用于非法用途&#xff01;&#xff01;&#xff01;如有用于非法用途&#xff0c;本人概不负责。 目录题目来源题目TASK 1TASK 2TASK 3TASK 4TASK 5TASK 6NMAP端口扫描TASK 7Telnet访问TASK 8TASK 9参考题目来源 …

【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

一.RPC框架必会的基本知识 1.1 什么是RPC&#xff1f; RPC&#xff08;Remote Procedure Call ——远程过程调用&#xff09;&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络的技术。 一次完整的RPC同步调用流程&#xff1a; 服务…

rust编程语言(chapter 1)

目录 1. rust安装 2. Hello Rust 3. Cargo包管理器 3.1 cargo简介 3.2 cargo创建项目 3.3 构建和运行项目 3.4 debug和release版本构建 1. rust安装 rust提供了一个命令行的工具rustup&#xff0c;可以用来管理和安装rust的版本以及相关的工具集。 那么首先&#xff0c…

python游戏库pygame经典教程

目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 2.设置窗口主窗口 3.填充主窗口背景&#xff0c;参数值RGB 4.设置窗口标题 5.更新屏幕内容 6.pygame.display其他方…

java家政服务中心网站mysql

目 录 第一章 绪论 5 1.1 课题开发背景 5 1.2 课题研究意义 5 1.3 本课题主要工作 5 第二章 相关技术介绍 6 2.1 JSP技术 6 2.2 MyEclipse 6 2.3 MySQL数据库 7 2.4 J2EE 技术 8 2.5 B/S架构 9 第三章 系统分析 12 3.1 系统可行性分…

Python 考试练习题 2

一、选择题 1、下列是 python 合法标识符的是&#xff08; B&#xff09;。 A. 2variable B. variable2 C. $anothervar D. if 2、在 python 中字符串的表示方式是&#xff08;D &#xff09;。 A.采用单引号包裹 B.采用双引号包裹 C.采用三重单引号包裹 D.ABC 都是 3、设有…