这是一个基于AS608+STC89C52单片机的指纹识别和键盘密码锁。
里面包括程序,原理图,pcb图和实物图。
话不多说直接上图
制作出来的实物图如下:
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机AS608源程序如下:
- /*********************************************************
- 函数名称:bit Command(uchar *p,uchar MaxTime)
- 函数作用:命令解析,给模块发送一个命令
- 参数说明:*p指令,MaxTime延时时长
- *********************************************************/
- bit Command(u8 *p,u8 MaxTime)
- {
- u8 count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
-
- bit result=0, start=0,stop=0;
- UART_send_char(0xef);//数据包包头识别码
- UART_send_char(0x01);//数据包包头识别码
- i=p[0];//数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作
- for(count=2; count<i;count++)//发送数据包
- UART_send_char(p[count]); //将数据发送出去
-
- result=TURE; //发送完成,结果为真 (真为1)
- FifoNumber=0;//清除接收的数据个数
- for(count=0;count<=MAX_NUMBER;count++)//清空所有FIFO[]数组里面的内容,写入0X00
- FIFO[count]=0x00;
- if(result)
- {
- result=FALSE;
- start =FALSE;
- stop =FALSE;
- count=0;
- clk0=0; //清零CL0计数
-
- do /////////////////////////////do的内容////////////////////////////////
- {
- restart0:
- if (RI==1)//如果接收到数据
- {
- tmpdat=SBUF;//先把接收到的数据放到tmpdat中
- RI=0; //软件清除接收标志
- if((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节
- {
- count=0;
- FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中
- flag=1;
- goto
- restart0;//可以用中断方式进行
-
- }
- if(flag==1)//第一个字节已经回来,所以flag==1成立
- {
- if(tmpdat!=0x01)//接收数据错误,将重新从缓冲区接收数据
- {
- flag=0;//接收应答失败
- result=FALSE;
- start =FALSE;
- stop=FALSE;
- count=0;
- goto
- restart0;
- }
- //如果成功接收到0xef01,可以开始接收数据
- flag=2;//flag=2;表示应答成功,可以开始接收数据了
- count++;//现在count=1;
- FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中
- start=TURE; //应答成功可以开始接收数据
- goto
- restart0;
- }
- if((flag==2)&&(start==TURE))//flag=2;表示应答成功,可以开始接收数据了
- {
- count++;//数据元素下标++
- FIFO[count]=tmpdat;//存入数据
- if(count>=6)
- {
- checksum=FIFO[count]+checksum;//计算校验和
- }
- if(count==8)
- {
- package=FIFO[7]*0X100+FIFO[8];//计算包长度
- stop= TURE;
- }
- if(stop)
- {
- if(count==package+8)
- {
- checksum=checksum-FIFO[count-1] - FIFO[count];
- if(checksum != (FIFO[count]&0xff))
- result=FALSE; //校验失败,置结果标志为0
- else
- result=TURE;
- flag=0;
- break;
- }
- }
- }
- }
- }
- while((clk0<=MaxTime)&&(count<=MAX_NUMBER));//由定时器以及最大接收数据来控制,保证不会在此一直循环
-
- FifoNumber=count;//保存接收到的数据个数
- }
- return (result);//返回操作是否成功
- }
- /*********************************************************
- 函数名称:uchar ImgProcess(uchar BUFID)
- 函数作用:发获取图像并生成特征文件,存入BUFID中
- 参数说明:BUFID为缓冲区号
- *********************************************************/
- u8 ImgProcess(u8 BUFID)
- {
- if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- {
- if(BUFID==1) //生成指纹特征1
- {
- if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- return 1;
- else
- return 0;
- }
- else if(BUFID==2)//生成指纹特征2
- {
- if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- return 1;
- else
- return 0;
- }
- }
- else
- return 0;
- return 0;
- }
- /*********************************************************
- 函数名称:uchar search()
- 函数作用:搜索指纹
- 参数说明:返回指纹序号
- *********************************************************/
- u8 search()
- {
- u8 SearchBuf=0;
- if (ImgProcess(1)==1)//首先读入一次指纹
- {
- if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00))//进行指纹比对,如果搜索到,返回搜索到的指纹序号
- return FIFO[10]*0x100+FIFO[11];
- else
- return 255;
- }
- return 0;
- }
- /*********************************************************
- 函数名称:bit savefingure(uchar ID)
- 函数作用:保存指纹
- 参数说明:指定保存的序号
- *********************************************************/
- bit savefingure(u8 ID)
- {
- u8 i;
- //现在开始进行存储指纹模板的操作
- for (i=0;i<16;i++) //获取保存指纹信息指令
- {
- FIFO[i]=STOR[i];
- }
- FIFO[12]=ID; //把指纹模板存放的PAGE_ID也就是FLASH的位置
- FIFO[14]=FIFO[14]+ID; //重新计算校验和
-
- if (Command(FIFO,70)==1)//成功返回1 //此处进行存放指纹模板的命令
- {return(1);}
- else
- {return(0);} //不成功返回0
- }
- /*********************************************************
- 函数名称:bit dellfingure(uchar ID)
- 函数作用:删除指纹
- 参数说明:指定序号删除
- *********************************************************/
- bit dellfingure(u8 ID)
- {
- u8 i;
- //现在开始进行存储指纹模板的操作
- for (i=0;i<16;i++) //获取删除指纹信息指令
- {
- FIFO[i]=DELE_one[i];
- }
- FIFO[11]=ID; //把指纹模板存放的PAGE_ID也就是FLASH的位置
- FIFO[15]=FIFO[15]+ID; //重新计算校验和
-
- if (Command(FIFO,70)==1)//成功返回1//此处进行存放指纹模板的命
- {return(1);}
- else
- {return(0);} //不成功返回0
- }
- /*********************************************************
- 函数名称:bit Clear_All()
- 函数作用:清空指纹库
- 参数说明:返回1成功,返回0失败
- *********************************************************/
- bit Clear_All()
- {
- if(Command(DELE_all,50)==1)
- return(1);
- else
- return(0);
- }
- /*********************************************************
- 函数名称:uchar enroll()
- 函数作用:采集两次指纹,生成1个指纹模板
- 参数说明:
- *********************************************************/
- u8 enroll()
- {
- u8 temp=0,count=0;
- while(1)
- {
- temp=ImgProcess(1);//生成特征1
- if (temp==1) //生成特征文件成功
- {
- break;
- }
- else
- {
- if (temp==0)//采集指纹没有成功
- {
- count++;
- if (count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出enroll函数----返回0
- return(0);
- }
- }
- }
- //采集第一个特征成功
- count=0;
- delay1ms(500);//延时0.5S开始采集下一个特征
- //开始采集第二个特征
- while(1)
- {
- temp=ImgProcess(2);//生成特征2
- if (temp==1) //生成特征文件2成功
- {
- if((Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0) //合并不成功返回0,成功返回1
- {
- return 0;
- }
- else//特征文件合并生成模板,结果存于ModelBuffer
- {
- return 1;
- }
- }
- else
- {
- if (temp==1)//采集指纹没有成功
- {
- count++;
-
- if (count>=25)
-
- return(0);
- }
- }
- }
- }
复制代码
- #include "all.h"
- /************************引脚定义************************/
- sbit relay=P3^6;//继电器
- sbit buzz=P3^2;//蜂鸣器
- sbit led=P0^0;//LED指示灯
- /************************变量定义************************/
- #define MAX 6 //指纹最大数量
- #define ID_MAX 3//输入ID最大位数
- u16 T0_num=0;
- u8 mode=0; //0正常打卡,1管理界面,2注册模式,3删除模式,4查询模式,5修改密码,6校准时钟,7工作时间
- u8 mode_num=0;
- u16 ID=0; //存储输入编号ID
- u8 n=0; //输入的位数
- bit zhiwen_f=0; //1=标记进入指纹采集
- u8 shu;
- u8 a; //存储按键值
- u8 num; //记录输入的密码位数
- bit in_f; //输入密码的标志
- bit reset_f; //重设密码的标志
- bit input_f; //六位密码按完的标志
- u8 reset_num; //标记修改密码阶段,=1输入旧密码,=2输入新密码,=3再次输入新密码
- u32 low_mima=0;//系统密码
- u32 in_mima=0; //暂存输入的密码
- u32 new_mima=0;//暂存输入新密码
- u8 set_f=0;
- u8 temp[5]=" \0";
- /********************************************************
- 函数名称:void delayms(uint ms)
- 函数作用:毫秒延时函数
- 参数说明:
- ********************************************************/
- void delayms(u16 ms)
- {
- u8 i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函数名称:void didi(uchar i)
- 函数作用:蜂鸣器鸣叫
- 参数说明:i为鸣叫次数
- ********************************************************/
- void didi(u8 i)
- {
- u8 j;
- for(j=0;j<i;j++)
- {
- led=0;
- buzz=0;
- delayms(20);
- led=1;
- buzz=1;
- delayms(15);
- }
- }
- /********************************************************
- 函数名称:void diaplay_mode0()
- 函数作用:显示打卡主界面
- 参数说明:
- ********************************************************/
- void diaplay_mode0()
- {
- LCD12864_display_string(1,1,"指纹密码锁");
- LCD12864_display_string(0,2,"编号: ");
- LCD12864_display_string(0,3,"状态: ");
- }
- /********************************************************
- 函数名称:void xunzhiwen()
- 函数作用:查找指纹
- 参数说明:
- ********************************************************/
- void xunzhiwen()
- {
- searchnum=search();//搜索指纹
- if((searchnum>=1&&searchnum<=MAX)||searchnum==255)//最多是MAX个指纹
- {
- if(searchnum>=1&&searchnum<=MAX)//指纹识别成功
- {
- temp[0]=searchnum%1000/100+0x30;
- temp[1]=searchnum%100/10+0x30;
- temp[2]=searchnum%10+0x30;
- temp[3]=' ';
- LCD12864_display_string(3,2,temp);
- LCD12864_display_string(3,3,"指纹解锁");
- LCD12864_display_string(1,4," ");
- in_mima=0;
- num=0;
- input_f=0;
- relay=0;
- T0_num=0;
- }
- else//不正确的指纹
- {
- LCD12864_display_string(3,3,"无效指纹");
- didi(3);
- }
- delay1ms(500);
- LCD12864_display_string(3,2," ");
- LCD12864_display_string(3,3," ");
- }
- }
- /********************************************************
- 函数名称:void cunchu()
- 函数作用:存储指纹
- 参数说明:
- ********************************************************/
- void cunchu()
- {
- LCD12864_display_string(0,3,"状态: ");
- if(ID>0&&ID<=MAX)
- {
- if(enroll()==1)//采集两次,生成1个指纹模板成功
- {
- if(savefingure(ID)==1)//保存也成功
- {
- LCD12864_display_string(3,3,"录入成功");
- AT24C02_write_date(ID,1);
- }
- else
- LCD12864_display_string(3,3,"存储失败");
- }
- else
- LCD12864_display_string(3,3,"采集失败");
- }
- else
- LCD12864_display_string(3,3,"编号错误");
- n=0;
- ID=0;
- zhiwen_f=0;
- }
- /********************************************************
- 函数名称:void shanchu()
- 函数作用:删除指纹
- 参数说明:
- ********************************************************/
- void shanchu()
- {
- u16 i;
- LCD12864_display_string(0,3,"状态: ");
- if(ID>0&&ID<=MAX)
- {
- if(dellfingure(ID)==1)
- {
- LCD12864_display_string(3,3,"清空成功");
- AT24C02_write_date(ID,0);
- }
- else
- LCD12864_display_string(3,3,"1清空失败");
- }
- else
- {
- if(ID==999)
- {
- if(Clear_All()==1)
- {
- for(i=1;i<6;i++)
- AT24C02_write_date(i,0);
- LCD12864_display_string(3,3,"清空指纹");
- }
- else
- LCD12864_display_string(3,3,"清空失败");
- }
- else
- LCD12864_display_string(3,3,"编号错误");
- }
-
- n=0;
- ID=0;
- zhiwen_f=0;
- }
- /********************************************************
- 函数名称:void display_guanli()
- 函数作用:显示管理界面
- 参数说明:
- ********************************************************/
- void display_guanli()
- {
- LCD12864_display_string(0,1," 管理系统界面 ");
- LCD12864_display_string(0,2," 录入指纹 ");
- LCD12864_display_string(0,3," 清空指纹 ");
- LCD12864_display_string(0,4," 修改密码 ");
- switch(mode_num)
- {
- case 0: LCD12864_display_string(0,2," >> "); break;
- case 1: LCD12864_display_string(0,3," >> "); break;
- case 2: LCD12864_display_string(0,4," >> "); break;
- default: break;
- }
- }
- /*********************************************************
- 函数名称:void chuli()
- 函数作用:对所按下的按键进行处理
- 参数说明:
- *********************************************************/
- void chuli()
- {
- if(key_f==1) //先判断是否有按键按下
- {
- if(a==11&&mode==0&&in_f==0)
- {
- shu++;
- if(shu>=4)
- {
- AT24C02_write_date(200,0);
- AT24C02_write_date(201,0);
- AT24C02_write_date(202,0);
- low_mima=0;
- shu=0;
- }
- }
- else
- shu=0;
- if((mode==2||mode==3)&&a<10) //如果输入ID状态,并且按下的是数字键
- {
- if(n<ID_MAX)//判断是否为输入状态,并且输入未满最大整数位数,才可以继续输入
- {
- if(n==0) //判断为编号第1位
- {
- LCD12864_display_string(3,2," ");
- LCD12864_display_string(0,3," ");
- }
- LCD12864_display_char(3+n,2,a+0x30);//显示出输入的数字 ASCII[a]
- ID=ID*10+a;//编号计算
- n++; //编号输入位数+1
- }
- }
- if((mode==0||mode==4)&&input_f==0&&a<10)//如果在in_f=1(输入密码状态),并且按下的是数字键
- {
- if(in_f==1||mode==4)
- {
- if(num==0) //清除显示后、显示输入新密码
- LCD12864_display_string(1,3," ");
- if(reset_f==1&&reset_num>1)
- LCD12864_display_char(num+1,2,a+0x30);//ASCII[a]
- else
- LCD12864_display_char(num+1,2,'*');//显示“*”
- }
- else
- LCD12864_display_char(num+1,4,'*');//显示“*”
- in_mima=in_mima*10+a;//读入密码
- num++; //密码输入次数加一
- if(num==6) //六位密码输入完成
- input_f=1; //标记六位密码输入完成
- }
- if(a==10)
- {
- if(mode==0&&in_f==0)//输入密码
- {
- num=0;
- in_f=1;
- in_mima=0;
- input_f=0; //清除确定标志
- write_com(0x01);
- LCD12864_display_string(0,1,"请输入管理密码: ");//显示输入密码
- }
- }
- if(a==15) //返回上一级菜单
- {
- if(mode>1) //在管理操作中
- {
- write_com(0x01);
- LCD12864_clear12864();
- mode=1; //回到管理选择界面
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载,PCB在2楼:
指纹密码锁.zip
(113.33 KB, 下载次数: 326)
|