硬件设计
链接:https://pan.baidu.com/s/1gVJJLnp6FxLZPikoezMXig
提取码:rrv9
1)开机:按下电源,电源指示灯点亮,液晶显示:“请先按键再刷指纹”,按下按键后,液晶显示:“请按指纹”,同时指纹模块绿灯亮起,可以进行指纹识别开锁功能。若指纹识别成功,继电器动作,LED指示灯亮起,开锁成功,人员可以进入,液晶显示:“指纹已找到,请进”; 若指纹识别不成功,继电器不动作,LED指示灯不亮,将不能开锁,人员不能进入,液晶显示:“没有搜索到指纹 请按任意键继续”。
2)管理员模式:按下按键进入管理员模式首先要输入6位密码,密码正确可以进入管理员模式,密码错误不能进入管理员模式,在管理员模式下可以完成录入指纹、删除指纹、应急开锁和修改密码的功能。进入录入指纹模式后,指纹模块绿灯亮起,将手指放到指纹头上,录入同一手指两次,此时液晶显示“指纹采集成功”。在删除指纹模式下,液晶显示“输入删去的指纹号”,输入后按确认键即可完成指定指纹的删除功能,同时液晶显示“删指纹号成功”。在非正常的情况下,如指纹模块不好用或者紧急情况下,可以使用紧急开锁功能。密码修改的功能是指可以修改并保存进入管理员的6位密码。
系统设计的总体框图如图1-3所示。
原理图:
PCB:
程序设计
#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 code admin[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;//输入密码的个数默认0
uchar key_flag=0;//进入手动密码标志
uchar i;
uchar code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
void 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);
.
文件仅供参考:
.