AS608 是一款常用的指纹识别模块,广泛应用于各种身份验证和安全系统中。AS608 使用光学传感器捕捉指纹图像,具有较高的灵敏度和分辨率,能够清晰识别指纹的细节。每个指纹可以转换为模板,存储在模块内。模板通常包含特征点的信息,以提高识别的准确性。
模板指的是经过处理后提取出的指纹特征信息。具体来说,模板是一个数字化的表示,包含指纹的独特特征点及其相互关系,而不是原始的指纹图像。
AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供 2 次开发的指纹模块;所以,只要是基于 AS608 芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。
ATK-AS608
引脚描述
WAK:当手指放在传感器上时,WAK 会被拉高到高电平。初始化时,WAK 引脚的默认状态通常是低电平,MCU 通过轮询 WAK 状态来判断手指是否按下。在正常工作时,WAK 会在有手指时变为高电平,而没有手指时保持低电平。你无需将其初始化为高电平。
通信协议
模块指令格式
模块指令格式分为三种:命令包格式、数据包格式、结束包格式。
包标识 = 01 命令包
包标识 =02 数据包,且有后续包
包标识 =08 最后一个数据包,即结束包
所有的数据包都要加包头:0xEF01
发送给模块和接收模块的数据包格式相同。
数据包不能单独进入执行流程,必须跟在指令包或应答包后面。
包长度 = 包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不包含包长度本身的字节数。
校验和是从包标识至校验和之间所有字节之和,超出 2 字节的进位忽略。
芯片地址在没有生成之前为缺省的 0xFFFFFFFF,一旦上位机通过指令生成了芯片 地址,则所有的数据包都必须按照生成的地址收发。芯片将拒绝地址错误的数据 包。
对于多字节的高字节在前低字节在后 (如 2bytes 的 00 06 表示 0006,而不是 0600)。
具体的指令码需要查看数据手册;
模块应答格式
应答是将有关命令执行情况与结果上报给上位机,应答包含有参数,并可跟后续数据包。 上位机只有在收到模块的应答包后才能确认模块收包情况与指令执行情况。模块应答包中包 含一个参数:确认码。确认码表示执行指令完毕的情况。
指令只能由上位机下给模块,模块向上位机应答。
不同的指令所返回的应答模块的确认码是不同的,我们只需要判断他所返回的几个状态就可以了;
系统上电复位后将首先检查默认的设备握手口令是否被修改,若未被修改,则系统 认为上位机没有验证口令的需求,SOC 直接进入正常工作状态;若已被修改,则必须首先验证设备握手口令,口令通过后 SOC 才进入正常工作状态。
口令和地址
系统默认口令为 0,可通过指令修改。若默认口令未被修改,则系统不要求验证口令, 上位机和 MCU 与芯片通讯;若口令被修改,则上位机与芯片通讯的第一个指令必须是验证 口令,只有口令验证通过后,芯片才接收其它指令。注:不建议修改口令!
芯片的默认地址为 0Xffffffff,可通过指令修改,数据包的地址域必须与该地址相配,命令包/数据包才被系统接收。
缓冲区与指纹库
系统内设有一个 72K 字节的图像缓冲区与二个 512bytes 大小的特征文件缓冲区,名字 分别称为:ImageBuffer,CharBuffer1 和 CharBuffer2。用户可以通过指令读写任意一个缓冲区。 CharBuffer1 或 CharBuffer2 既可以用于存放普通特征文件也可以用于存放模板特征文件。通过 UART 口上传或下载图像时为了加快速度,只用到像素字节的高 4 位,即将两个像素合 成一个字节传送。通过 USB 口则是整 8 位像素。
指纹库容量根据挂接的 FLASH 容量不同而改变,系统会自动判别。指纹模板按照序号存放,序号定义为:0—(N-1)(N 为指纹库容量)。用户只能根据序号访问指纹库内容。
硬件连接
原理图
软件实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
sbit WAK = P3^7;
while(1) { if(WAK == 1) { shuazhiwen(); } }
void shuazhiwen() { uchar IDs1,IDs2,IDs3; SFG_identify(); while(querenma == 1) SFG_identify(); if(querenma == 0) { LcmClearTXT(); PutStr(1,2,"门已打开"); IDs1=PageID/100; IDs2=PageID/10%10; IDs3=PageID%10; PutStr(2,1,"编号为:"); WriteCommand(0x8D); WriteData(0x30 + IDs1); WriteData(0x30 + IDs2); WriteData(0x30 + IDs3); jidianqi = 0; delay(2500); jidianqi = 1; delay(1000); PutStr(0,0," 欢迎使用 "); PutStr(1,0," 多功能门禁锁 "); PutStr(2,0," 请输入密码: "); sc = 0; } else if(querenma == 9) { LcmClearTXT(); PutStr(1,1,"没搜索到指纹"); PutStr(2,1,"请重新按手指"); beep = 0; delay(300); beep = 1; delay(1000); PutStr(0,0," 欢迎使用 "); PutStr(1,0," 多功能门禁锁 "); PutStr(2,0," 请输入密码: "); sc++; } }
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 << 8) + ID2; }
unsigned char Keycan(void) { unsigned char rcode, ccode; P1 = 0xF0; 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; while((P1&0xF0) != 0xF0); return ((~rcode) + (~ccode)); 0000 0001 + 0100 0000 => 0100 0001 }else rcode = (rcode<<1)|0x01; } } } return 0; }
|
推挽输出
推挽模式不支持线与,因为可能会导致 mos 管烧掉
开漏输出