这是一个基于AS608+STC89C52单片机的指纹识别和键盘密码锁。本文尾部有完成c语言程序,原理图,pcb文件附件。
原理图截图:
pcb文件截图:
部分源码:
- /*********************************************************
- 函数名称: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);
- }
- }
- }
- }
复制代码
pcb和原理图工程文件.zip
(1.09 MB, 售价: 3 E币)
指纹密码锁完整C源码.zip
(113.33 KB, 售价: 5 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|