跋扈洋

  • 56 主题
  • 122 帖子
  • 790 积分
  • 身份:版主
  • 论坛新秀
  • E币:216

【原创】基于STM32的智能指纹锁

2020-9-16 10:37:08 显示全部楼层
一、 简介

AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。

二、 外型
(4).jpg
(3).jpg
(2).jpg
(1).jpg
1.png
三、 AS608模块引脚描述
  • Vi 模块电源正输入端。
  • Tx 串行数据输出。 TTL 逻辑电平
  • Rx 串行数据输入。 TTL 逻辑电平
  • GND 信号地。内部与电源地连接
  • WAK 感应信号输出,默认高电平有效
    (用户可读取状态引脚(WAK)判断有无手指按下)
  • Vt 触摸感应电源输入端,.3v 供电
  • U+ USB D+
  • U- USB D-
四、 系统资源
  • 缓冲区与指纹库
    系统内设有一个 72K 字节的图像缓冲区与二个 512bytes 大小的特征文件缓冲区,名字分别称为:ImageBuffer,CharBuffer1 和 CharBuffer2。用户可以通过指令读写任意一个缓冲区。
    CharBuffer1 或 CharBuffer2 既可以用于存放普通特征文件也可以用于存放模板特征文件。通过 UART 口上传或下载图像时为了加快速度,只用到像素字节的高 4 位,即将两个像素合
    成一个字节传送。通过 USB 口则是整 8 位像素。
    指纹库容量根据挂接的 FLASH 容量不同而改变,系统会自动判别。指纹模板按照序号存放,序号定义为:0—(N-1)(N 为指纹库容量)。用户只能根据序号访问指纹库内容。
  • 用户记事本
    系统在 FLASH 中开辟了一个 512 字节的存储区域作为用户记事本,该记事本逻辑上被分成 16 页,每页 32 字节。上位机可以通过 PS_WriteNotepad 指令和 PS_ReadNotepad 指令
    访问任意一页。注意写记事本某一页的时候,该页 32 字节的内容被整体写入,原来的内容被覆盖。
  • 随机数产生器
    系统内部集成了硬件 32 位随机数生成器(不需要随机数种子),用户可以通过指令让模块产生一个随机数并上传给上位机。
    五、 软件开发
  • 模块地址 (大小:4bytes ,属性:读写) )
    模块的默认地址为0xFFFFFFFF,可通过指令修改,数据包的地址域必须与该地址相配,命令包/数据包才被系统接收。 注:与上位机通讯必须是默认地址 0xFFFFFFFF !
  • 模块口令 (大小:4bytes ,属性:写)
    系统默认口令为 0,可通过指令修改。若默认口令未被修改,则系统不要求验证口令,
    上位机和 MCU 与芯片通讯;若口令被修改,则上位机与芯片通讯的第一个指令必须是验证
    口令,只有口令验证通过后,芯片才接收其它指令。 注:不建议修改口令!
  • 数据包大小设置(大小:1bytes ,属性:读写)
    发送数据包和接收数据包的长度根据该值设定。
  • 波特率数 系数 N 设置 (大小:1bytes ,属性:读写)
    USART 波特率=N×9600,N=1~12。
  • 安全等级 level 设置(大小:1bytes ,属性:读写)
    系统根据安全等级设定比对阀值,level=1~5。安全等级为 1 时认假率最高,拒认率最低。
    安全等级为 5 时认假率最低,拒认率最高。
六、 开发流程

   录入
222.png
刷指纹
33.png
七、 使用原理

利用光的折射和反射原理,光从底部射向三棱镜,并经棱镜射出,射出的光线在手指表面指纹凹凸不平的线纹上折射的角度及反射回去的光线明暗就会不一样。CMOS或者CCD的光学器件就会收集到不同明暗程度的图片信息,就完成指纹的采集。

八、核心代码



  1. //录指纹
  2. void Add_FR(void)
  3. {
  4.         u8 i=0,ensure ,processnum=0;
  5.         while(1)
  6.         {
  7.                 switch (processnum)
  8.                 {
  9.                         case 0:
  10.                                 i++;
  11.         printf("please finger\n");   //请按手指
  12.                                 ensure=PS_GetImage();//录入图像返回字
  13.                                 if(ensure==0x00)
  14.                                 {
  15.                                         ensure=PS_GenChar(CharBuffer1);//生成特征
  16.                                         if(ensure==0x00)
  17.                                         {
  18.                                                 printf("zhengque\n");//指纹正确
  19.                                                 i=0;
  20.                                                 processnum=1;//跳到第二步                                                
  21.                                         }
  22.                                         else printf("%c\n",ensure);                                       
  23.                                 }
  24.                                 else  printf("%c\n",ensure);                                                
  25.                                 break;
  26.                         
  27.                         case 1:
  28.                                 i++;
  29.                                  printf("please click on the finger\n");//再按一次手指
  30.                                 ensure=PS_GetImage();
  31.                                 if(ensure==0x00)
  32.                                 {
  33.                                         ensure=PS_GenChar(CharBuffer2);//生成特征                        
  34.                                         if(ensure==0x00)
  35.                                         {
  36.             printf("Fingerprint right\n");//指纹正确
  37.                                                 i=0;
  38.                                                 processnum=2;//跳到第三步
  39.                                         }else
  40.                                         printf("%c",ensure);        
  41.                                 }else
  42.                                 printf("%c",ensure);               
  43.                                 break;
  44.                         case 2:
  45.         printf("comparing two fingerprints\n");   //对比两次指纹
  46.                                 ensure=PS_Match();//精确比对两枚指纹特征返回字
  47.                                 if(ensure==0x00)
  48.                                 {
  49.                                         printf("Two fingerprints is the same\n");//两次指纹是一样的
  50.                                         processnum=3;//跳到第四步
  51.                                 }
  52.                                 else
  53.                                 {
  54.                                         printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指
  55.                                         printf("%c",ensure);
  56.                                         i=0;
  57.                                         processnum=0;//跳回第一步               
  58.                                 }
  59.                                 delay_ms(1000);
  60.                                 break;
  61.                         case 3:
  62.                                 printf("generate a fingerprint template\n");//产生一个指纹模板
  63.                                 ensure=PS_RegModel();
  64.                                 if(ensure==0x00)
  65.                                 {
  66.                                         printf("generate a fingerprint template is successful\n");//生成指纹模板成功
  67.                                         processnum=4;//跳到第五步
  68.                                 }else {processnum=0;printf("%c",ensure);}
  69.                                 delay_ms(1000);
  70.                                 break;
  71.                                 
  72.                         case 4:        
  73.                                 printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
  74.                                 printf("0=< ID <=299\n");        
  75.                         
  76.                         do
  77.                                        
  78.                                 {
  79.                                         if(anjian(GPIOC,GPIO_Pin_8)==0)
  80.                                 {
  81.                                    ID++;
  82.                                 
  83.                                 }
  84.                else if(anjian(GPIOC,GPIO_Pin_9)==0)
  85.        {
  86.          
  87.            ID--;   //关灯                          
  88.         }
  89.                                 }
  90.                                 while(!(ID<300));//输入DI必须小于300
  91.                                 
  92.                                 ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
  93.                                 if(ensure==0x00)
  94.                                 {                        
  95.                                         printf("Add the fingerprint successfully\n");//添加指纹成功
  96.                                         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  97.                                 
  98.                                         printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
  99.                                         delay_ms(1500);//延时后清除显示        
  100.                                         printf ("\n");
  101.                                         return ;
  102.                                 }else {processnum=0; printf("%c\n",ensure);}                                       
  103.                                 break;                                
  104.                 }
  105.                 delay_ms(800);
  106.                 if(i==5)//超过5次没有按手指则退出
  107.                 {
  108.                         printf("\n");
  109.                         break;        
  110.                 }                                
  111.         }
  112. }

  113. //刷指纹
  114. void press_FR(void)
  115. {
  116.         SearchResult seach;
  117.         u8 ensure;
  118.         ensure=PS_GetImage();
  119.         if(ensure==0x00)//获取图像成功
  120.         {        
  121.                 ensure=PS_GenChar(CharBuffer1);
  122.                 if(ensure==0x00) //生成特征成功
  123.                 {               
  124.                         ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);
  125.                         if(ensure==0x00)//搜索成功
  126.                         {                                
  127.                                 printf("search the fingerprint successfully\n");//搜索指纹成功                                
  128.                         
  129.                                 printf("Match ID:%d  Match score:%d\n",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数
  130.                                 
  131.                                 
  132.                                 if(seach.pageID==0)
  133.                                         LED=0;
  134.                         }
  135.                         else
  136.                         {
  137.                                 printf("%c",ensure);               
  138.                                         LED=1;
  139.                         }                                
  140.           }
  141.                 else
  142.                         printf("%c",ensure);
  143.          delay_ms(1000);//延时后清除显示
  144.          printf("\n");
  145.         }
  146.                
  147. }

  148. //删除指纹
  149. void Del_FR(void)
  150. {
  151.         u8  ensure;
  152.         u16 num;
  153.         printf("delete the fingerprint\n");//显示删除指纹
  154.         printf("Input ID and touch Enter!\n");//显示输入ID并按下“Enter”
  155.         printf("0=< ID <=299\n");
  156.         delay_ms(50);
  157.         
  158.         num=use_ID;//获取返回的数值
  159.         if(num==0xFFFF)
  160.                 goto MENU ; //返回主页面
  161.         else if(num==0xFF00)
  162.                 ensure=PS_Empty();//清空指纹库
  163.         else
  164.                 ensure=PS_DeletChar(num,1);//删除单个指纹
  165.         if(ensure==0)
  166.         {
  167.                 printf("delete the fingerprint successfully");//删除指纹成功               
  168.         }
  169.   else
  170.                 printf("%c",ensure);        
  171.         delay_ms(1500);//延时后清除显示
  172.         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  173.         printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
  174. MENU:        
  175.         printf("\n");
  176.         delay_ms(50);
  177.         printf("\n");
  178. }
  179. void fingerprint(void)
  180. {
  181.          u8 ensure;
  182.         /*加载指纹识别实验界面*/
  183.         printf("AS608 Fingerprint module test\n");                                                
  184.         printf("  preter \n");                                             
  185.         printf("Connect with AS608....\n");        
  186.         while(PS_HandShake(&AS608Addr))//与AS608模块握手
  187.         {
  188.                
  189.                 printf("Cannot connect with AS608!\n");
  190.                 delay_ms(1000);
  191.                
  192.                 printf("Try to connect again....\n");        
  193.                 delay_ms(1000);         
  194.         }
  195.         
  196.         printf("Connect success!\n");//通讯成功
  197.         printf("Baudrate:%d   Addr:%x",usart2_baund,AS608Addr);//显示波特率
  198.         delay_ms(100);
  199.         ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
  200.         if(ensure!=0x00)
  201.                 printf("%c",ensure);//显示确认码错误信息        
  202.         ensure=PS_ReadSysPara(&AS608Para);  //读AS608模块参数
  203.         if(ensure==0x00)
  204.         {
  205.                 printf("RemainNum:%d    Level:%d",AS608Para.PS_max-ValidN,AS608Para.PS_level);//显示剩余指纹数量和安全等级
  206.                
  207.         }
  208.         else
  209.                 printf("%c",ensure);        
  210.         
  211.         while(1)
  212.         {
  213.                  if(anjian(GPIOC,GPIO_Pin_8)==0)
  214.                                 {
  215.                                    Del_FR();                //删指纹                        
  216.                                 }
  217.                                         if(anjian(GPIOC,GPIO_Pin_9)==0)
  218.        {
  219.          
  220.            Add_FR();                //录指纹                        
  221.         }
  222.                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  223.                 {
  224.                         press_FR();//刷指纹                        
  225.                 }                                 
  226.         }         
  227. }

  228.         





最新评论

楼层直达:
我要评论
0
12
广告
关闭 热点推荐上一条 /6 下一条
快速回复 返回列表