2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 基于51单片机的指纹考勤机密码锁系统

基于51单片机的指纹考勤机密码锁系统

时间:2021-03-05 22:41:42

相关推荐

基于51单片机的指纹考勤机密码锁系统

全套资源下载地址:/download/sheziqiong/86769799

全套资源下载地址:/download/sheziqiong/86769799

目录

第1章 概述 4

1.1 指纹识别技术的发展 4

1.2 指纹识别原理 5

1.3 系统设计目的及意义 6

1.4 工作流程 6

第2章 硬件介绍和设计 8

2.1 单片机及最小系统 8

2.1.1 STC89C52单片机介绍 8

2.1.2 外部晶振的设计 10

2.1.3 复位电路的设计 11

2.2 液晶显示模块 12

2.2.1 12864系列液晶的引脚功能 12

2.2.2 控制器接口说明 14

2.2.3 指令说明 14

2.2.4 12864引脚与单片机连接图 19

2.3 按键控制部分电路 20

2.4 指纹模块 22

2.4.1 指纹模块简介 22

2.4.2 指纹模块引脚接法 24

2.4.3 指纹模块命令 24

2.5 本章小结 26

第3章 系统软件的设计 28

3.1 系统程序工作分析 28

3.2 串口初始化 28

3.3 主程序流程图 29

3.3.1键盘管理程序设计流程 31

3.3.2 LCD显示模块程序设计流程 31

3.3.3 指纹模块的通信程序设计流程 32

3.4 Keil编程 33

3.5 本章小结 34

第4章 硬件调试 35

4.1 电路的焊接 35

4.2 程序的烧写 36

4.3 小灯、继电器的调试 37

4.4 液晶的调试 37

4.5 指纹模块、按键的调试 38

4.6 本章小结 38

结 论 39

参考文献 40

致 谢 41

1)开机:按下电源,电源指示灯点亮,液晶显示:“请先按键再刷指纹”,按下按键后,液晶显示:“请按指纹”,同时指纹模块绿灯亮起,可以进行指纹识别开锁功能。若指纹识别成功,继电器动作,LED指示灯亮起,开锁成功,人员可以进入,液晶显示:“指纹已找到,请进”; 若指纹识别不成功,继电器不动作,LED指示灯不亮,将不能开锁,人员不能进入,液晶显示:“没有搜索到指纹 请按任意键继续”。

2)管理员模式:按下按键进入管理员模式首先要输入6位密码,密码正确可以进入管理员模式,密码错误不能进入管理员模式,在管理员模式下可以完成录入指纹、删除指纹、应急开锁和修改密码的功能。进入录入指纹模式后,指纹模块绿灯亮起,将手指放到指纹头上,录入同一手指两次,此时液晶显示“指纹采集成功”。在删除指纹模式下,液晶显示“输入删去的指纹号”,输入后按确认键即可完成指定指纹的删除功能,同时液晶显示“删指纹号成功”。在非正常的情况下,如指纹模块不好用或者紧急情况下,可以使用紧急开锁功能。密码修改的功能是指可以修改并保存进入管理员的6位密码。

系统设计的总体框图如图1-3所示。

图1-3 系统总体框架图

2.4 指纹模块

2.4.1 指纹模块简介

本设计选择的指纹模块型号是ZFM60,指纹模块电路如下所示:

图2-7 指纹模块接口图

指纹模块里面主要是DSP芯片,型号为AS606,加上外面的CMOS芯片,CMOS芯片主要是对指纹进行“照相”,生成指纹特征,如下图所示就是一个指纹模板,录入两次这样的指纹特征就能生成一个指纹模板。

具体的工作过程是:扫描指纹(录入图像)、生成特征、合成模板(建立一个指纹库文件,成功录入一个指纹)。

图2-8 指纹模版

指纹模板就是“照一次相”,将指纹模块里面的CMOS芯片采集一次指纹信息,然后进行模糊处理生成0和1两种记录信息,存入指纹模块的FLASH芯片里面。

当切换到识别模式的时候,指纹模块就会先让CMOS芯片采集一次指纹,然后和FLASH芯片的数据进行对比。看是不是存在,如果存在就能返回是几号指纹。这样我们就能通过单片机或者电脑进行指纹识别与登记了。

具体指纹模块介绍如下:此指纹模块型号是:ZFM60,此模块上里面包含了:

1、光学头2、通信连接线3、DSP芯片4、稳压芯片5、FLASH芯片6、CMSO传感器等部件组成。

主要技术指标:

供电电压:DC 3.8~7.0V

背光颜色:绿色

亮灯方式:长亮/闪烁

供电电流:工作电流:<65mA

峰值电流:<95mA

指纹图像录入时间:<0.5秒

窗口面积:14.5×19.4mm

匹配方式:比对方式(1:1)

搜索方式(1:N)

特征文件:256字节

模板文件:512字节

存储容量:1000枚

安全等级:3级(从低到高:1、2、3、4、5)

认假率(FAR):<0.001%(安全等级为3时)

拒真率(FRR):<1.0%(安全等级为3时)

搜索时间:<1.0秒(1:500时,均值)

上位机接口:UART(TTL逻辑电平)

通讯波特率(UART):(9600×N)bps其中N=1~12(默认值N=6,即57600bps)

#include"reg52.h"#include"12864.h"#include"eeprom.h"#include"matrixkey.h"#include"AT24CXX.h"#include"finger.h"uchar code table1[]="A:签到 B:添加 ";uchar code table2[]="C:清空 D:上课 ";uchar code table3[]=" *查询缺勤人员 ";uchar code table4[]=" #查询迟到人员 ";uchar code table5[]="请输入删去密码: ";uchar code table6[]=" 开始签到 ";uchar code table7[]=" 请按指纹签到 ";uchar code table8[]="";uchar code table9[]="按D: 开始上课 ";uchar code table10[]="请输入密码:";uchar code table11[]=" 签到成功 ";uchar code table12[]="请按任意按键继续";uchar code table13[]=" 编号为:";uchar code table14[]=" 请按手指 ";uchar code table15[]=" 请再按一次 ";uchar code table16[]=" 采集指纹成功 ";uchar code table17[]="输入删去的指纹号";uchar code table18[]="删去指纹库成功 ";uchar code table19[]="删去指纹库失败 ";uchar code table20[]=" 请输入新密码 ";uchar code table21[]="请再次输入新密码";uchar code table22[]=" 密码修改成功 ";uchar code table23[]=" 两次密码不一样";uchar code table24[]=" 输入密码错误 ";uchar code table25[]=" 还有 机会 ";uchar code table26[]=" 该指纹已存储 ";uchar code table27[]=" 采集指纹失败 ";uchar code table28[]="确定删去指纹库?";uchar code table29[]="按D: 本节课结束";uchar code table30[]="当前缺勤人";uchar code table31[]="当前迟到人";uchar code digital[15]={0x90,0x92,0x94,0x96,0x88,0x8a,0x8c,0x8e,0x98,0x9a,0x9c,0x9e};uchar xdata table_qiandao[100];uchar queqing=0;//缺勤人数uchar zz;uchar chidao=0;//迟到人数uchar codeadmin[6]={1,3,1,4,2,0};//管理员的固定密码uchar code init_code[6]={0,0,0,0,0,0};//上电第一次一般的初始化密码uchar now_code[6]={0,0,0,0,0,0};//当前存储器中存储的密码uchar user[6]={0,0,0,0,0,0};//用户输入的密码uchar user2[6]={0,0,0,0,0,0};//输入第二次修改的密码sbit relay=P3^7;//开锁继电器sbit wake=P3^6;//检测手指按压,有手指按下就是高电平uchar jishu=0;uchar err_user=3;//用户三次输入错误密码uchar err_admin=3;//管理员三次输入错误密码uchar num;//存储矩阵键盘转换的对应按键值uchar number=0;//输入密码的个数默认0uchar key_flag=0;//进入手动密码标志uchar i;uchar code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1void init_dispay(void)//初始化界面{PutStr(0,0,table1);PutStr(1,0,table2);PutStr(2,0,table3);PutStr(3,0,table4); }void admin_dispay(void)//管理员界面{PutStr(0,0,table6);PutStr(1,0,table7);PutStr(2,0,table8);PutStr(3,0,table9);}void init_shuju(void){uchar i;for(i=0;i<100;i++){table_qiandao[i]=0x00;}}void que_renshu(void){ queqing=0;//缺勤人数// WriteCommand(0x80+2);// WriteData(jishu/10+0x30);// WriteData(jishu%10+0x30);for(i=0;i<jishu;i++){if(table_qiandao[i]==0x00){ queqing++;WriteCommand(digital[queqing-1]);WriteData((i+1)/10+0x30);WriteData((i+1)%10+0x30); }}}void chidao_renshu(void){ queqing=0;//缺勤人数// WriteCommand(0x80+2);// WriteData(jishu/10+0x30);// WriteData(jishu%10+0x30);for(i=0;i<jishu;i++){if(table_qiandao[i]>=2){ queqing++;WriteCommand(digital[queqing-1]);WriteData((i+1)/10+0x30);WriteData((i+1)%10+0x30); }}}void key(void){ num=keynum();if((num==12)&&(key_flag==0))//查看缺勤人数{LcmClearTXT();//清屏PutStr(0,0,table30);que_renshu();WriteCommand(0x80+6);WriteData(queqing/10+0x30);WriteData(queqing%10+0x30); while((keynum()>=16));init_dispay(); }if((num==14)&&(key_flag==0))//查看迟到人数{LcmClearTXT();//清屏PutStr(0,0,table31);chidao_renshu();WriteCommand(0x80+6);WriteData(queqing/10+0x30);WriteData(queqing%10+0x30);while((keynum()>=16));init_dispay(); }if((num==11)&&(key_flag==0))//如果按下C按键进{key_flag=1;//只显示“请输入密码开锁:“LcmClearTXT();//清屏PutStr(0,0,table28);PutStr(1,0,table5); }if((num==7)&&(key_flag==0))//如果按下B按键进入添加指纹{LcmClearTXT();//清屏PutStr(1,0,table14);//显示请按指纹if(regist(0)==1)//如果第一次按手指成功{PutStr(1,0,table15);//显示请再按一次Delay(10);//延时一会if(regist(1)==1)//两次采集手指成功{PutStr(1,0,table16);//采集指纹成功PutStr(2,0,table13);//指纹编号:WriteCommand(0x88+5);//指定第三行显示位置WriteData(' ');id=id+1;WriteData(id/100+0x30);WriteData(id%100/10+0x30);WriteData(id%10+0x30);SectorErase(0x2200);jishu=id%256;byte_write(0x2200, id%256);}else PutStr(1,0,table27);//采集指纹失败 }else if(regist(0)==2)//已经注册过指纹{PutStr(1,0,table26);//指纹已经存储}PutStr(3,0,table12);//请按任意键退出while(keynum()>=16); init_dispay();//管理员设置界面key_flag=0;num=0xff;}if((num==3)&&(key_flag==0))//如果按下A按键管理员模式{key_flag=2;//进入输入管理员密码界面//只显示“请输入密码:“LcmClearTXT();//清屏PutStr(1,0,table10);}if((key_flag==1)&&(num!=0xff))//非管理员模式下输入密码{num=coding(num);//转换成可以识别的if((number<6)&&(num<10)){ user[number]=num;//用户输入的密码进行记忆WriteCommand(0x88+number);//指定第三行显示位置WriteData('*');//WriteData(num+0x30);//明码显示number++;}if((num=='B')&&(number>0))//密码删除按键{ number--;WriteCommand(0x88+number);//指定第三行显示位置WriteData(' ');}if(number==6)//按下D键确定按键并且输入六位密码之后{ LcmClearTXT();//清屏number=0;key_flag=0;//如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面if((user[0]==now_code[0])&&(user[1]==now_code[1])&&(user[2]==now_code[2])&&(user[3]==now_code[3])&&(user[4]==now_code[4])&&(user[5]==now_code[5])){ if(cancel(0x63)==1){PutStr(0,0,table18);//输入删去的指纹号成功SectorErase(0x2200);byte_write(0x2200, 0x00);}else{PutStr(0,0,table19);//输入删去的指纹号失败}Delay(80);}else//密码错误{ PutStr(1,0,table24);//显示输入密码错误}PutStr(3,0,table12);while((keynum()>=16)&&(err_user!=0));init_dispay();//初始化界面 }}if((key_flag==2)&&(num!=0xff))//签到模式下输入数字按键{num=coding(num);//转换成可以识别的if((number<6)&&(num<10)){ user[number]=num;//用户输入的密码进行记忆WriteCommand(0x88+number);//指定第三行显示位置WriteData('*');// WriteData(num+0x30);//明码显示number++;}if(number==6)//输入六位以后进行密码校验{ //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面if((user[0]==admin[0])&&(user[1]==admin[1])&&(user[2]==admin[2])&&(user[3]==admin[3])&&(user[4]==admin[4])&&(user[5]==admin[5])){key_flag=55;admin_dispay();//进入签到页面err_admin=3;num=0XFF;init_shuju(); }else//管理员密码错误{ PutStr(1,0,table24);//显示输入密码错误PutStr(3,0,table12); while((keynum()>=16)&&(err_admin!=0));init_dispay();//初始化界面number=0;key_flag=0; }}if((num=='B')&&(number>0)){ number--;WriteCommand(0x88+number);//指定第三行显示位置WriteData(' ');}}if(key_flag==55)//进入签到指纹巡查{num=coding(num);//转换成可以识别的if(num=='D')//按下就进入开始上课{key_flag=56;PutStr(3,0,table29);}if(wake==1)//如果有手指按下{if(check()==1)//进行指纹匹配{ err_admin=3;err_user=3;LcmClearTXT();//清屏PutStr(1,0,table11);PutStr(2,0,table13);WriteCommand(0x88+5);//指定第三行显示位置WriteData(' ');zz=id%256;table_qiandao[zz]=0x01;id++;WriteData(id/100+0x30);WriteData(id%100/10+0x30);WriteData(id%10+0x30);// WriteData(table_qiandao[zz]%100/10+0x30);// WriteData(table_qiandao[zz]%10+0x30); relay=0;Delay(80);relay=1;Delay(20);PutStr(3,0,table12);number=0;key_flag=55;admin_dispay();//回到初始界面num=0xff;}} }if(key_flag==56)//迟到的{num=coding(num);//转换成可以识别的if(num=='D')//按下就进入开始上课{key_flag=0;number=0;init_dispay();}if(wake==1)//如果有手指按下{if(check()==1)//进行指纹匹配{ LcmClearTXT();//清屏PutStr(1,0,table11);PutStr(2,0,table13);WriteCommand(0x88+5);//指定第三行显示位置WriteData(' ');zz=id%256;table_qiandao[zz]=table_qiandao[zz]+0x02;id++;WriteData(id/100+0x30);WriteData(id%100/10+0x30);WriteData(id%10+0x30);// WriteData(table_qiandao[zz]%100/10+0x30);// WriteData(table_qiandao[zz]%10+0x30); relay=0;Delay(80);relay=1;Delay(20);PutStr(3,0,table12);number=0;key_flag=56;admin_dispay();//回到初始界面PutStr(3,0,table29);num=0xff;}} }}void main(){ for(i=0;i<6;i++)//读取存储器中的密码{now_code[i]=read_add(20+i);Delay(5);}for(i=0;i<6;i++){if(now_code[i]>9){i=10;break;}}if(i>9)//设置初始化密码{for(i=0;i<6;i++){now_code[i]=init_code[i];Delay(5);}}LcmInit();//初始化12864jishu=byte_read(0x2200);// WriteCommand(0x88);// WriteData(jishu/10+0x30);// WriteData(jishu%10+0x30); // Delay(30);// Delay(50);init_dispay();//进入初始化显示界面UART_Init();//初始化串口9600init_shuju();while(1){ key();}}

全套资源下载地址:/download/sheziqiong/86769799

全套资源下载地址:/download/sheziqiong/86769799

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。