本次分享的是一款基于51单片机的指纹识别电子密码锁系统,该系统以STC89C52单片机作为模块核心,通过串口通信控制指纹模块AS608实现录取指纹并存储指纹数据,并通过LCD12864液晶显示屏比对流程及效果,辅以直流继电器以发光二极管模拟开锁动作。
2.硬件设计(1)整体硬件框图
硬件电路主要包括51单片机最小系统、指纹模块AS608电路、4*4矩阵键盘电路、LCD12864显示屏电路及系统电源。
(2)AS608指纹模块电路
AS608指纹模块采用串口或者USB进行数据通讯。本例程采用串口通讯的方式实现对指纹模块的控制。单片机可通过厂家提供的控制指令集对指纹模块做相应的操作,详细可以参考AS608指纹模块用户手册。
(3)其他电路
由于其他硬件电路都是比较常用,就不一一介绍了。
3.软件设计软件流程:首先对各个模块进行初始化,检测有无按键按下,如果按下,则判断是哪一个按键,并作出判断,并调用相应的按键处理函数。
主程序主要由液晶显示、串口通讯程序和按键程序组成。 (1)主函数
void main() { //
PSB=0;
UART_Init(); //串口初始化
x24c02_init(); //24C02初始化
LcmInit(); //LCD12864初始化
LcmClearTXT(); //LCD12864清屏
while(1) {
fan();
delay(100);
}
(2)指纹模块处理程序(部分代码)
因为源码比较大,我就不想全都贴出来了,如果需要详细了解源码可下载源码查看(下载链接在文章最后)
#define buffer1ID 0x01
#define buffer2ID 0x02
#define queren 0x88 //确认
#define tuichu 0x85 //退出
#define shanchu 0x82 //删除 #define User 1 //用户
void fan(); //主界面刷指纹管理员函数
sbit B0=B^0;
sbit B7=B^7;
sbit k2=P3^7; //指纹模块
sbit jidianqi=P3^6; //继电器
extern unsigned char times[];
uchar Member=0,sec;
uchar code buffer[User][6]= { {"000000"} };
uchar dz[4];
uchar time[4];
uchar mima[6];
uchar mimag[6];
uchar mimaID[6]={1,2,3,4,5,6};
uchar Address1=20,tempx=20;
uchar Address2=20;
uchar data K;
uchar data Key;
uint PageID;
uchar data querenma=11;
uchar sum[2];
int summaf,summas;
uchar xdata UserPassword[7]={0};//密码
uchar xdata DSY_BUFFER[16] ={0};//缓存
void Red_Init(void); //检测脉冲宽度
unsigned char check(void);
unsigned char redchange(unsigned char rednum);
void delayms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************************************** * 名称 : Chack(uchar User_Number) * 功能 : 单一用户密码检测 * 输入 : User_Number * 输出 : 密码正确与错误,错误返回0,正确返回1 ********************************************************************/
uchar Chack(uchar User_Number)
{
uchar flag, i,temp[6],Address;
Address=User_Number*10;
for(i=0;i<6;i++)
{
temp[i]=x24c02_read(Address);
delayms(10);
Address++;
}
for(i=0;i<6;i++)
{ if(temp[i]==UserPassword[i])
flag=1;
else flag=0;
}
return flag;
}
/******************************************************************** * 名称 : PassWord_Chack() * 功能 : 所有用户密码检测 * 输入 : 无 * 输出 : 密码正确与错误,错误返回0,正确返回1 ********************************************************************/
uchar PassWord_Chack()
{
uchar i=0;
while(i>8)+sum[0]; //
PageID=ID1;
PageID=(ID1>>8)+ID2;
}
void shuazhiwen()
{ uchar IDs1,IDs2,IDs3;
LcmClearTXT();
PutStr(1,1,"请按手指开锁");
SFG_identify();
while(querenma==2)
SFG_identify();
if(querenma==0)
{
LcmClearTXT();
PutStr(1,2,"门已打开");
IDs1=PageID/100;
IDs2=PageID/10%10;
IDs3=PageID%10;
PutStr(2,1,"编号为:");
WriteCommand(0x8D); //指定第三行显示位置
WriteData(0x30+IDs1);
WriteData(0x30+IDs2);
WriteData(0x30+IDs3);
jidianqi=0;
delay(2500);
jidianqi=1;
}
else if(querenma==9)
{
LcmClearTXT();
PutStr(1,1,"没搜索到指纹");
PutStr(2,1,"请重新按手指");
} else
{
LcmClearTXT();
PutStr(1,1,"接收包出错");
}
delay(2000); //
while(Keycan()==0);
}
void addfinger() //录入用户指纹
{ uchar IDa1,IDa2,IDa3; LcmClearTXT(); PutStr(1,2,"请按手指");
SFG_getimage();
while(querenma!=0) SFG_getimage();
SFG_genchar(buffer1ID); UART_Init();
SFG_fastsearch(buffer1ID);
while(querenma==1) SFG_fastsearch(buffer1ID);
if(querenma==0) { LcmClearTXT(); PutStr(1,1,"该指纹已存储"); PutStr(3,0," 按任意键继续");
while(Keycan()==0); } else if(querenma==9) { LcmClearTXT(); PutStr(1,1,"请再次按手指"); SFG_enroll(); while(querenma==2) SFG_enroll(); LcmClearTXT(); if(querenma==0) { IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10; PutStr(1,1,"指纹采集成功"); PutStr(2,1,"编号为:"); WriteCommand(0x8D); WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3); } else if(querenma!=0) { PutStr(1,1,"指纹采集失败"); PutStr(2,1,"请重新操作"); } PutStr(3,0," 按任意键继续"); while(Keycan()==0); } LcmClearTXT(); } void deletfinger() //删除用户指纹 { uchar i,j=0; LcmClearTXT(); PutStr(1,0,"输入删去的指纹号"); for(i=0;i<5;i++)dz[i]=0; Key=Keycan(); while(Key!=queren) { Key=Keycan(); KeyDeal(Key); delay(30); //按键有抖动@@@ if(Key==0)K=10; if((K>=0)&&(K<=9)) { dz[j]=K; if(j<3) { WriteCommand(0x88+j); //指定第三行显示位置 WriteData(0x30+dz[j]); } ++j; if(j==4) j=3; //@@#yinhuang } //显示LCD12864并行显示 if(K==34) //按了删除键 { if(j==0) { WriteCommand(0x88); //指定第三行显示位置 WriteData(0x20); } else { --j; WriteCommand(0x88+j); //指定第三行显示位置 WriteData(0x20); } } } if(j>=2) PageID=dz[2]+dz[1]*10+dz[0]*100; if(j==1) PageID=dz[1]+dz[0]*10; if(j==0) PageID=dz[0]; SFG_deletchar(PageID); if(querenma==1) { LcmClearTXT(); PutStr(1,1,"删去指纹号成功!"); } else { LcmClearTXT(); PutStr(1,2,"删去指纹号失败!"); } PutStr(2,0," 按任意键继续"); while(Keycan()==0); LcmClearTXT(); } void gaimima() //修改用户密码 { uchar i,j=0,mima1[4],mima2[4]; uchar k,temp; LcmClearTXT(); PutStr(1,1,"请输入新密码"); for(i=0;i<6;i++)mima1[i]=0; Key=Keycan(); while(Key!=queren) { Key=Keycan(); KeyDeal(Key); delay(30); if(Key==0)K=10; if((K>=0)&&(K<=9)) { mima1[j]=K; if(j<6) { WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x0f); } ++j; if(j==7) j=6; //@@#yinhuang } //显示LCD12864并行显示 if(K==34) //按了删除键 { if(j==0) { WriteCommand(0x89); //指定第三行显示位置 WriteData(0x20); } else { --j; WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x40); } } } LcmClearTXT(); LcmClearTXT(); j=0; PutStr(1,0,"请再次输入新密码"); for(i=0;i<6;i++)mima2[i]=0; Key=Keycan(); while(Key!=queren) { Key=Keycan(); KeyDeal(Key); delay(30); if(Key==0)K=10; if((K>=0)&&(K<=9)) { mima2[j]=K; if(j<6) { WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x0f); } ++j; if(j==7) j=6; //@@#yinhuang } //显示LCD12864并行显示 if(K==34) //按了删除键 { if(j==0) { WriteCommand(0x89); //指定第三行显示位置 WriteData(0x20); } else { --j; WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x20); } } } LcmClearTXT(); if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])) { for(i=0;i<6;i++) mimaID[i]=mima1[i]; ///////////////////////////////////////////////////// for(i=0;i<6;i++) //密码限制在6位以内 { UserPassword[i]=mima1[i]+0x30; } temp=(Member-1)*100; delayms(5);
for(k=1;k<6;k++)
{ x24c02_write(temp,UserPassword[k]); delayms(10); temp++; } ////////////////////////////////////////////////////// PutStr(0,1,"密码修改成功"); PutStr(3,0," 按任意键继续"); while(Keycan()==0); } else { PutStr(0,0," 密码修改失败 "); PutStr(1,0,"两次输入的密码不"); PutStr(2,0,"一致,请重新操作"); PutStr(3,0," 按任意键继续"); while(Keycan()==0); } LcmClearTXT(); } void zhu() { LcmClearTXT(); PutStr(1,2,"门已打开"); jidianqi=0; delay(2500); jidianqi=1; PutStr(3,0," 按任意键继续"); while(Keycan()==0); } void guanliyuan() //管理员 { uchar i,j=0,x=1; uchar Right_flag; LcmClearTXT(); PutStr(1,1,"请输入密码:"); for(i=0;i<6;i++)mima[i]=0; Key=Keycan(); while(Key!=queren) { Key=Keycan(); KeyDeal(Key); delay(30); if(Key==0)K=10; if((K>=0)&&(K<=9)) { mima[j]=K; if(j<6) { WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x0f); } ++j; if(j==7) j=6; } //显示LCD12864并行显示 if(K==34) //按了删除键 { if(j==0) { WriteCommand(0x89); //指定第三行显示位置 WriteData(0x20); } else { --j; WriteCommand(0x89+j); //指定第三行显示位置 WriteData(0x20); } } } LcmClearTXT(); for(i=0;i<6;i++) { UserPassword[i]=mima[i]+0x30; } if(j==6){Right_flag=PassWord_Chack(); } if (Right_flag==1) { Right_flag=0; while(Keycan()!=tuichu) { PutStr(0,0,"按键1 : 增加指纹"); PutStr(1,0,"按键2 : 删去指纹"); PutStr(2,0,"按键3 : 手动开锁"); PutStr(3,0,"按键4 : 修改密码"); KeyDeal(Keycan()); switch(K) { case 1: addfinger();K=8; break; case 2: deletfinger(); break; case 3: zhu(); K=6; break; case 4: gaimima(); break; default: break; } } } else { PutStr(1,2,"密码错误"); PutStr(2,0," 请重新操作!"); PutStr(3,0," 按任意键继续"); while(Keycan()==0); } Key=0; LcmClearTXT(); } void fan() { // PutStr(1,2,"请先按键"); //
PutStr(2,2,"再刷指纹"); PutStr(0,2,"欢迎使用");
PutStr(1,1,"指纹门禁系统");
PutStr(3,1,"请按手指开锁");
Key=Keycan();
if(k2==1) //指纹刷机
{ LcmClearTXT();
shuazhiwen();
LcmClearTXT(); }
if(Key==0x81)
//管理员操作 {
LcmClearTXT();
guanliyuan();
LcmClearTXT(); }
}
源码+电路图 下载:关注公众号,首页回复“指纹密码锁”获取资料