ImageVerifierCode 换一换
格式:DOC , 页数:14 ,大小:92.05KB ,
资源ID:11233138      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/11233138.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(指纹识别模块单片机程序.doc)为本站上传会员【快乐****生活】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

指纹识别模块单片机程序.doc

1、include #include #define TRUE 1 unsigned char SaveNumber=0,searchnum=0; unsigned int SearchNumber=0; unsigned int clk0=0; sbit relay =P1^4; //继电器引脚 sbit buzzer=P1^5; //蜂鸣器引脚 sbit red= P2^7;//录入模式指示灯 在板子靠近单片机处 sbit green= P2^0;//识别模式指示灯 在板子远离单片机处

2、 sbit k1=P3^3; //模式识别 sbit k2=P3^4; //录入一次指纹 sbit k3=P3^2; //清除所有指纹(10个指纹清除) //变量定义: unsigned char code tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管 0-9 //数码管引脚定义: sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位) //由于程序中定时器被用 我们用一位数码管显示 且为静太显示 所以推荐大家用1602或者12864液晶

3、 bit changeflag=0,modeflag=0,clearallflag=0; //默认为识别模式,如果为1为录入指纹模式,每录入一次SaveNumber++ //////////////////////////////////////常用指令定义///////////////////////////// //Verify Password :验证设备握手口令 unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0

4、x1b}; //回送12个 //设置设备握手口令 unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a}; //回送12个 //GetImage :探测手指并从传感器上读入图像 unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05}; //回送12个 //Gen Templet1

5、 :根据原始图像生成指纹特征1 unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08}; //回送12个 //Gen Templet2 :根据原始图像生成指纹特征2 unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12个 //Search Finger :以CharBufferA或CharBufferB中的特征

6、文件搜索整个或部分指纹库 unsigned char code SEAT[18]={17, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,8, 4,1,0,0, 0,0x65, 0x00,0x73}; //回送16个 //Merge Templet ;将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModelBuffer。 unsigned char code MERG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,5 , 0x00,0x09};//

7、回送12个 //Store Templet :将ModelBuffer中的文件储存到flash指纹库中 unsigned char code STOR[16]={15, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,6,6,2, 0x00,0x00, 0x00,0x0f}; //回送12个 //Read Note unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19, 0, 0x00,0x1e}; //Clear Note

8、 unsigned char code DENT[46]={45,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3d}; //DEL one templet unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,7, 0x0c,0x00,0x00, 0,1, 0x00,0x15}; //DEL templ

9、et ;清空指纹库 unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0x0d,0x00,0x11}; ////////////////常用指令定义-------结束/////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////宏定义//////////////////////

10、////////////////////////////////////////////////// #define FALSE 0 #define TURE 1 //状态定义表 #define on 1 #define off 0 #define MAX_NUMBER 63 #define _Nop() _nop_() //////////////////////////////////////宏定义------------结束//////////////////////////////////////////////////////

11、// unsigned char FifoNumber=0; unsigned char FIFO[MAX_NUMBER+1]={0}; /*********1毫秒延时程序**********/ void delay1ms(unsigned int t) { unsigned int i,j; for(i=0;i

12、=0 SBUF = dat; //读入数据 while(!TI); //等待发送完毕 TI = 0; //清零 } bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,给模块发送一个命令 { unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0; bit result=0, start=0,stop=0; TxdByte(0xef);//数据包包头识别码

13、 TxdByte(0x01);//数据包包头识别码 i=*p; //数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作 p++; p++; for (count=i-1; count!=1;count--) //Sent command String { temp=*p++; //取第个“1”个元素的内容,然后发送 TxdByte(temp);//将数据发送出去 } result=TURE;//发送完成,结果为真 (真为1) FifoNumber

14、0; for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]数组里面的内容,写入0X00 FIFO[count-1]=0x00; if (result) { result=FALSE; start =FALSE; stop =FALSE; count=0; clk0=0; //清零CL0计数 do /////////////////////////////do的内容//////////

15、////////////////////// { restart0: if (RI==1)//如果接收到数据 { tmpdat=SBUF;//先把接收到的数据放到tmpdat中 RI=0; if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节 { count=0; FIFO[0]=tmpda

16、t;//读入第一个应答字节(0XEF),存在第“0”个元素中 flag=1; goto restart0;//可以用中断方式进行 } if(flag==1)//第一个字节已经回来,所以flag==1成立 { if(tmpdat!=0x01) //接收数据错误,将重新从缓冲区接收数据 { flag=0;//接收应答失败 result=FALSE;

17、 start =FALSE; stop=FALSE; count=0; goto restart0; } //如果成功接收到0xef01,可以开始接收数据 flag=2;//flag=2;表示应答成功,可以开始接收数据了 count++;//现在count=1; FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中 s

18、tart=TURE; //应答成功可以开始接收数据 goto restart0; } if((flag==2)&&(start==TURE))//flag=2;表示应答成功,可以开始接收数据了 { count++; //数据元素下标++ FIFO[count]=tmpdat;//存入数据 if(count>=6) {

19、 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

20、] - FIFO[count]; if(checksum != (FIFO[count]&0xff)) result=FALSE; //校验失败,置结果标志为0 else result=TURE; flag=0; break; } } } } }/////////////////////////////do的内容------

21、结束//////////////////////////////// while ((clk0 <= MaxTime) && (count <= MAX_NUMBER) && (changeflag==0)); //由定时器以及最大接收数据来控制,保证不会在此一直循环 FifoNumber=count; //保存接收到的数据个数 } return (result); } bit VefPSW(void)//验证设备握手口令,成功返回1 { unsigned char count=0;

22、 while (1) { if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00)) return(1); count++; if (count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败 { return(0); } } } void Clear_All(void) //清空指纹库 { delay1ms(200); Com

23、mand(DELE_all,50); //清空指纹库 } unsigned char ImgProcess(unsigned char BUFID) //发获取图像并生成特征文件,存入BUFID中//输入参数为缓冲区号 { if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00)) { if(BUFID==1) { if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00

24、)) { return 1; } else { return 0; } } else if(BUFID==2) { if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00)) { return 1; } else { return 0; }

25、 } } else { return 0; } return 0; } bit Searchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否存在) { if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00) ) { SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的页码 //MatchScore=F

26、IFO[12]*0x100+FIFO[13] 可以在此计算得分,从而进行安全级别设定,本程序忽略 return 1; } else { return 0; } } unsigned char search(void)//搜索指纹 { unsigned char SearchBuf=0,i=0; while (i<20) { if (ImgProcess(1)==1)//首先读入一次指纹 { S

27、earchBuf=Searchfinger();//进行指纹比对,如果搜索到,返回搜索到的指纹序号 if(SearchBuf==1) { return SearchNumber; } else { return 255;//表示搜索到的指纹不正确 } } i++; } return 0; } bit savefingure(unsigned char ID)//保存指纹 { unsigned

28、 char i=0; //现在开始进行存储指纹模板的操作 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)//此处进行存放指纹模板的命令 { return(1); } else { return(0);//不成功返回0 }

29、 } unsigned char enroll(void) //采集两次指纹,生成1个 指纹模板 { unsigned char temp=0,count=0; while(1) { temp=ImgProcess(1); //生成特征1 if (temp==1)//生成特征文件成功 { //采集第一个特征成功 count=0; buzzer=0; delay1ms(100); buzzer=1

30、 break; } else { if (temp==0)//采集指纹没有成功 { count++; if (count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出enroll函数----返回0 return(0); } } } delay1ms(2000);//延时2S开始采集下一个特征 //开始采集第二个特

31、征 while(1) { temp=ImgProcess(2); //生成特征2 if (temp==1)//生成特征文件2成功 { if ( (Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==1 ) //合并成功返回1 { buzzer=0; delay1ms(100); buzzer=1; delay1ms(100); buzze

32、r=0; delay1ms(100); //响两声,表示生成一个模板成功 buzzer=1; return(1); } else { return(0); } } else { if (temp==1)//采集指纹没有成功 { count++; if (count>=25) return(0);

33、 } } } } void main(void)//主函数 { unsigned char i=0; ET0=1; //定时器0开中断 TL0=0x97; //17ms的初值 TH0=0xBD; //串口初始化 SCON=0x50; //UART方式1:8位UART; REN=1:允许接收 PCON=0x00; //SMOD=0:波特率不加倍 TMOD=0x21; //T1方式2,用于UART波特率 TH1=0xFD; TL1=0xFD;

34、 //UART波特率设置:9600 TR1=1; TR0=1;// 开定时器0 IT0=0;//中断0低电平中断 IT1=1;//中断1低电平中断 EX0=1;//开中断0 EX1=1;//开中断1 EA=1; SMG_g = 0; P0 = tab[0];//显示0 for(i=0;i<6;i++)//开始握手6次,如果没有一次成功,表示模块通信不正常。只要成功就跳出此循环 { if(VefPSW()==1)//与模块握手通过,绿灯亮起。进入识别模式 { green=0; bu

35、zzer=0; delay1ms(300); buzzer=1; green=1; red=0; break; //成功就退出这个循环 } } while(1) { if(k2==0)//录入一个指纹 { delay1ms(10); if(k2==0)//如果仍为低电平,表示按键有效 { while(k2==0);//等待松手 if(VefPSW()==1&&m

36、odeflag==1&&SaveNumber<10)//与模块握手通过 { if(enroll()==1)//采集两次,生成1个指纹模板成功 { if(savefingure(SaveNumber+1)==1)//保存也成功 { SaveNumber++;//加一次 P0=tab[SaveNumber]; delay1ms(200); P0=0xFF;//来一次显示,闪烁一次

37、 delay1ms(200); P0=tab[SaveNumber]; } } } else { buzzer=0; for(i=0;i<8;i++) { delay1ms(100); red=~red; } red=0; buzzer=1; } }

38、 } if(modeflag==0)//为识别模式 { green=0; red=1; searchnum=search(); if(searchnum>=1&&searchnum<=162)//只能存入162个指纹 { P0=tab[searchnum];//显示搜索到的指纹模块 //蜂鸣器响一声 //继电器打开约3秒钟 relay=0; buzzer=0; delay1ms(100);

39、 buzzer=1; delay1ms(3000); relay=1; } if(searchnum==255)//不正确的指纹 蜂鸣器响三声 { P0=tab[0];//显示0 buzzer=0;delay1ms(100); buzzer=1;delay1ms(100); buzzer=0;delay1ms(100); buzzer=1;delay1ms(100); buzzer=0;delay1ms(100);

40、buzzer=1;delay1ms(100); } } if(modeflag==1)//录入模式 { green=1; red=0; } if(clearallflag==1) { clearallflag=0; Clear_All(); red=0; //红色灯亮 green=1; //蜂鸣器长响一次,表示清除所有指纹结束 modeflag=1;//进入录入指纹模式 P0=tab[0];//表示没有指纹录入 buzzer=0;

41、 delay1ms(800); buzzer=1; SaveNumber=0; } if(changeflag==1) { changeflag=0; if(modeflag==0) //识别模式 { green=0; red=1; P0=tab[0];//显示当前有几个 指纹 } else //录入模式 { red=0; green=1; P0=tab[0];//显示0 } } }////////

42、////////////////////while(1)结束//////////////////////////////// } void Timer0(void) interrupt 1//定时器0中断函数 { TL0=0x97; TH0=0xBD; clk0++; //延时17ms } void int0(void) interrupt 0//中断0,清除所有指纹 { if(k3==0) //清除所有指纹 { delay1ms(10); if(k3==0)//如果仍为低电平,表示按键有效 { while

43、k3==0);//等待松手 clearallflag=1; changeflag=1; } } } void int1(void) interrupt 2//中断1,模式转换 { if(k1==0)//模式转换 其中用modeflag 来标志,默认从第1个指纹开始录入 { delay1ms(10); if(k1==0)//如果仍为低电平,表示按键有效 { while(k1==0);//等待松手 modeflag=~modeflag;//0表示录入指纹 1表示识别指纹 changeflag=1; } } }

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服