自己做的一个指纹锁,各路大神欢迎指导
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include"reg52.h"
- #include"12864.h"
- //#include"eeprom.h"
- #include"matrixkey.h"
- #include"AT24CXX.h"
- #include"finger.h"
- uchar code table4[]=" 请按手指开锁 ";
- uchar code table5[]="请输入密码开锁: ";
- uchar code table6[]="按键1: 增加指纹";
- uchar code table7[]="按键2: 删去指纹";
- uchar code table8[]="按键3: 手动开锁";
- uchar code table9[]="按键4: 修改密码";
- 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 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 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 key(void)
- {
- num=keynum();
- if((num==11)&&(key_flag==0))//如果按下C按键进入
- {
- key_flag=1;
- //只显示“请输入密码开锁:“
- LcmClearTXT();//清屏
- PutStr(1,0,table5);
- }
- 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((num=='D')&&(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]))
- { //只显示“门已打开“
- PutStr(1,0,table11);
- relay=0;
- Delay(8000000);
- relay=1;
- Delay(3000000);
- err_user=3;
- }
- else//密码错误
- { err_user--;
- PutStr(1,0,table24);//显示输入密码错误
- PutStr(2,0,table25);//显示输入密码错误
- WriteCommand(0x88+3); //指定第三行显示位置
- WriteData(' ');
- WriteData(err_user+0x30);
- }
- 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((num=='D')&&(number==6))//按下D键确定按键并且输入六位密码之后
- { //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面
- 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=3;
- admin_dispay();//管理员设置界面
- err_admin=3;
-
- }
- else//管理员密码错误
- {
- err_admin--;
- PutStr(1,0,table24);//显示输入密码错误
- PutStr(2,0,table25);//显示还 机会
- WriteCommand(0x88+3); //指定第三行显示位置
- WriteData(' ');
- WriteData(err_admin+0x30);
- 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==3)&&(num!=0xff))
- {
- num=coding(num);//转换成可以识别的
- if(num=='C')//返回初始界面
- {
- number=0;
- key_flag=0;
- init_dispay();//返回初始界面
- }
- if(num==1)//增加指纹
- {
- //只显示“门已打开“
- 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(' ');
- WriteData(id/100+0x30);
- WriteData(id%100/10+0x30);
- WriteData(id%10+0x30);
-
- }
- else PutStr(1,0,table27); //采集指纹失败
- }
- else if(regist(0)==2)//已经注册过指纹
- {
- PutStr(1,0,table26); //指纹已经存储
- }
-
- PutStr(3,0,table12); //请按任意键退出
- while(keynum()>=16);
- admin_dispay();//管理员设置界面
- key_flag=3;
- num=0xff;
- }
- if(num==2)//删除指纹
- {
- //只显示“门已打开“
- LcmClearTXT();//清屏
- PutStr(1,0,table17);//输入删去的指纹号
- number=0;
- key_flag=32;
- num=0xff;//防止后面key_flag=32误动作
-
- }
- if(num==3)//按下按键3直接打开锁
- {
- //只显示“门已打开“
- LcmClearTXT();//清屏
- PutStr(1,0,table11);
- relay=0;
- Delay(40);
- relay=1;
- Delay(20);
- PutStr(3,0,table12);
- while(keynum()>=16);
- admin_dispay();//管理员设置界面
- }
- if(num==4)//修改密码
- {
- //只显示“门已打开“
- LcmClearTXT();//清屏
- PutStr(0,0,table20);//显示请输入新密码
- number=0;
- key_flag=34;
- num=0xff;//防止后面key_flag=32误动作
- code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
- }
- }
- if((key_flag==32)&&(num!=0xff))//进入删除指纹操作
- {
- num=coding(num);//转换成可以识别的
- if((number<3)&&(num<10))
- {
- user[number]=num;//用户输入的密码进行记忆
- WriteCommand(0x88+number); //指定第三行显示位置
- WriteData(num+0x30);
- number++;
- }
- if((num=='D')&&(number==3))//按下D键确定按键并且并且输入了3位数号码
- {
- if(cancel((user[0]*100+user[1]*10+user[2]))==1)
- {
- PutStr(0,0,table18);//输入删去的指纹号成功
- }
- else
- {
- PutStr(0,0,table19);//输入删去的指纹号失败
- }
-
- PutStr(3,0,table12);
- while(keynum()>=16);
- admin_dispay();//管理员设置界面
- number=0;
- key_flag=3;
- }
- }
- if((key_flag==34)&&(num!=0xff))//进入删除指纹操作
- {
- num=coding(num);//转换成可以识别的
- if((number<6)&&(num<10))
- {
- if(code_flag==0)
- user[number]=num;//用户输入第一次的密码进行记忆
- else user2[number]=num;//用户输入第二次的密码进行记忆
- WriteCommand(0x88+number); //指定第三行显示位置
- WriteData(num+0x30);
- number++;
- }
- if((num=='D')&&(number==6))//按下D键确定按键并且并且输入了6位数密码
- {
- LcmClearTXT();//清屏
- if(code_flag==0)
- {
- PutStr(0,0,table21);//显示请再次输入新密码
- number=0;
- num=0xff;//防止后面key_flag=32误动作
- code_flag=1;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
- }
- else
- {
- if((user[0]==user2[0])&&(user[1]==user2[1])&&(user[2]==user2[2])&&(user[3]==user2[3])&&(user[4]==user2[4])&&(user[5]==user2[5]))//如果两次密码一样密码修改成功
- {
- PutStr(0,0,table22);//修改密码成功
- for(i=0;i<6;i++) //复制新密码
- now_code[i]=user[i];
- write_data(20,user,6);//进行数据保存
- }
- else
- {
- PutStr(0,0,table23);//两次修改密码不一样
- }
- PutStr(3,0,table12);
- while(keynum()>=16);
- admin_dispay();//管理员设置界面
- number=0;
- key_flag=3;
- }
- }
- }
- }
- 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);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
指纹锁原理图.zip
(1.75 MB, 下载次数: 381)
程序.zip
(91.78 KB, 下载次数: 315)
|