指纹模块读写通信程序
通元微指纹识别模组TFP625R 用户手册说明书
通元微指纹识别模组TFP625R用户手册厦门通元微智能科技有限公司目录1.产品规格 (1)2.Pin map (3)3. 概念解释 (3)1)资源开销 (3)2)模组参数 (4)3)指纹库 (4)4.通讯协议 (5)1)数据包格式 (5)2)命令码 (6)3)反馈码 (7)5. 命令 (8)GetImg (8)Img2Tz (9)Match (10)Search (10)RegModel (11)StoreModel (11)LoadChar (12)UpChar (13)DownChar (14)UpImage (15)DeleteChar (16)Empty (17)SetSysPara (17)ReadSysPara (18)SetPwd (19)VfyPwd (19)SetAddr (20)ReadINFPage (21)WriteNotePad (22)ReadNotePad (22)TemplateNum (23)ReadConList (23)Cancel (24)GetMinEmptyID (25)AutoEnroll (26)AutoIdentify (28)6.使用流程 (30)7.休眠与唤醒 (31)8.测试环境 (33)9.技术支持 (34)欢迎使用通元微指纹识别模组TFP625R 。
本文将为客户使用本模组进行指纹识别开发提供必要的说明信息。
本模组为单机指纹识别模组。
模组可以进行指纹注册、指纹识别、指纹验证等功能。
本模组支持UART通讯方式。
1.产品规格TFP625R具有模组自学习功能。
该功能会提升指纹识别的准确率。
匹配同一指纹,在匹配若干次后,匹配分数有所提升。
2.P in map连接器类型:FPC-0.5-6P: 6Pin 条形连接器,间距0.5mm。
3. 概念解释1)资源开销2)模组参数3) 指纹库图3-3, 模板与特征在Flash 中的对应成员0 成员1特征2N-1。
FPM系列指纹模块通信协议
引脚号 名 称
类型
功 能描 述
1
Vin
in 电源正输入端。(电气参数参见 3.1.1.4)
2
DP+ In/Out USB 数据线。
3
DP- In/Out USB 数据线。
4
GND
- 信号地。内部与电源地连接。
5
END
- 保护地。悬空或可接通讯引线屏蔽层。(一体式模块无此引脚)
注: 类型栏中,in 表示输入到模块,out 从模块输出。
3.1 上位机接口(J1)---------------------------------------------------------------------------------------- 3 3.1.1 串行通讯---------------------------------------------------------------------------------------------- 3 3.1.1.1 硬件连接----------------------------------------------------------------------------------------3 3.1.1.2 串行协议--------------------------------------------------------------------------------------3 3.1.1.3 上电延时时间--------------------------------------------------------------------------3 3.1.1.4 电气参数---------------------------------------------------------------------------4 3.1.2 USB 通讯------------------------------------------------------------------------------------4
指纹识别模块
指纹识别模块专注于:*MTK平台方案研发和集成*ARM嵌入式单片机,蓝牙方案研发*运动健康、睡眠监测方案研发与集成BIT-FT9R5B V23 电容式指纹识别模块嵌入指纹识别算法一、概述:BIT-FT9R5B 为电容式指纹采集和单片指纹处理器二合一设计的指纹识别二次开发模块,具有体积小、功耗低、接口简单、可靠性高、指纹模板小、大容量指纹识别等优点,可以非常方便将其嵌入用户系统,组成满足客户需求的指纹识别产品。
尤其具备自学习功能,指纹识别过程中,最新提取的指纹特征值识别成功后将该特征值融合到指纹数据库中,使用户在使用过程中越用越好用。
BIT-FT9R5B 模块通讯接口为 UART, 本模块作为从设备,由主设备发送相关命令对其进行控制。
该模块具有可调节的安全等级功能、指纹特征数据的读/写功能和 1:N 识别及 1:6验证功能等。
二、产品特点:功能完善:独立完成指纹采集、指纹登记、指纹比对和指纹搜索功能。
防伪性好:电容式感应探测技术,活体指纹探测功能,具有对指模、假指纹的辨别能力。
适应性强:算法性能优异,对各类指纹都有极好的适应性,如干手指、湿手指、浅纹理手指等都具有极高的辨识率和良好的校正、容错性能。
抗静电能力强:抗静电能力强,对环境干燥容易起静电的地区特别适用。
应用开发简单:开发都可根据提供的控制指令,自行指纹应用产品的开发,无需具备专业的指纹识别知识。
体积小巧:传感器厚度小,体积小,能灵活嵌入到各种体积受限的产品中。
易用性强:大面积指纹采集区,轻触式指纹采集过程,轻松易用。
数据加密:加密存储和安全加密传输,算法符合相关安全标准二、主要功能包括如下:■自动感应手指按下■通过 UART 收发指令■最小存储条件下实现指纹数据的登记及比对■电容式指纹传感器■ 1:N 识别及 1:6 验证功能■具有循环采集比对功能(Identify Free):主机 HOST 发送该指令后模块一直处于采集指纹比对并将比对结果返回 HOST■指纹特征数据的读/写功能■可适当调节的安全等级■采集指纹并提取特征值上传,下载指纹特征值与当前采集的指纹比对功能■可设置的波特率■可设置的设备编号■可以设置本模块访问密码,使本模块处于口令保护模式,极大提高了通讯的安全性。
指纹识别模块指导
准备实验需要的设备。
硬件: 试验箱、电源线、串口线、网线、指纹扫描模块、PC机一台。
一.软件: 虚拟机、超级终端、FTP软件。
二.连线方式将指纹识别模块安装在经典2410DVP试验箱的168扩展槽中。
三.实验原理指纹模块是面向广阔的锁具市场、保险箱(柜)、安防及工控市场, 推出的。
她是由32位高性能可编程处理器、活体指纹采集芯片和指纹识别核心固件等构成的一个独立的嵌入式指纹识别系统。
本指纹模块具有200枚以上指纹存储能力, 可扩展到上千枚, 具备1秒以内的指纹比对性能, 支持1: 1和1: N两种比对模式, 能够任意兼容各类指纹传感芯片, 允许客户内置应用程序, 减化应用方案, 节省开发成本。
本模块可提供全面的ODM定制服务, 时时刻刻、轻轻松满足您的个性化指纹产品需求。
功能用途指纹模块是嵌入式指纹产品的核心。
她面向锁具、安防和工控企业, 为他们提供一个“快速应用指纹技术”的硬件平台。
在这个平台上, 企业只需专注于原有产品, 无须关注指纹传感器的接入、指纹注册比对等远离其核心价值的技术, 从而在不增加研发成本的同时提升原有产品的应用价值。
指纹模块功能:活体指纹识别脱机指纹注册(250枚)脱机指纹比对(1: 1.1: N)可内置应用程序(固件)可接入任意指纹传感器件(光学、半导体电容、半导体温感、半导体压感、按压式、滑动式)丰富的接口支持(32位GPIO、SPI、UART、I2C.RF)指纹模块应用范围:指纹门锁指纹保险柜(箱)指纹文件柜指纹工控设备指纹遥控器指纹通关设备指纹POS机指纹IC卡读卡器指纹数码产品指纹电气开关等技术规格指纹模块一般参数:注: 指纹采集传感器选择请参考附录1。
模块优势可编程直接在模块的主控MCU中写入应用程序兼容性强能够兼容全球各种指纹传感芯片(光感、电容、电感、温感、压感, 滑动式和按压式)(用户可指定)指纹容量大片内可存储250枚以上指纹, 支持片外扩展注册比对性能优越指纹算法经过多年商用, 嵌入式环境下FAR、FRR性能优良服务好提供24小时技术支持和全面的ODM定制服务(只需提供规格书)四、程序分析根据如上提供的指纹操作API, 在linux开发环境下编写程序实现对指纹模块的完整操作。
FM-180指纹识别模块用户手册
UART 通讯指令格式详解
FM-180是完整的指纹识别模块,不需挂接任何外围部件,模块始终处于从属地位(Slave mode),主机(Host)需要通过不同的指令让模块完成各种功能。主机的指令、模块的应答 以及数据交换都是按照规定格式的数据包来进行的。主机必须按照下述格式封装要发送的指 令或数据,也必须按下述格式解析收到的数据包。
用户记事本
在FLASH 中开辟了一个512 字节的存储区域作为用户记事本,该记事本逻辑上被分成16 页, 每页32 字节。上位机可以通过PS_WriteNotepad 指令和PS_ReadNotepad 指令访问任意一 页。注意写记事本某一页的时候,该页32 字节的内容被整体写入,原来的内容被覆盖。
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
N bytes
2 bytes
0xEF01
芯片地址 包标识07
包长度
确认码
返回参数
校验和
FM-180 指纹识别模块用户手册 V1.1
确认码定义: 1. 00h:表示指令执行完毕或OK; 2. 01h:表示数据包接收错误; 3. 02h:表示传感器上没有手指; 4. 03h:表示录入指纹图像失败; 5. 04h:表示指纹图像太干、太淡而生不成特征; 6. 05h:表示指纹图像太湿、太糊而生不成特征; 7. 06h:表示指纹图像太乱而生不成特征; 8. 07h:表示指纹图像正常,但特征点太少(或面积太小)而生不成特征; 9. 08h:表示指纹不匹配; 10. 09h:表示没搜索到指纹; 11. 0ah:表示特征合并失败; 12. 0bh:表示访问指纹库时地址序号超出指纹库范围; 13. 0ch:表示从指纹库读模板出错或无效; 14. 0dh:表示上传特征失败; 15. 0eh:表示模块不能接受后续数据包; 16. 0fh:表示上传图像失败; 17. 10h:表示删除模板失败; 18. 11h:表示清空指纹库失败; 19. 12h:表示不能进入低功耗状态; 20. 13h:表示口令不正确; 21. 14h:表示系统复位失败; 22. 15H:表示缓冲区内没有有效原始图而生不成图像; 23. 16H:表示在线升级失败; 24. 17H:表示残留指纹或两次采集之间手指没有移动过; 25. 18H:表示读写FLASH 出错; 26. 0xf0:有后续数据包的指令,正确接收后用0xf0 应答; 27. 0xf1:有后续数据包的指令,命令包用0xf1 应答; 28. 0xf2:表示烧写内部FLASH 时,校验和错误; 29. 0xf3:表示烧写内部FLASH 时,包标识错误; 30. 0xf4:表示烧写内部FLASH 时,包长度错误; 31. 0xf5:表示烧写内部FLASH 时,代码长度太长; 32. 0xf6:表示烧写内部FLASH 时,烧写FLASH 失败; 33. 0x19:未定义错误; 34. 0x1a:无效寄存器号; 35. 0x1b:寄存器设定内容错误号; 36. 0x1c:记事本页码指定错误; 37. 0x1d:端口操作失败; 38. 0x1e:自动注册(enroll)失败; 39. 0x1f:指纹库满 40. 0x20—0xefh:Reserved。 指令只能由上位机下给模块,模块向上位机应答。 系统上电复位后将首先检查默认的设备握手口令是否被修改,若未被修改,则系统认为上位 机没有验证口令的需求,SOC 直接进入正常工作状态;若已被修改,则必须首先验证设备握
指纹识别模块程序及原理图
程序:#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=B^0;sbit B7=B^7;sbit jidianqi=P3^6;sbit RS=P2^2;sbit RW=P2^1;sbit E1=P2^0;sbit LEDK=P3^4; //控制背光sbit SCLK=P2^3;sbit IO=P2^5;sbit RST=P2^4;uchar code ta[8]={0x00,0x51,0x09,0x10,0x05,0x02,0x11,0xbe}; uchar data a[7]; // 秒分时日月星期年uchar dz[4]; //存键输入值uchar mima[7];uchar mimaID[6]={1,2,3,4,5,6};uchar data K;uchar data Key;uint PageID;uchar data querenma;uchar sum[2];int summaf,summas;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[]={"请按任意键继续"};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 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[]={" 编号为:"};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 code 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=1TMOD= 0x20; //定时器1定时方式2TH1= 0xff; //11.0592MHz 模块默认波特率为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; // 输出行扫描码if((P1&0xF0) != 0xF0) // 本行有键按下{ccode = (P1&0xF0)|0x0F;//do{;}while((P1&0xF0) != 0xF0); //等待键释放return ((~rcode) + (~ccode)); // 返回键编码}elsercode = (rcode<<1)|0x01; // 行扫描码左移一位}}}return 0; // 无键按下,返回值为0}void KeyDeal(unsigned char Key){ //unsigned char n;if(Key!=0){switch(Key){case 0x11: K=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;case 0x18: break; //K=shuazhiwencase 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();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);}//LCD12864显示时间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(text13[i]); //显示LCD12864并行显示n3=a[6]>>4; n4=a[6]&0x0f;WriteCommand(0x90); //指定第二行显示位置WriteData(0x32);WriteData(0x30);WriteData(0x30+n3);WriteData(0x30+n4);for(i=0;i<2;i++) WriteData(nian[i]);y1=a[4]>>4; y2=a[4]&0x0f;WriteData(0x30+y1);WriteData(0x30+y2);for(i=0;i<2;i++) WriteData(yue[i]);r1=a[3]>>4; r2=a[3]&0x0f;WriteData(0x30+r1);WriteData(0x30+r2);for(i=0;i<2;i++)WriteData(ri[i]);WriteCommand(0x88); //指定第三行显示位置for(i=0;i<4;i++)WriteData(xinqi[i]);WriteData(a[5]+0x30);s1=a[2]>>4;s2=a[2]&0x0f; f1=a[1]>>4;f2=a[1]&0x0f; m1=a[0]>>4;m2=a[0]&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 r1302() //读数据ds1302{ uchar 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;w1302(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); //??? 启动定时器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(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;TI=0;summaf=0x05;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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}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=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;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; sum[0]=summaf;sum[1]=summaf>>8; SBUF=sum[1];while(TI==0)TI=0;SBUF=sum[0];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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_regmodel() //合并生成模板{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;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);summaf=0x09;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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_storechar(uint pageID) //储存模板ID=1010也储存成功ID>=1011 querenma=0x18?@@@{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=0XFF;while(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;while(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; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}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;SBUF=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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}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=0XFF;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=9+0x1b+bufferID+180; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];TI=0;SBUF=sum[0];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(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_enroll() //自动注册模板返回存储ID =录图像+合并生成模板+储存模板{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;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=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);RI=0;}while(RI==0);querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_deletchar(uint pageID) //删除指纹校验和在2字节的页码处应分高低字节相加{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=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);SBUF=0X00;while(TI==0);TI=0;SBUF=0X07;while(TI==0);TI=0;SBUF=0X0c;while(TI==0);TI=0;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; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}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;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=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;sum[0]=summaf;sum[1]=0;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_identify() //自动验证指纹录图像+生成特征+搜索{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=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(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;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void shuazhiwen(){uchar i,IDs1,IDs2,IDs3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹//SFG_getimage();//SFG_genchar(1);//SFG_fastsearch(1);SFG_identify();while(querenma==2)SFG_identify();if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text18[i]); //显示LCD12864并行显示指纹通过门已开IDs1=PageID/100;IDs2=PageID/10%10;IDs3=PageID%10;WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:WriteData(0x30+IDs1);WriteData(0x30+IDs2);WriteData(0x30+IDs3);jidianqi=0; //开门}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text12[i]); //显示LCD12864并行显示没搜索到指纹}else{Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text16[i]); //显示LCD12864并行显示接收包出错}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}void addfinger(){uchar i,IDa1,IDa2,IDa3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹SFG_getimage();while(querenma!=0)SFG_getimage();SFG_genchar(buffer1ID);initialize51();SFG_fastsearch(buffer1ID);while(querenma==1)SFG_fastsearch(buffer1ID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text19[i]); //显示LCD12864并行显示该指纹已存储WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text2[i]); //显示LCD12864并行显示请再次按指纹SFG_enroll();while(querenma==2)SFG_enroll();Clrram();if(querenma==0){IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text3[i]); //显示LCD12864并行显示指纹采集成功WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:pgaeID WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);}else if(querenma!=0){WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text5[i]); //显示LCD12864并行显示指纹采集失败WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text14[i]); //显示LCD12864并行显示请重新采集}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void deletfinger(){uchar i,j=0;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text6[i]); //显示LCD12864并行显示请输入删去的指纹号for(i=0;i<5;i++)dz[i]=0; //不输入时会默认为000 @@@Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30); //按键有抖动@@@if(Key==0)K=10;if((K>=0)&&(K<=9)){dz[j]=K;if(j<3){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x30+dz[j]);}++j;if(j==4)j=3; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}if(j>=2)PageID=dz[2]+dz[1]*10+dz[0]*100;if(j==1)PageID=dz[1]+dz[0]*10;if(j==0)PageID=dz[0];SFG_deletchar(PageID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除成功for(i=0;i<16;i++)WriteData(text7[i]); //显示LCD12864并行显示}else{Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除失败for(i=0;i<16;i++)WriteData(text15[i]); //显示LCD12864并行显示}WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);Clrram();}void gaimima(){uchar i,j,mima1[6],mima2[6];Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima1[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima1[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang } //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();Clrram();j=0;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text23[i]); //显示LCD12864并行显示请再次输入密码for(i=0;i<6;i++)mima2[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima2[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3 ])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])){for(i=0;i<6;i++)mimaID[i]=mima1[i];WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text26[i]); //显示LCD12864并行显示密码更新成功WriteCommand(0x88); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else{WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text24[i]); //显示LCD12864并行显示两次输入的密码不WriteCommand(0x90); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text25[i]); //显示LCD12864并行显示一致,请重新操作WriteCommand(0x88); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void guanliyuan(){ uchar i,j;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima[0]==mimaID[0])&&(mima[1]==mimaID[1])&&(mima[2]==mimaID[2])&&(mima[3]==mimaID[3])&& (mima[4]==mimaID[4])&&(mima[5]==mimaID[5])){while(Keycan()!=tuichu){WriteCommand(0x90); //指定第二行显示位置按键1:增加指纹for(i=0;i<16;i++)WriteData(text8[i]); //显示LCD12864并行显示WriteCommand(0x88); //指定第三行显示位置按键2:删除指纹for(i=0;i<16;i++)WriteData(text9[i]); //显示LCD12864并行显示WriteCommand(0x98); //指定第三行显示位置按键3:改密码for(i=0;i<16;i++)WriteData(text22[i]); //显示LCD12864并行显示KeyDeal(Keycan());switch(K){case 1: addfinger();K=6; break;case 2: deletfinger(); break;case 3: gaimima(); break;default: break;}}}else{WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text21[i]); //显示LCD12864并行显示密码错误WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Key=0;}void main(){initialize51();LEDK=0;Lcd_int();Clrram();wclo(ta);delay(100);//SFG_empty();///@@@@//SFG_deletchar(255);//SFG_storechar(1011);//SFG_fastsearch(1);// WriteCommand(0x90); //指定第二行显示位置// WriteData(0x30+((0xf0&querenma)>>4));WriteData(0x30+(0x0f&querenma));while(1){Key=Keycan();if(Key==0x18) //指纹刷机{Clrram();shuazhiwen();Clrram();}if(Key==0x81) //管理员操作{Clrram();guanliyuan();Clrram();}rclo(a); playtime(); delay(100); jidianqi=1; }}。
RT1011指纹识别仪模块用户手册
指纹识别仪模块用户手册1 FLASH存储结构a)存储结构:地址 内容 大小 0x0000—0x7fff Codes 32k words0x8000—0x87ff 系统存储区 2k words0x8800—0xffff 指纹库 30k words—结束b)该存储结构由ROM系统定义,若客户自行开发整套DSP软件,则不受此结构限制;c)指纹库大小随FLASH容量而变,系统会自动判别。
2 系统参数存储区结构d)系统参数存储区结构:页号 内容 注解 FLASH物理地址(字节地址)0x8000 0 保留0x8200 1 参数表0x8400 2 用户记事本0x8600 3 保留0x8800 4 保留0x8a00 5 保留0x8c00 6 保留0x8e00 7 指纹库索引表 可供索引2048枚指纹e)系统参数存储区分为8页,每页512字节。
3 用户记事本在FLASH中开辟了一个512字节的存储区域作为用户记事本,该记事本逻辑上被分成16页,每页32字节。
上位机可以通过PS_WriteNotepad指令和PS_ReadNotepad指令访问任意一页。
注意写记事本某一页的时候,该页32字节的内容被整体写入,原来的内容被覆盖。
4 缓冲区与指纹库芯片内设有一个72K字节的图像缓冲区与二个512 bytes(256字)大小的特征文件缓冲区,名字分别称为:ImageBuffer,CharBuffer1,CharBuffer2。
用户可以通过指令读写任意一个缓冲区。
CharBuffer1或CharBuffer2既可以用于存放普通特征文件也可以用于存放模板特征文件。
通过UART口上传或下载图像时为了加快速度,只用到像素字节的高四位,即将两个像素合成一个字节传送。
通过USB口则是整8位像素。
指纹库容量根据挂接的FLASH容量不同而改变,系统会自动判别。
指纹模板按照序号存放,序号定义为:0—N-1(N指指纹库容量)。
用户只能根据序号访问指纹库内容。
手机指纹模块工作原理
手机指纹模块工作原理
手机指纹模块的工作原理是通过采用指纹识别技术,将用户的指纹图像与预先录入的指纹特征库中的指纹特征进行比对,以确认用户的身份。
具体来说,手机指纹模块内置了一个光学传感器或超声波传感器,用于感知用户手指触碰或放置的位置。
当用户将手指放置在指纹模块上时,传感器会开始工作,并通过采集手指表面的图像来获取指纹特征。
指纹特征包括指纹纹路的形状、位置、方向等信息。
传感器会将采集到的图像转换为数字信号,并经过预处理和特征提取的算法处理,将指纹特征提取出来,形成一个数字化的指纹特征样本。
同时,手机指纹模块还会将用户的指纹特征与预先录入的指纹特征进行比对,这些预先录入的指纹特征可以存储在手机的芯片或者云端服务器中。
比对过程通常采用模式识别算法或机器学习算法,通过计算相似度来判断用户指纹和预先录入指纹的匹配程度。
如果用户的指纹特征与其中之一的预先录入指纹特征相匹配,那么指纹模块就会认定用户的身份为合法,并通知手机系统解锁或进行相应的操作。
反之,如果用户的指纹特征与任何预先录入指纹特征都不匹配,那么指纹模块将认定用户身份非法,并拒绝解锁或执行其他操作。
总的来说,手机指纹模块通过感知、采集、提取和比对等步骤,实现了对用户指纹的识别和身份认证,从而提高了手机的安全性和用户的使用便利性。
指纹模块通信协议(2014)
TFS-M7x系列指纹识别模块通信协议本协议适用于:TFS-M71、TFS-M72 、TFS-M73、TFS-M74 、TFS-M74A、TFS-M75 、TFS-M76等模块一、通信方式指纹模块作为从设备,由主设备发送相关命令对其进行控制。
命令接口:UART(通用异步串口)19200bps 1起始位1停止位(无校验位)主设备发送的命令及指纹模块的应答按数据长度可分为两类:说明:CMD:命令/应答类型P1,P2,P3:命令参数Q1,Q2,Q3:应答参数,Q3多用于返回操作的有效性信息,此时可有如下取值:#define ACK_SUCCESS 0x00 //操作成功#define ACK_FAIL 0x01 //操作失败#define ACK_FULL 0x04 //指纹数据库已满#define ACK_NOUSER 0x05 //无此用户#define ACK_USER_OCCUPIED 0x06 //用户已存在#define ACK_FINGER_OCCUPIED 0x07 //指纹已存在#define ACK_TIMEOUT 0x08 //采集超时CHK:校验和,为第2字节到第6字节的异或值2)> 8字节,数据由两部分组成:数据头+数据包说明:CMD,Q3的定义同上Len:数据包内有效数据长度,16位,由两字节组成Hi(Len):数据包长度高8位Low(Len):数据包长度低8位CHK:校验和,为第2字节到第6字节的异或值数据包格式:说明:Len即为Data的字节数;CHK:校验和,为第2字节到第Len + 1字节的异或值发送完数据头后紧接着发送数据包。
二、命令类型2.1 修改模块序列号(命令/应答均为8字节)说明:序列号为24位的一个常数,每个模块不一样,可用于区别不同的模块。
.2取模块内部序列号(命令/应答均为8字节)22.3 使模块进入休眠状态(命令/应答均为8字节)2.4设置/读取指纹添加模式(命令/应答均为8字节)指纹添加分两种模式:允许重复模式/禁止重复模式, 在”禁止重复模式”下,同一枚手指只能添加一个用户,若强行进行第二轮添加将返回错误信息。
SFG系列指纹识别模块介绍
SFG系列指纹识别模块介绍R30X系列指纹识别模块是圣非格科技有限公司2009年推出的最新产品,采用了最先进的指纹传感器和高性能的DSP处理器,内嵌完整的指纹识别算法和协议。
具有指纹采集,指纹比对,搜索和存储等功能的智能型模块。
与同类指纹产品相比,因R30X系列采用自适应参数调节机制,对指纹的适应性更强,对干湿手指都有较好的成像质量,适用人群更广泛。
1.应用范围保险柜(箱)、门锁门禁系统与PC联机的指纹识别及认证系统等2.主要技术指标序号 项目 参数 备注1 工作电压 DC3.6-7.0V2 工作电流 100mA3 峰值电流 150mA4 安全等级 5级 从低到高:1、2、3、4、55 拒真率(FRR) <0.1% 安全等级为3时6 认假率(FAR) <0.001% 安全等级为3时7 图像处理时间 <0.4秒8 1:1000搜索时间 <1秒9 储存容量 250枚10 UART(TTL逻辑电平)波特率(9600×N)bps ,N=1-12默认N取6,即57600bps11 USB1.112 温度 -20℃-+50℃13 工作湿度 10%-90%(无凝露)14 储存温度 -30℃-+80℃15 储存湿度 <90%(无凝露)16 模块外形尺寸 48×32mm17 传感器尺寸 54×24×21mm二、硬件接口1.外部接口尺寸图R305光学式一体式指纹模块:R305F电容式指纹模块2.串行通讯引脚号 名称 定义 描述1 VIN 电源输入 电源正输入端2 GND 电源和信号地 电源和信号地3 TD 数据发送 串行数据输出,TTL逻辑电平4 RD 数据接收 串行数据输入,TTL逻辑电平模块通过串行通讯接口,可直接与采用3.3V或者5V电源的单片机进行通讯;指纹模块的数据发送端(TD)接上位机的数据接收端(RXD),指纹模块的数据接收端(RD)接上位机的数据发送端(TXD)。
基于STM32单片机开发光学指纹识别模块
基于STM32单片机开发光学指纹识别模块(FPM10A)全教程收藏人:共同成长8882014-05-08 | 阅:25 转:0 | 来源 | 分享基于STM32单片机开发光学指纹识别模块(FPM10A)全教程1.平台首先我使用的是奋斗STM32开发板 MINI板光学指纹识别模块(FPM10A)2.购买指纹模块,可以获得三份资料1.简要使用说明2.使用指纹模块的功能函数3.FPM10A用户手册.3.硬件搭建根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。
FPM10A光学指纹模块共有5个管脚1 为 VCC 电源的正极接 3.6V – 5.5V的电压均可。
2 为 GND 电源的负极接地。
3 为 TXD 串口的发送。
4 为 RXD 串口的接收。
5 为 NC 悬空不需要使用。
奋斗板上已经有5V的管脚,可以直接供给指纹模块,这里需要注意的是,指纹模块主要通过串口进行控制,模块和STM32单片机连接的时候,需要进行电平转换,这样只要把这个转接板插入STM32,接上5V的电,就可以工作了,将模块的发送端接转接板的接收端,接收端接转接板的发送端。
这样,我们的硬件平台就搭建好了!4.模块的测试工作模块成功上电后,指纹采集窗口会闪一下,表示自检正常,如果不闪,请仔细检查电源,是否接反,接错等。
指纹模块使用120MHZ的DSP全速工作,工作时芯片有一些热,经过严格的测试,这是没有问题的可以放心使用,在不使用的时候可以关闭电源,以降低功耗。
5.现在我们要进入编程环节了指纹模块主要是通过串口进行控制,所以这里我们需要用到单片机的串口模块。
我们需要用到两个关键函数1.使用串口发送一个字节的数据2.使用串口接收一个字节的数据这里我使用的STM32单片,所以这两个程序如下:view sourceprint?01.// 从 USART1 发送一个字节02.void USART1_SendByte(unsigned char temp)03.{04. USART_SendData(USART1, temp);05. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);06.}07.08.// 从 USART1 读取一个字节09.unsigned char USART1_ReceivByte()10.{11. unsigned char recev;12. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);13. recev = USART_ReceiveData(USART1);14. return recev;15.}6.查看FPM10A用户手册我们来实现比对一个指纹(我们这里假设指纹模块中已经存在指纹模板)首先我们需要让指纹模块检测是否有指纹输入(也就是是否有手指放在指纹模块上检测)我们来看手册上给的操作说明:我们需要发送给定的数据包给模块,发送的数据已经给我们了,现在我们参看给我们的C例程view sourceprint?01.//应答包数组02.unsigned char dat[18];03.04.//获得指纹图像05.06.unsigned char FP_Get_Img[6]={0x01,0x00,0x03,0x01,0x0,0x05};07.08.//协议包头09.10.unsigned char FP_Pack_Head[6] ={0xEF,0x01,0xFF,0xFF,0xFF,0xFF};11.12.//FINGERPRINT_获得指纹图像命令13.void FINGERPRINT_Cmd_Get_Img(void)14.{15. unsigned char i;16.17. for(i=0;i<6;i++) //发送包头18. USART1_SendByte(FP_Pack_Head[i]);19.20. for(i=0;i<6;i++) //发送命令 0x1d21. USART1_SendByte(FP_Get_Img[i]);22.23. for(i=0;i<12;i++)//读回应答信息24. dat[i]=USART1_ReceivByte();25.}说明:这个函数就是检测是否有指纹输入的信息,根据用户手册,当确认码返回值为0时,表示成功录入,所以,我们可以有下面的函数:view sourceprint?01.//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败02.unsigned char test_fig()03.{04. unsigned char fig_dat;05. FINGERPRINT_Cmd_Get_Img();06. Delay_ms1(20);07. fig_dat=dat[9];08. return(fig_dat);09.}10.11.因此,我们在主函数中可以这样调用:12.void main13.{14. if(test_fig()==0)15. {16. //do something17. }18.}7.如何录入一个新的指纹信息呢?步骤如下1.获得指纹图像2.检测是否成功的按了指纹3.将图像转换成特征码存放在Buffer1中4.再次获得指纹图像5.将图像转换成特征码存放在Buffer2中6.转换成特征码7.存储到指定地址上同样的,根据用户手册,我们可以得到以下这样的模块:当调用的时候,你只要给这个函数附上两个值就可以了,例如:unsigned char FP_add_new_user(00,01);如果你下次再次写入这个地址,以前存储的指纹模板信息将被覆盖view sourceprint?01.//添加一个新的指纹02.unsigned char FP_add_new_user(unsigned char ucH_user,unsign ed char ucL_user)03.{04. do05. {06. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像07. } while ( dat[9]!=0x0 ); //检测是否成功的按了指纹08.09. FINGERPRINT_Cmd_Img_To_Buffer1(); //将图像转换成特征码存放在Buffer1中10.11. do12. {13. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像14. } while( dat[9]!=0x0 );15.16. FINGERPRINT_Cmd_Img_To_Buffer2(); //将图像转换成特征码存放在Buffer2中18. FINGERPRINT_Cmd_Reg_Model(); //转换成特征码19.20. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);21.22. return 0;23.}24.25.//存储模版到特定地址26.void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char, unsigned char ucL_Char)27.{28. unsigned long temp = 0;29. unsigned char i;30.31. FP_Save_Finger[5] = ucH_Char;32. FP_Save_Finger[6] = ucL_Char;33.34. for(i=0;i<7;i++) //计算校验和35. temp = temp + FP_Save_Finger[i];36.37. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据38. FP_Save_Finger[8]= temp & 0x0000FF;39.40.41. for(i=0;i<6;i++)42. USART1_SendByte(FP_Pack_Head[i]); //发送包头43.44. for(i=0;i<9;i++)45. USART1_SendByte(FP_Save_Finger[i]) ;//发送命令将图像转换成特征码存放CHAR_buffer146.47. for(i=0;i<12;i++)48. dat[i]=USART1_ReceivByte();49.}8.如何删除一个模板?view sourceprint?01.//删除所有指纹模版02.void FINGERPRINT_Cmd_Delete_All_Model(void)03.{04. unsigned char i;06. for(i=0;i<6;i++) //发送包头07. USART1_SendByte(FP_Pack_Head[i]);08.09. for(i=0;i<6;i++) //发送命令 0x1d10. USART1_SendByte(FP_Delet_All_Model[i]);11.12. for(i=0;i<12;i++)//读回应答信息13. dat[i]=USART1_ReceivByte();14.}9.如何获取已经存取的指纹模板信息?这个模块一共可以存储0~999枚指纹信息view sourceprint?01.//搜索全部用户999枚02.void FINGERPRINT_Cmd_Search_Finger(void)03.{04. unsigned char i;05. //发送命令搜索指纹库06. for(i=0;i<6;i++)07. {08. USART1_SendByte(FP_Pack_Head[i]);09. }10.11. for(i=0;i<11;i++)12. {13. USART1_SendByte(FP_Search[i]);14. }15.16. for(i=0;i<16;i++)17. {18. dat[i]=USART1_ReceivByte();19. }20.}根据用户手册,我们可以从应答包中得出模块中已经存在指纹数量的大小这样,我们就轻松把指纹模块搞定!下面我附上基于STM32单片机光学指纹识别模块(FPM10A)打包好的函数库第一个是 FPM10A.cview sourceprint?001.#include "stm32f10x.h"002.#include "stm32f10x_usart.h"003.#include "misc.h"004.unsigned char dat[18];005.006.//FINGERPRINT通信协议定义007.unsigned char FP_Pack_Head[6] ={0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头008.unsigned char FP_Get_Img[6] ={0x01,0x00,0x03,0x01,0x0,0x05}; //获得指纹图像009.unsigned char FP_Templete_Num[6]={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数010.unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0 x0,0x03,0xA1,0x0,0xB2}; //搜索指纹搜索范围0 - 929011.unsigned char FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0 x0,0x0,0x0,0x13,0x0,0x21};//搜索0-9号指纹012.unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x0 1,0x0,0x08}; //将图像放入到BUFFER1013.unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x0 2,0x0,0x09}; //将图像放入到BUFFER2014.unsigned char FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09 }; //将BUFFER1跟BUFFER2合成特征模版015.unsigned char FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d,0x 00,0x11}; //删除指纹模块里所有的模版016.unsigned char FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01, 0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置017.unsigned char FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0x0 ,0x0,0x0,0x1,0x0,0x0}; //删除指定的模版018.019.020.//从 USART1 发送一个字节021.void USART1_SendByte(unsigned char temp)022.{023. USART_SendData(USART1, temp);024. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);025.}026.027.//从 USART1 读取一个字节028.unsigned char USART1_ReceivByte()029.{030. unsigned char recev;031. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);032. recev = USART_ReceiveData(USART1);033. return recev;034.}035.//FINGERPRINT命令字036.//FINGERPRINT_获得指纹图像命令037.void FINGERPRINT_Cmd_Get_Img(void)038.{039. unsigned char i;040.041. for(i=0;i<6;i++) //发送包头042. USART1_SendByte(FP_Pack_Head[i]);043.044. for(i=0;i<6;i++) //发送命令 0x1d045. USART1_SendByte(FP_Get_Img[i]);046.047. for(i=0;i<12;i++)//读回应答信息048. dat[i]=USART1_ReceivByte();049.}050.051.//删除所有指纹模版052.void FINGERPRINT_Cmd_Delete_All_Model(void)053.{054. unsigned char i;055.056. for(i=0;i<6;i++) //发送包头057. USART1_SendByte(FP_Pack_Head[i]);058.059. for(i=0;i<6;i++) //发送命令 0x1d060. USART1_SendByte(FP_Delet_All_Model[i]);061.062. for(i=0;i<12;i++)//读回应答信息063. dat[i]=USART1_ReceivByte();064.}065.066.//讲图像转换成特征码存放在Buffer1中067.void FINGERPRINT_Cmd_Img_To_Buffer1(void)068.{069. unsigned char i;070. for(i=0;i<6;i++) //发送包头071. {072. USART1_SendByte(FP_Pack_Head[i]);073. }074. for(i=0;i<7;i++) //发送命令将图像转换成特征码存放在CHAR_buffer1075. {076. USART1_SendByte(FP_Img_To_Buffer1[i]);077. }078. for(i=0;i<12;i++)//读应答信息079. {080. dat[i]=USART1_ReceivByte();//把应答数据存放到缓冲区081. }082.}083.084.//将图像转换成特征码存放在Buffer2中085.void FINGERPRINT_Cmd_Img_To_Buffer2(void)086.{087. unsigned char i;088. for(i=0;i<6;i++) //发送包头089. {090. USART1_SendByte(FP_Pack_Head[i]);091. }092.093. for(i=0;i<7;i++) //发送命令将图像转换成特征码存放在CHAR_buffer1094. {095. USART1_SendByte(FP_Img_To_Buffer2[i]);096. }097. for(i=0;i<12;i++)098. {099. dat[i]=USART1_ReceivByte();//读回应答信息100. }101.}102.103.//将BUFFER1 跟 BUFFER2 中的特征码合并成指纹模版104.void FINGERPRINT_Cmd_Reg_Model(void)105.{106. unsigned char i;107.108. for(i=0;i<6;i++) //包头109. {110. USART1_SendByte(FP_Pack_Head[i]);111. }112.113. for(i=0;i<6;i++) //命令合并指纹模版114. {115. USART1_SendByte(FP_Reg_Model[i]);117.118. for(i=0;i<12;i++)119. {120. dat[i]=USART1_ReceivByte();121. }122.}123.124.//存储模版到特定地址125.void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char, unsigned charucL_Char)126.{127. unsigned long temp = 0;128. unsigned char i;129.130. FP_Save_Finger[5] = ucH_Char;131. FP_Save_Finger[6] = ucL_Char;132.133.134. for(i=0;i<7;i++) //计算校验和135. temp = temp + FP_Save_Finger[i];136.137. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据138. FP_Save_Finger[8]= temp & 0x0000FF;139.140.141. for(i=0;i<6;i++)142. USART1_SendByte(FP_Pack_Head[i]); //发送包头143.144. for(i=0;i<9;i++)145. USART1_SendByte(FP_Save_Finger[i]); //发送命令将图像转换成特征码存放在 CHAR_buffer1146.147. for(i=0;i<12;i++)148. dat[i]=USART1_ReceivByte();149.}150.151.//获得指纹模板数量152.void FINGERPRINT_Cmd_Get_Templete_Num(void)153.{154. unsigned int i;155.156. for(i=0;i<6;i++) //包头157. USART1_SendByte(FP_Pack_Head[i]);159. //发送命令 0x1d160. for(i=0;i<6;i++)161. USART1_SendByte(FP_Templete_Num[i]);162.163. for(i=0;i<12;i++)164. dat[i]=USART1_ReceivByte();165.}166.167.//搜索全部用户999枚168.void FINGERPRINT_Cmd_Search_Finger(void)169.{170. unsigned char i;171. //发送命令搜索指纹库172. for(i=0;i<6;i++)173. {174. USART1_SendByte(FP_Pack_Head[i]);175. }176.177. for(i=0;i<11;i++)178. {179. USART1_SendByte(FP_Search[i]);180. }181.182. for(i=0;i<16;i++)183. {184. dat[i]=USART1_ReceivByte();185. }186.}187.188.//搜索用户0~9枚189.void FINGERPRINT_Cmd_Search_Finger_Admin(void) 190.{191. unsigned char i;192. for(i=0;i<6;i++) //发送命令搜索指纹库193. {194. USART1_SendByte(FP_Pack_Head[i]);195. }196.197. for(i=0;i<11;i++)198. {199. USART1_SendByte(FP_Search_0_9[i]);200. }201.202. for(i=0;i<12;i++)203. dat[i]=USART1_ReceivByte();204.}205.206.//添加一个新的指纹207.unsigned char FP_add_new_user(unsigned char ucH_user,unsig ned char ucL_user)208.{209. do210. {211. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像212. } while ( dat[9]!=0x0 ); //检测是否成功的按了指纹213.214. FINGERPRINT_Cmd_Img_To_Buffer1(); //将图像转换成特征码存放在Buffer1中215.216. do217. {218. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像219. } while( dat[9]!=0x0 );220.221. FINGERPRINT_Cmd_Img_To_Buffer2(); //将图像转换成特征码存放在Buffer2中222.223. FINGERPRINT_Cmd_Reg_Model(); //转换成特征码224.225. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);226.227. return 0;228.}第2个 FPM10A.hview sourceprint?01.#ifndef _FPM10A_H02.#define _FPM10A_H03.#include <stdint.h>04.05.extern unsigned char dat[18];06.07.extern void FINGERPRINT_Cmd_Get_Img();08.extern void FINGERPRINT_Cmd_Img_To_Buffer1();09.extern void FINGERPRINT_Cmd_Img_To_Buffer2();10.extern void FINGERPRINT_Cmd_Reg_Model();11.extern void FINGERPRINT_Cmd_Delete_All_Model(void);12.extern void FINGERPRINT_Cmd_Search_Finger(void);13.extern void FINGERPRINT_Cmd_Get_Templete_Num(void);14.extern void FINGERPRINT_Cmd_Search_Finger_Admin(void);15.extern void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_ Char, unsigned charucL_Char);16.extern unsigned char FP_add_new_user(unsigned char ucH_user ,unsigned charucL_user);17.18.19.extern void USART1_SendByte(unsigned char temp);20.extern unsigned char USART1_ReceivByte();21.22.extern void Delay_ms1(uint32_t nCount);23.24.void Delay_nus1(uint32_t nCount)25.{26. uint32_t j;27. while(nCount--)28. {29. j=8;30. while(j--);31. }32.}33.34.void Delay_ms1(uint32_t nCount)35.{36. while(nCount--)37. Delay_nus1(1100);38.}39.40.unsigned char test_fig()//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败41.{42. unsigned char fig_dat;43. FINGERPRINT_Cmd_Get_Img();44. Delay_ms1(20);45. fig_dat=dat[9];46. return(fig_dat);47.}48.49.#endif有了这两个东西,加入到你的工程中,就可以直接调用啦!。
指纹核心模组开发协议(通用)
指纹识别模块通信协议一、通信方式指纹模块作为从设备,由主设备发送相关命令对其进行控制。
命令接口:UART(通用异步串口)19200bps 1起始位1停止位(无校验位)主设备发送的命令及DSP模块的应答按数据长度可分为两类:说明:CMD:命令/应答类型P1,P2,P3:命令参数Q1,Q2,Q3:应答参数,Q3多用于返回操作的有效性信息,此时可有如下取值:#define ACK_SUCCESS 0x00 //操作成功#define ACK_FAIL 0x01 //操作失败#define ACK_FULL 0x04 //指纹数据库已满#define ACK_NOUSER 0x05 //无此用户#define ACK_USER_OCCUPIED 0x06 //用户已存在#define ACK_FINGER_OCCUPIED 0x07 //指纹已存在#define ACK_TIMEOUT 0x08 //采集超时CHK:校验和,为第2字节到第6字节的异或值2)> 8字节,数据由两部分组成:数据头+数据包CMD,Q3的定义同上Len:数据包内有效数据长度,16位,由两字节组成Hi(Len):数据包长度高8位Low(Len):数据包长度低8位CHK:校验和,为第2字节到第6字节的异或值数据包格式:说明:Len即为Data的字节数;CHK:校验和,为第2字节到第Len + 1字节的异或值发送完数据头后紧接着发送数据包。
二、命令类型2.1 修改模块序列号(命令/应答均为8字节)说明:序列号为24位的一个常数,每个DSP模块不一样,可用于区别不同的DSP 模块。
取DSP模块内部序列号(命令/应答均为8字节)2.22.3 使模块进入休眠状态(命令/应答均为8字节)2.4设置/读取指纹添加模式(命令/应答均为8字节)指纹添加分两种模式:允许重复模式/禁止重复模式, 在”禁止重复模式”下,同一枚手指只能添加一个用户,若强行进行第二轮添加将返回错误信息。
ZAZ用户手册
深圳市指昂科技有限公司Shenzhen Zhi Ang Science and Technology Co., Ltd.ZAZ-050指纹识别模块目录第一章概述 (3)1.1 产品原理介绍 (3)1.2 产品规格 (3)第二章硬件接口 (4)2.1 上电延时时间 (4)2.2 接口定义(TTL电平) (4)2.3 接口定义(USB电平).................................................................... 错误!未定义书签。
第三章系统资源 . (5)3.1 缓冲区 (5)3.1.1 图像缓冲区 (5)3.1.2 特征文件缓冲区 (5)3.2 指纹库 (5)3.3 系统配置参数 (5)3.3.1 波特率控制(参数序号:4) (5)3.3.2 安全等级(参数序号:5) (5)3.3.3 数据包长度(参数序号:6) (5)第四章通讯协议 (6)1. 数据包格式 (6)2. 数据包的校验与应答 (6)第五章模块指令系统 (7)1 指纹处理类指令 (7)1)获取图像ZAZ_GetImg (7)2)图像生成特征ZAZ_GenChar (7)3)特征合成模板ZAZ_RegModel (8)4)上传特征或模板ZAZ_UpChar (8)5)下载特征或模板ZAZ_DownChar (8)6)存储模板ZAZ_Store (9)7)读出模板ZAZ_LoadChar (9)8)删除模板ZAZ_DeletChar (10)9)清空指纹库ZAZ_Empty (10)10)精确比对两枚指纹特征ZAZ_Match (10)11)搜索指纹ZAZ_Search (11)12)读有效模板个数ZAZ_TempleteNum (11)2 系统设置类指令 (11)13)设置模块系统基本参数ZAZ_SetSysPara (11)15)读系统参数ZAZ_ReadSysPara (12)14)写记事本ZAZ_WriteNotepad (12)16)读记事本ZAZ_ ReadNotepad (13)17)读取指纹库列表ZAZ_ ReadFpflash (13)第六章开发流程图 (14)第七章设备尺寸图 (15)第一章概述ZAZ-050指纹模块系指昂科技推出的,以高速DSP处理器为核心,结合具有公司自主知识产权的光学指纹传感器,具有指纹录入、图像处理、指纹比对、搜索和模板储存等功能的智能型模块。
FPC1020指纹模块用户使用手册
IDWD1020指纹识别模块用户手册IDWD1020 Fingerprint Module User’s Guide(Ver 1.1)北京艾迪沃德科技发展有限公司2014年6月第二版目录(一)概述 (1)(二)通讯协议 (2)2.1通讯处理过程 (2)2.2通讯包P ACKET 的分类 (3)2.2.1命令包Command packet (3)2.2.2响应包Response packet (3)2.2.3指令/响应的数据包Data Packet (3)2.3通讯包的帧结构 (4)2.3.1通讯包Parket识别代码 (4)2.3.2命令包(Command packet )的帧结构 (4)2.3.3响应包(Response packet)的帧结构 (5)2.3.4指令数据包(Command Data Packet)的帧结构 (5)2.3.5响应数据包(Response data packet)的帧结构 (6)(三)通讯命令(COMMAND )综述 (7)3.1指纹特征模板(T EMPLATE R ECORD)的数据结构 (7)3.2命令列表(C OMMAND L IST ) (7)(四)各通讯命令(COMMAND)详细说明 (9)4.1连接测试(CMD_TEST_CONNECTION) (9)4.2设置参数(CMD_SET_PARAM) (10)4.3读取参数(CMD_GET_PARAM) (13)4.4读取设备信息(CMD_DEVICE_INFO) (14)4.5使模块进入IAP模式(CMD_ENTER_IAP_MODE) (15)4.6采集指纹图像(CMD_GET_IMAGE) (16)4.7检测手指(CMD_FINGER_DETECT) (17)4.8上传指纹图像到主机(CMD_UP_IMAGE_CODE) (18)4.9下载指纹图像到模块(CMD_DOWN_IMAGE) (20)4.10控制采集器背光灯(CMD_SLED_CTRL)开/关 (22)4.11保存指纹模板数据到模块指纹库(CMD_STORE_CHAR) (23)4.12读取指纹库中的指纹并暂存在指定的R AM B UFFER中(CMD_LOAD_CHAR) (24)4.13将暂存在R AM B UFFER中的指纹模板上传到主机(CMD_UP_CHAR) (25)4.14下载指纹模板数据到模块指定的R AM B UFFER(CMD_DOWN_CHAR) (26)4.15删除指定编号范围内的指纹(CMD_DEL_CHAR) (28)4.16获取指定编号范围内可注册的首个编号(CMD_GET_EMPTY_ID) (29)4.17检查指定的编号是否已被注册(CMD_GET_STATUS) (30)4.18检查指定编号范围内的指纹库是否有数据损坏(CMD_GET_BROKEN_ID) (31)4.19获取指定编号范围内已注册的指纹总数(CMD_GET_ENROLL_COUNT) (32)4.20从暂存在I MAGE B UFFER中的指纹图像产生模板(CMD_GENERATE) (33)4.21合成指纹模板数据用于入库(CMD_MERGE) (34)4.22指定2个R AM B UFFER之间的模板做比对(CMD_MATCH) (35)4.23指定编号范围的1:N识别(CMD_SEARCH) (36)4.24指定R AM B UFFER与指纹库中指定编号的模板比对(CMD_VERIFY) (37)4.25设置模块序列号(CMD_SET_MODULE_SN) (38)4.26读取模块序列号(CMD_GET_MODULE_SN) (40)4.27取消采集指纹(CMD_FP_CANCEL) (41)4.28获取已注册ID列表(CMD_GET_ENROLLED_ID_LIST) (42)4.29进入休眠状态(CMD_ENTER_STANDBY_STATE) (44)4.30通讯错误返回(I NCORRECT C OMMAND) (45)4.31注意事项 (45)(五)响应(RESPONSE)及错误代码表(ERROR CODE) (46)(六)登记及比对流程图 (47)6.1光学及面阵式半导体指纹采集器模块的注册流程(E NROLL P ROCESS) (47)6.2滑动采集器模块的注册流程(E NROLL P ROCESS) (48)6.3光学及面阵式半导体采集器模块的验证及识别流程(V ERIFY &I DENTIFY) (49)6.4滑动采集器模块指纹验证和识别流程(V ERIFY &I DENTIFY ) (50)(七)硬件描述 (51)7.1主处理板尺寸 (51)7.2指纹传感器尺寸图..................................... 错误!未定义书签。
(完整版)指纹识别模块单片机程序
(完整版)指纹识别模块单片机程序#include#include#define TRUE 1unsigned char SaveNumber=0,searchnum=0;unsigned int S earchNumber=0;unsigned int clk0=0;sbit relay =P1^4; //继电器引脚sbit buzzer=P1^5; //蜂鸣器引脚sbit red= P2^7;//录入模式指示灯在板子靠近单片机处sbit green= P2^0;//识别模式指示灯在板子远离单片机处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液晶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,0x1b}; //回送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 :根据原始图像生成指纹特征1unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08}; //回送12个//Gen Templet2 :根据原始图像生成指纹特征2unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12个//Search Finger :以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库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。
as608指纹模块通信原理
as608指纹模块通信原理
AS608指纹模块的通信原理主要涉及指纹图像的获取、处理和比对。
模块
内部内置了手指探测电路,用户可以通过读取状态引脚(TouchOut)判断
有无手指按下。
当有手指按下时,指纹图像被模块内部的指纹传感器获取。
指纹图像获取后,指纹算法从图像中提取指纹特征,这些特征代表了指纹信息。
这些特征将被用于后续的指纹匹配过程。
在指纹登录过程中,对每一枚指纹录入2次,将2次录入的图像进行处理,合成模板存储于模块中。
在指纹匹配过程中,通过指纹传感器,录入要验证的指纹图像并进行处理,然后与模块中的指纹模板进行匹配比较。
匹配方式有两种:指纹比对(1:1)和指纹搜索(1:N)。
在指纹比对方式中,将录入指纹与模块中指定的一个模板进行匹配。
在指纹搜索方式中,将录入指纹与多个模板进行匹配。
最后,模块给出匹配结果,判断录入指纹是否与模板匹配。
以上内容仅供参考,建议查阅关于AS608指纹模块的专业资料,或咨询其
生产厂商,获取更准确的信息。
海凌科指纹模块编程代码
海凌科指纹模块编程代码【最新版】目录1.海凌科指纹模块编程代码概述2.海凌科指纹模块编程代码结构3.海凌科指纹模块编程代码实现功能4.海凌科指纹模块编程代码应用场景5.海凌科指纹模块编程代码的优点与不足正文一、海凌科指纹模块编程代码概述海凌科指纹模块编程代码是一种基于海凌科指纹识别技术的编程代码,可用于开发各种指纹识别应用,如门禁系统、手机解锁、金融支付等。
通过使用海凌科指纹模块编程代码,开发者可以实现指纹识别功能,为用户带来便捷、安全的体验。
二、海凌科指纹模块编程代码结构海凌科指纹模块编程代码主要包括以下几个部分:1.指纹识别模块:负责读取指纹信息,并将其转换为可识别的数字信号。
2.数据处理模块:负责对指纹信号进行处理,提取特征点,并将其与已存储的指纹特征进行对比。
3.通信接口模块:负责与外部设备进行通信,如与主控制器进行数据交互。
4.密码验证模块:在指纹识别失败时,提供备用的密码验证功能。
三、海凌科指纹模块编程代码实现功能海凌科指纹模块编程代码可实现以下功能:1.指纹识别:通过指纹识别模块读取用户指纹,并将其转换为数字信号,用于后续处理。
2.指纹匹配:数据处理模块负责对指纹信号进行处理,提取特征点,并将其与已存储的指纹特征进行对比,以判断用户身份。
3.通信交互:通过通信接口模块与外部设备进行数据交互,如与主控制器进行数据传输。
4.密码验证:在指纹识别失败时,可通过密码验证模块提供备用的身份验证功能。
四、海凌科指纹模块编程代码应用场景海凌科指纹模块编程代码可应用于以下场景:1.门禁系统:通过指纹识别技术,实现对建筑物或房间的出入管理。
2.手机解锁:将指纹识别功能集成到手机中,实现快速、安全的手机解锁。
3.金融支付:通过指纹识别技术,实现对金融账户的便捷、安全管理。
五、海凌科指纹模块编程代码的优点与不足优点:1.安全性高:指纹识别技术具有较高的识别准确率,可有效防止伪造和冒用。
2.便捷性强:用户无需携带钥匙、卡片等物品,只需通过指纹即可实现身份验证。
海凌科指纹模块编程代码
海凌科指纹模块编程代码【原创版】目录1.海凌科指纹模块编程代码概述2.海凌科指纹模块编程代码的具体内容3.海凌科指纹模块编程代码的应用领域4.海凌科指纹模块编程代码的发展前景正文一、海凌科指纹模块编程代码概述海凌科指纹模块编程代码是指用于控制和操作海凌科指纹识别模块的一组指令。
海凌科是一家专注于生物识别技术研发和应用的公司,其指纹识别模块被广泛应用于各种场景,如手机解锁、门禁系统等。
通过编程代码,开发者可以实现对海凌科指纹识别模块的控制,以满足不同应用场景的需求。
二、海凌科指纹模块编程代码的具体内容海凌科指纹模块编程代码主要包括以下几个方面:1.初始化:在开始使用指纹识别模块之前,需要对其进行初始化。
初始化过程中,需要设置一些参数,如传感器类型、通信方式等。
2.注册指纹:用户在使用指纹识别功能之前,需要先注册指纹。
注册过程中,用户需要多次录入指纹,以便系统能够准确识别。
3.识别指纹:在实际应用中,用户需要通过指纹识别来实现某些功能,如解锁手机。
此时,开发者需要调用识别指纹的函数,将采集到的指纹信息与已注册的指纹信息进行比对,以判断是否匹配。
4.删除指纹:用户可以随时删除已注册的指纹,以便保护个人隐私。
开发者需要提供相应的接口,以便用户实现指纹的删除。
三、海凌科指纹模块编程代码的应用领域海凌科指纹模块编程代码广泛应用于以下几个领域:1.消费电子:如手机、平板电脑等设备,可以实现指纹解锁、支付等功能。
2.安防门禁:通过指纹识别技术,可以实现对特定区域的安全控制。
3.办公场所:例如考勤系统,可以通过指纹识别来记录员工上下班时间。
4.智能家居:如智能门锁等设备,可以实现通过指纹识别来控制家庭设备。
四、海凌科指纹模块编程代码的发展前景随着科技的不断发展,生物识别技术越来越受到重视。
作为其中的一种,指纹识别技术具有便捷、安全等特点,有着广阔的发展前景。
指纹模块读写通信程序
#include"p24FJ64GA006.h"#define uchar unsigned char#define uint unsigned int#define ushort unsigned shortuchar contact_numcomp,Timer_count1ms,Timer_1ms_bit,Timer_10ms_bit;uchar t_fig=0,U2TX_buf_nums,U2RX_buf_nums,U2TX_total;uchar Timer_count10ms,Timer_100ms_bit,Timer_count100ms,Timer_1S_bit;uchar rec_nodata_flag=0,rec_start_data_flag,turnoff_light_flag;uchar send_data_flag,rec_error_flag,rec_sucessful_flag,U2RX_zhongduan_flag;uchar rec_genfail_flag,rec_orderfail_flag,send_couples,send_over_flag;uchar send_choose_num,send_couples_add,first_flag,fen_xi_dis_flag;uchar udd=0,udd_i=0,jiaoyan_valu,rec_ok_flag,rec_success_flag;uint rec_cycle_nums_flag;uint nb=0,nbm=0;//operate-------------------------------------------------------------//uchar init_success_trans;uchar search_finger_flag,rec_turnon_light_flag,rec_answer_gather_flag;uchar rec_answer_stigma_flag,rec_answer_ok_finger_flag,rec_answer_no_finger_flag; uchar not_finger_flag,correct_finger_flag;ushortrec_packet_error_flag,no_finger_flag,finger_messy_flag,init_success_flag,getimage_sucs_flag; //-------------------------------------------------------------------------------//uchar U2_send_buff[50];uchar U2_rec_buf[50];uchar U2RX_rec_buf[50];uchar transit_buff[12];uchar touma_buff[13]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x1f,0x00,0x00,0x24,};//EF 01 FF FF FF FF 01 00 04 1F 00 00 24uchar send_on_backled_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x50,0x00,0x54,};uchar send_off_backled_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x51,0x00,0x55,};uchar send_get_imgfree_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x52,0x00,0x56,};uchar send_img_TZ_buff[12]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x02,0x01,0x00,0x08 };uchar send_search_img_buff[16]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x08,0x04,0x01,0x00,0x01,0x00,0x63,0x00,0x72,};//EF 01 FF FF FF FF 01 00 08 04 01 00 01 00 63 00 72void delay_us(uint i){while(i--);}void delay_ms(uint j){while(j--){delay_us(3000);}}/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //-----------------------------------------------------------------/////////////////////////////////////////void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void) {uchar i;IFS1bits.U2RXIF=0;IEC1bits.U2RXIE=0;U2RX_zhongduan_flag=1;U2RX_buf_nums=0;if(U2STAbits.OERR==1){U2STAbits.OERR=0;}while(U2STAbits.URXDA==1&&U2RX_buf_nums<42){while(U2STAbits.URXDA){U2RX_rec_buf[U2RX_buf_nums++]=U2RXREG;}delay_us(800);}nbm++;}void __attribute__((interrupt, no_auto_psv)) _U2TXInterrupt(void) {uchar i;IFS1bits.U2TXIF=0;IEC1bits.U2TXIE=0;U2TX_buf_nums=0;while(U2TX_buf_nums<U2TX_total){while(U2STAbits.UTXBF==0&&U2TX_buf_nums<U2TX_total){U2TXREG=U2_send_buff[U2TX_buf_nums++];}}U2TX_buf_nums=0;send_over_flag=1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void main(void){OSCCONbits.COSC=0;CLKDIVbits.DOZE=0;CLKDIVbits.RCDIV=0;AD1PCFG=0xffff;CNPU1=0;CNPU2=0; //引脚上拉CNEN1=0;CNEN2=0; //引脚中断允许禁止TRISFbits.TRISF5=0;TF5=1;//ODCFbits.ODF5=1;TRISFbits.TRISF4=1;TRISE=0x00;TRISCbits.TRISC14=0;ODCCbits.ODC14=1;TC14=0;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////U2BRG=16;U2MODEbits.UARTEN=1;IDL=1;U2MODEbits.IREN=0;U2MODEbits.UEN=0;U2MODEbits.ABAUD=0;U2MODEbits.BRGH=0;U2MODEbits.PDSEL=0;U2MODEbits.STSEL=0;U2STAbits.UTXISEL1=0; //00=当一个字符被送入时产生中断;U2STAbits.UTXISEL0=1; //10=当一个字符被导致发送缓冲器位空时产生中断U2STAbits.URXISEL=0; //11=在PSR传送使接收缓冲器满时产生中断;//00=当接收缓冲器接收到从PSR传来的任何字符时产生中断;U2STAbits.ADDEN=0;U2STAbits.UTXEN=1; //使能发送IFS1bits.U2RXIF=0; //清中断标志位IFS1bits.U2TXIF=0;SR=0;IPC7bits.U2RXIP=0x07;IPC7bits.U2TXIP=0x02;///////////////////////////////////////////////////////////////////INTCON1=0x8000;U2TX_buf_nums=0;U2TX_total=18;send_couples=0;send_choose_num=1;first_flag=1;U2RX_zhongduan_flag=0;search_finger_flag=1;rec_turnon_light_flag=0;rec_sucessful_flag=0;rec_start_data_flag=0;IEC1bits.U2RXIE=1;IEC1bits.U2TXIE=1;while(1){delay_ms(500);}}/*else if(init_success_trans==1&&no_finger_flag==1){no_finger_flag=0;init_success_trans=0;delay_ms(2000);}*/。
指纹识别模块说明书
指纹识别模块实验注:此说明书适用于EL-EMCU-I实验箱、EXP-89S51/52/53CPU板。
一、实验目的掌握指纹模块的开发协议;掌握16C550芯片的编程方法;二、实验设备计算机,KEIL UVISION2环境,EL-EMCU-I实验箱,直连串口电缆、交叉串口电缆(针对针),导线,短接块。
三、基本原理指纹识别模块采用MCU和PC两种控制方法,供用户灵活选用。
其指纹模块采用深圳十指科技的TF-MD-M12开发模块,MCU端的外围电路由通过芯片16C550芯片进行并口到串口的转换,PC端的外围电路用MAX3232控制,模块的电源由实验箱上的接口插座提供。
下面将具体介绍一下各部分的组成及其原理。
TF-MD-M12开发模块的功能特点:◇先进的指纹识别算法(商业);◇高速算法,500人指纹只要0.43 秒;◇1:N,1:1 比对(两种可选);◇用户可分多级权限管理(1、2、3);◇多级的安全级别自主设置,可更多应用于不同场所;◇采用高精密的光学成像元件,识别准确;◇体积小,电路只有:40*58mm,易于集成;◇功能高度集成,存于DSP中,不用再加电路板;◇标准接口协议,开发简单;◇采用面光源,成像速度快;◇内部采用高级数字处理器DSP,处理速度快;◇识别率高,最高可达:0.00001% ;◇稳定性好,四年不断升级和优化;◇具低电压报警功能;◇微功耗设计适于电池供电;◇主板低频设计抗外部电磁干扰;◇主要供外销厂家和集成商,开发和集成产品;◇设计精巧适于嵌入指纹锁/小指纹门禁机/手持指纹识别设备;TF-MD-M12开发模块的主要性能指标:◇电路板尺寸(mm)58×40◇采集头分辨率500DPI◇指纹容量80 枚◇比对时间<1 秒◇认假率0.0001%◇拒真率0.01%◇动态电流<140mA◇待机电流<18µA◇工作电压5-7.5V其开发协议请用户参见随程序附带的TF-MD-M1开发协议PDF文档。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include"p24FJ64GA006.h"#define uchar unsigned char#define uint unsigned int#define ushort unsigned shortuchar contact_numcomp,Timer_count1ms,Timer_1ms_bit,Timer_10ms_bit;uchar t_fig=0,U2TX_buf_nums,U2RX_buf_nums,U2TX_total;uchar Timer_count10ms,Timer_100ms_bit,Timer_count100ms,Timer_1S_bit;uchar rec_nodata_flag=0,rec_start_data_flag,turnoff_light_flag;uchar send_data_flag,rec_error_flag,rec_sucessful_flag,U2RX_zhongduan_flag;uchar rec_genfail_flag,rec_orderfail_flag,send_couples,send_over_flag;uchar send_choose_num,send_couples_add,first_flag,fen_xi_dis_flag;uchar udd=0,udd_i=0,jiaoyan_valu,rec_ok_flag,rec_success_flag;uint rec_cycle_nums_flag;uint nb=0,nbm=0;//operate-------------------------------------------------------------//uchar init_success_trans;uchar search_finger_flag,rec_turnon_light_flag,rec_answer_gather_flag;uchar rec_answer_stigma_flag,rec_answer_ok_finger_flag,rec_answer_no_finger_flag; uchar not_finger_flag,correct_finger_flag;ushortrec_packet_error_flag,no_finger_flag,finger_messy_flag,init_success_flag,getimage_sucs_flag; //-------------------------------------------------------------------------------//uchar U2_send_buff[50];uchar U2_rec_buf[50];uchar U2RX_rec_buf[50];uchar transit_buff[12];uchar touma_buff[13]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x1f,0x00,0x00,0x24,};//EF 01 FF FF FF FF 01 00 04 1F 00 00 24uchar send_on_backled_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x50,0x00,0x54,};uchar send_off_backled_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x51,0x00,0x55,};uchar send_get_imgfree_buff[11]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x52,0x00,0x56,};uchar send_img_TZ_buff[12]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x02,0x01,0x00,0x08 };uchar send_search_img_buff[16]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x08,0x04,0x01,0x00,0x01,0x00,0x63,0x00,0x72,};//EF 01 FF FF FF FF 01 00 08 04 01 00 01 00 63 00 72void delay_us(uint i){while(i--);}void delay_ms(uint j){while(j--){delay_us(3000);}}/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //-----------------------------------------------------------------/////////////////////////////////////////void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void) {uchar i;IFS1bits.U2RXIF=0;IEC1bits.U2RXIE=0;U2RX_zhongduan_flag=1;U2RX_buf_nums=0;if(U2STAbits.OERR==1){U2STAbits.OERR=0;}while(U2STAbits.URXDA==1&&U2RX_buf_nums<42){while(U2STAbits.URXDA){U2RX_rec_buf[U2RX_buf_nums++]=U2RXREG;}delay_us(800);}nbm++;}void __attribute__((interrupt, no_auto_psv)) _U2TXInterrupt(void) {uchar i;IFS1bits.U2TXIF=0;IEC1bits.U2TXIE=0;U2TX_buf_nums=0;while(U2TX_buf_nums<U2TX_total){while(U2STAbits.UTXBF==0&&U2TX_buf_nums<U2TX_total){U2TXREG=U2_send_buff[U2TX_buf_nums++];}}U2TX_buf_nums=0;send_over_flag=1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void main(void){OSCCONbits.COSC=0;CLKDIVbits.DOZE=0;CLKDIVbits.RCDIV=0;AD1PCFG=0xffff;CNPU1=0;CNPU2=0; //引脚上拉CNEN1=0;CNEN2=0; //引脚中断允许禁止TRISFbits.TRISF5=0;TF5=1;//ODCFbits.ODF5=1;TRISFbits.TRISF4=1;TRISE=0x00;TRISCbits.TRISC14=0;ODCCbits.ODC14=1;TC14=0;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////U2BRG=16;U2MODEbits.UARTEN=1;IDL=1;U2MODEbits.IREN=0;U2MODEbits.UEN=0;U2MODEbits.ABAUD=0;U2MODEbits.BRGH=0;U2MODEbits.PDSEL=0;U2MODEbits.STSEL=0;U2STAbits.UTXISEL1=0; //00=当一个字符被送入时产生中断;U2STAbits.UTXISEL0=1; //10=当一个字符被导致发送缓冲器位空时产生中断U2STAbits.URXISEL=0; //11=在PSR传送使接收缓冲器满时产生中断;//00=当接收缓冲器接收到从PSR传来的任何字符时产生中断;U2STAbits.ADDEN=0;U2STAbits.UTXEN=1; //使能发送IFS1bits.U2RXIF=0; //清中断标志位IFS1bits.U2TXIF=0;SR=0;IPC7bits.U2RXIP=0x07;IPC7bits.U2TXIP=0x02;///////////////////////////////////////////////////////////////////INTCON1=0x8000;U2TX_buf_nums=0;U2TX_total=18;send_couples=0;send_choose_num=1;first_flag=1;U2RX_zhongduan_flag=0;search_finger_flag=1;rec_turnon_light_flag=0;rec_sucessful_flag=0;rec_start_data_flag=0;IEC1bits.U2RXIE=1;IEC1bits.U2TXIE=1;while(1){delay_ms(500);}}/*else if(init_success_trans==1&&no_finger_flag==1){no_finger_flag=0;init_success_trans=0;delay_ms(2000);}*/。