指纹识别模块程序及原理图(共34页)_第1页
指纹识别模块程序及原理图(共34页)_第2页
指纹识别模块程序及原理图(共34页)_第3页
指纹识别模块程序及原理图(共34页)_第4页
指纹识别模块程序及原理图(共34页)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define Dbus P0#define buffer1ID 0x01#define buffer2ID 0x02#define queren 0x88#define tuichu 0x84#define shanchu 0x82sbit B0=B0;sbit B7=B7;sbit jidianqi=P36;sbit RS=P22; sbit RW=P21;

2、sbit E1=P20;sbit LEDK=P34; /控制背光sbit SCLK=P23;sbit IO=P25;sbit RST=P24;uchar code ta8=0x00,0x51,0x09,0x10,0x05,0x02,0x11,0xbe;uchar data a7; / 秒 分 时 日 月 星期 年 uchar dz4; /存键输入值uchar mima7;uchar mimaID6=1,2,3,4,5,6;uchar data K;uchar data Key;uint PageID;uchar data querenma;uchar sum2;int summaf,summa

3、s;uchar code nian="年"uchar code yue="月"uchar code ri="日"uchar code xinqi="星期"uchar code mao=0x3a;unsigned char code text1=" 请按指纹 "unsigned char code text2=" 请再次按指纹 "unsigned char code text3=" 指纹采集成功 "unsigned char code text4="

4、;请按任意键继续 " unsigned char code text5=" 指纹采集失败 "unsigned char code text6="输入删去的指纹号"unsigned char code text7=" 删指纹号成功 "unsigned char code text8="按键一:增加指纹"unsigned char code text9="按键二:删去指纹"unsigned char code text10=" 请重新按指纹 "unsigned char

5、 code text11="清空指纹库成功 " unsigned char code text12=" 没搜索到指纹 " unsigned char code text13="请先按键再刷指纹"unsigned char code text14=" 请重新操作 " unsigned char code text15=" 删去失败 " unsigned char code text16=" 接收包出错 "unsigned char code text17=" 编号为:

6、 "unsigned char code text18="指纹已找到 请进"unsigned char code text19=" 该指纹已存储 "unsigned char code text20=" 请输入密码 "unsigned char code text21=" 密码错误 "unsigned char code text22="按键三:更新密码" / unsigned char code text23="请再次输入密码 " unsigned char co

7、de text24="两次输入的密码不"unsigned char code text25="一致,请重新操作" unsigned char code text26=" 密码更新成功 " 另外:void delay(uint tt) uchar i; while(tt-) for(i=0;i<125;i+); void initialize51() SCON= 0x50; /串口方式1/REN=1; 允许接收 PCON=0x80; /SMOD=1 TMOD= 0x20; /定时器1定时方式2 TH1= 0xff; /11.059

8、2MHz 模块默认波特率为57600bps TL1= 0xff; TR1= 1; /启动定时器unsigned char Keycan(void) /按键扫描程序 P1.0-P1.3为行线 P1.4-P1.7为列线 unsigned char rcode, ccode; P1 = 0xF0; / 发全0行扫描码,列线输入 if(P1&0xF0) != 0xF0) / 若有键按下 delay(1);/ 延时去抖动 if(P1&0xF0) != 0xF0) rcode = 0xFE; / 逐行扫描初值 while(rcode&0x10) != 0) P1 = rcode;

9、/ 输出行扫描码 if(P1&0xF0) != 0xF0) / 本行有键按下 ccode = (P1&0xF0)|0x0F; /do; while(P1&0xF0) != 0xF0); /等待键释放 return (rcode) + (ccode); / 返回键编码 else rcode = (rcode<<1)|0x01; / 行扫描码左移一位 return 0; / 无键按下,返回值为0void KeyDeal(unsigned char Key) /unsigned char n; if(Key!=0) switch(Key) case 0x11: K

10、=1; break; case 0x21: K=2; break; case 0x41: K=3; break; case 0x81: break; /K=funguanliyuan; case 0x12: K=4; break; case 0x22: K=5; break; case 0x42: K=6; break; case 0x82: K=34;break;/K=funshanchu; case 0x14: K=7; break; case 0x24: K=8; break; case 0x44: K=9; break; case 0x84: break;/K=funtuichu; c

11、ase 0x18: break;/K=shuazhiwen case 0x28: K=0; break; case 0x48: break; case 0x88: break;/K=funqueren; default: break; /*/12864/读12864忙void ReadBusy(void)unsigned char ch; cheak:Dbus=0xff;RS=0;RW=1;E1=1;ch=Dbus;E1=0;ch=ch|0x7f;if(ch!=0x7f)goto cheak;/向LCD写命令void WriteCommand(uchar command)ReadBusy();

12、RW=0;Dbus=command;E1=1;E1=0;/向LCD写数据void WriteData(uchar Lcd_data)ReadBusy();RS=1;RW=0;Dbus=Lcd_data;E1=1;E1=0;/清屏函数清DDRAMvoid Clrram (void) WriteCommand(0x01);/LCD12864初始化程序void Lcd_int()WriteCommand(0x30);/30-基本指令动作WriteCommand(0x0c);/开显示,关游标WriteCommand(0x01);/清屏,地址指针指向00HWriteCommand(0x02);/LCD1

13、2864显示时间void playtime()uchar i,n3,n4,y1,y2,r1,r2,s1,s2,f1,f2,m1,m2;WriteCommand(0x80);/指定第一行显示位置for(i=0;i<16;i+)WriteData(text13i); /显示LCD12864并行显示n3=a6>>4; n4=a6&0x0f;WriteCommand(0x90);/指定第二行显示位置WriteData(0x32);WriteData(0x30);WriteData(0x30+n3);WriteData(0x30+n4);for(i=0;i<2;i+) W

14、riteData(niani);y1=a4>>4; y2=a4&0x0f;WriteData(0x30+y1);WriteData(0x30+y2);for(i=0;i<2;i+) WriteData(yuei);r1=a3>>4; r2=a3&0x0f;WriteData(0x30+r1);WriteData(0x30+r2);for(i=0;i<2;i+)WriteData(rii); WriteCommand(0x88); /指定第三行显示位置for(i=0;i<4;i+)WriteData(xinqii);WriteData(a

15、5+0x30); s1=a2>>4;s2=a2&0x0f; f1=a1>>4;f2=a1&0x0f; m1=a0>>4;m2=a0&0x0f;WriteCommand(0x98); /指定第四行显示位置WriteData(0x30+s1);WriteData(0x30+s2);WriteData(mao);WriteData(0x30+f1);WriteData(0x30+f2);WriteData(mao);WriteData(0x30+m1);WriteData(0x30+m2);/*/12864/*/ds1302控制uchar

16、r1302() /读数据ds1302uchar i;for(i=0;i<8;i+) B>>=1; B7 = IO; SCLK=1; SCLK=0; return B;void w1302(uchar co) / 写ds1302 单字节 uchar i; B = co; for(i=0;i<8;i+) IO = B0; /原来是使用ACC寄存器 ,但不行,后改使用B寄存器后才正常运行 ? SCLK=1; SCLK=0; B>>=1; void w(uchar a, uchar d) /寻址,写数 RST = 0; SCLK = 0; RST = 1; w130

17、2(a); w1302(d); SCLK = 1; RST = 0;uchar r(uchar a) /寻址,读数 uchar r; RST = 0; SCLK = 0; RST = 1; w1302(a); r=r1302(); SCLK = 1; RST = 0;return r;void wclo(uchar *p) /写多字节ds1302 uchar i; w(0x8e,0x00); /写允许 RST=0; SCLK=0; RST=1;w1302(0xbe); /写多字节命令 for(i=0;i<8;i+)w1302(*(p+i); /写时钟数据 w(0x00,0x50); /?

18、 启动定时器 SCLK=1;RST=0;void rclo(uchar *p)/读出多字节ds1302 uchar i; RST=0; SCLK=0; RST=1; w1302(0xbf); for(i=0;i<7;i+) *(p+i) = r1302(); /读出时钟数据 SCLK=1;RST=0;/*/void SFG_getimage() /录入指纹图像 uchar i; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while

19、(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X03; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; summaf=0x05; SBUF=summaf; while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0);

20、 RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_genchar(uchar bufferID) /生成特征并存于charbuffer1/2 调用后单片机波特率变化 uchar i; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF

21、=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X04; while(TI=0); TI=0; SBUF=0X02; while(TI=0); TI=0; SBUF=bufferID; while(TI=0); TI=0; summaf=0x07+bufferID; sum0=summaf; sum1=summaf>>8; SBU

22、F=sum1; while(TI=0) TI=0; SBUF=sum0; while(TI=0) TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_regmodel() /合并生成模板 uchar i; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(

23、TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X03; while(TI=0); TI=0; SBUF=0X05; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; summaf=0x09; SBUF

24、=summaf; /校验和 while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_storechar(uint pageID) /储存模板ID1010也储存成功 ID>=1011 querenma=0x18? uchar i,ID1,ID2; SBUF=0xef; wh

25、ile(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X06; while(TI=0); TI=0; SBUF=0X06; while(TI=0); TI=0; SBUF=0X01; wh

26、ile(TI=0); TI=0; ID1=pageID;ID2=pageID>>8; SBUF=ID2; while(TI=0); TI=0; SBUF=ID1; while(TI=0); TI=0; summaf=0x0e+ID1+ID2; sum0=summaf; sum1=summaf>>8; SBUF=sum1; while(TI=0); TI=0; SBUF=sum0; while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while

27、(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_empty() /清空指纹库 uchar i; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBU

28、F=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X03; while(TI=0); TI=0; SBUF=0X0d; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; summaf=0x11; SBUF=summaf; while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(

29、RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_fastsearch(uchar bufferID) /搜索指纹返回指纹ID号 sum、pagenum>255都会使程序卡 uchar i,ID1,ID2; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0

30、XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X08; while(TI=0); TI=0; SBUF=0X1b; while(TI=0); TI=0; SBUF=bufferID; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=180; while(TI=0); TI=0; summaf

31、=9+0x1b+bufferID+180; sum0=summaf; sum1=summaf>>8; SBUF=sum1; while(TI=0); TI=0; SBUF=sum0; while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; ID1=SBUF; while(RI=0); RI=0; ID2=SBUF; /接收到的ID号 while(RI=0); RI=0; while(RI=0); RI=0; while(

32、RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; /PageID=ID1; PageID=(ID1<<8)+ID2;void SFG_enroll() /自动注册模板返回存储ID =录图像+合并生成模板+储存模板 uchar i,ID1,ID2; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0)

33、; TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X03; while(TI=0); TI=0; SBUF=0X10; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; summaf=0x14; SBUF=summaf; /校验和 while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0);

34、RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; ID1=SBUF; while(RI=0); RI=0; ID2=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; /PageID=ID1; PageID=(ID1<<8)+ID2;void SFG_deletchar(uint pageID) /删除指纹 校验和在2字节的页码处应分高低字节相加 uchar i,ID1,ID2;

35、 SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X07; while(TI=0); TI=0; SBUF=0X0c; while(TI=0); TI=0;

36、 ID1=pageID;ID2=pageID>>8; SBUF=ID2; while(TI=0); TI=0; SBUF=ID1; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=1; while(TI=0); TI=0; summaf=0x15+ID1+ID2; sum0=summaf; sum1=summaf>>8; SBUF=sum1; while(TI=0); TI=0; SBUF=sum0; while(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0

37、; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_writereg(uchar N) /设置波特率 uchar i; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; w

38、hile(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X05; while(TI=0); TI=0; SBUF=0X0e; while(TI=0); TI=0; SBUF=4; while(TI=0); TI=0; SBUF=N; while(TI=0); TI=0; summaf=0x1a; sum0=summaf; sum1=0; SBUF=sum1; while(TI=0); TI=0; SBUF=sum0; whi

39、le(TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; void SFG_identify()/自动验证指纹 录图像+生成特征+搜索 uchar i,ID1,ID2; SBUF=0xef; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X

40、FF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0XFF; while(TI=0); TI=0; SBUF=0X01; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; SBUF=0X03; while(TI=0); TI=0; SBUF=0X11; while(TI=0); TI=0; SBUF=0X00; while(TI=0); TI=0; summaf=0x15; SBUF=summaf; /校验和 while(

41、TI=0); TI=0; for(i=0;i<9;i+) while(RI=0); RI=0; while(RI=0); RI=0; querenma=SBUF; while(RI=0); RI=0; ID1=SBUF; while(RI=0); RI=0; ID2=SBUF; while(RI=0); RI=0; while(RI=0); RI=0; /得分 while(RI=0); RI=0; sum1=SBUF; while(RI=0); RI=0; sum0=SBUF; summas=(sum1<<8)+sum0; /PageID=ID1; PageID=(ID1&l

42、t;<8)+ID2;void shuazhiwen() uchar i,IDs1,IDs2,IDs3;Clrram();WriteCommand(0x90);/指定第二行显示位置for(i=0;i<16;i+)WriteData(text1i); /显示LCD12864并行显示请按指纹/SFG_getimage();/SFG_genchar(1);/SFG_fastsearch(1); SFG_identify(); while(querenma=2) SFG_identify(); if(querenma=0) Clrram();WriteCommand(0x90);/指定第二行

43、显示位置for(i=0;i<16;i+)WriteData(text18i); /显示LCD12864并行显示指纹通过 门已开 IDs1=PageID/100;IDs2=PageID/10%10;IDs3=PageID%10;WriteCommand(0x88);/指定第三行显示位置for(i=0;i<10;i+)WriteData(text17i); /显示LCD12864并行显示 编号为: WriteData(0x30+IDs1);WriteData(0x30+IDs2);WriteData(0x30+IDs3); jidianqi=0; /开门 else if(querenm

44、a=9) Clrram();WriteCommand(0x90);/指定第二行显示位置for(i=0;i<16;i+)WriteData(text12i); /显示LCD12864并行显示没搜索到指纹 else Clrram();WriteCommand(0x90);/指定第二行显示位置for(i=0;i<16;i+)WriteData(text16i); /显示LCD12864并行显示接收包出错 WriteCommand(0x98);/指定第四行显示位置for(i=0;i<16;i+)WriteData(text4i); /显示LCD12864并行显示请按任意键继续while(Keycan()=0);void addfinger() uchar i,IDa1,IDa2,IDa3; Clrram(); WriteCommand(0x90);/指定第二行显示位置 for(i=0;i<16;i+)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论