基于51单片机的指纹考勤系统密码锁门禁原理图PCB程序设计

硬件设计

链接: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);			
					

.
文件仅供参考:

.

  • 4
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值