找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16074|回复: 8
收起左侧

AS608指纹模块的单片机源码与资料

  [复制链接]
ID:378428 发表于 2018-7-24 12:57 | 显示全部楼层 |阅读模式
附件里都有,感兴趣可以自己看
0.png

1.1 概述
JM-101 指纹模块为集成了光路和指纹处理部分的一体化指纹处理模块,具有体积小、功耗低、接口简单的特点,可靠性高、识别速度快、干湿手指适应性好,指纹搜索速度快。指纹图像读取时,对干湿手指都有灵敏的反应和判断,获得最佳的成像质量,适用人群广泛。也可定制自学习适应功能,根据使用者的习惯、气候等的变化自动调整参数,做到更好的匹配。具备自学习功能,指纹识别过程中,提取新的指纹特征值识别成功后将该特征值融合到之前的指纹特征中,实际使用过程中越用越好用。
JM-101 模块还具备感应手指功能,当手指按压到指纹采集面时,模块 Touch 脚输出高电平。
JM-101 模块通讯接口为 USB 和 UART 两种通信接口, 本模块作为从设备,由主设备发送相关命令对其进行控制

0.png

Uart主机例程单片机源程序如下:
  1. #include "Prtype.h"
  2. #include "Uartport.h"
  3. #include "Protocol.h"


  4. /***************************************************************************************************
  5. ** Subroutine  : FunHandshakeModule
  6. ** Function    : 注册指纹例程
  7. ** Author      : yf
  8. ** Input       : UINT8 nTime  --   注册时需要按几次手指
  9. **               UINT16 wID   --   指纹ID号   
  10. ** Output      : 成功:CMD_OK  失败:CMD_ERR,超时:CMD_TIMEOUT  
  11. ** Description :   
  12. ** Date        : 2016/10/26
  13. ** ModifyRecord:
  14. ***************************************************************************************************/
  15. /*
  16. 1.主机->从机:发送采图命令采指纹命令
  17. 2.从机->主机:返回采集指纹结果。
  18. 3.如果没有采集到指纹循环1.2步骤直到采集到指纹 或超时
  19. 4.提取特征
  20. 5.重复1到4,如果要求注册3次需要重复5操作
  21. 6.合成模板
  22. 8.保存指纹
  23. */
  24. UINT8 ExampleErollFp(UINT8 nTime,UINT16 wID)
  25. {
  26.     UINT8 cRet, ERR, nErrTime, n;
  27.     UINT8 Buf[128];
  28.     UINT16 lenPkg;

  29. //0.先握手一下,看模块是否工作正常
  30.     cRet = FunHandshakeModule(1);
  31.     if (cRet != CMD_OK)
  32.     {
  33.             //模块不正常,再次尝试一下
  34.          cRet = FunHandshakeModule(1);
  35.         if (cRet != CMD_OK)
  36.         {
  37.                 //模块不正常
  38.             return  RT_OVERTIME;   
  39.         }
  40.     }  
  41.    
  42.     n = 0;   
  43.     while(n < nTime)
  44.     {
  45.         //1.采指纹          指令代码 29H
  46.         nErrTime = 0;
  47.         do
  48.         {
  49.             SY_memset(Buf, 0, 128);
  50.             lenPkg = 0;
  51.             cRet=CommSingleInstruction(MASK_INS, PS_GetEnrollImage, NULL,&lenPkg, Buf,&ERR,500);        
  52.                 if (cRet==CMD_OK&&ERR==0)//采集到指纹
  53.                 {
  54.                         break;
  55.                 }               
  56.                 else if (cRet==CMD_TIMEOUT)
  57.                 {
  58.                         return CMD_TIMEOUT;
  59.                 }       
  60.                 else //CMD_SUM_ERR
  61.                 {
  62.                        
  63.                 }
  64.             //超时判断
  65.             if (0)//超时退出
  66.             {
  67.                 return CMD_TIMEOUT;       
  68.             }                          
  69.         }while (1);
  70.         //1.提取特征          指令代码 02H
  71.         Buf[0]= n+1;
  72.         lenPkg=1;
  73.         cRet=CommSingleInstruction(MASK_INS, PS_GenChar, Buf,&lenPkg, Buf,&ERR,1000);      
  74.         if (cRet==CMD_OK)
  75.             {           
  76.             if (ERR==0)    //取特征成功
  77.             {       
  78.             }
  79.             else  if (ERR==1)    //表示收包有错
  80.             {       
  81.                 continue;
  82.             }
  83.             else  if (ERR==0x06)    //表示指纹图像太乱而生不成特征
  84.             {       
  85.                 continue;
  86.             }
  87.             else  if (ERR==0x07)    //表示指纹图像正常,但特征点太少而生不成特征
  88.             {       
  89.                 continue;
  90.             }
  91.             else  if (ERR==0x28)    //表示当前指纹模板与之前模板之间有关联
  92.             {       
  93.             }      
  94.             else  if (ERR==0x15)    //表示图像缓冲区内没有有效原始图而生不成图像
  95.             {       
  96.                 continue;
  97.             }        
  98.             }
  99.             else //提取特征失败
  100.             {
  101.                     return  CMD_STEP_ERR;
  102.             }           
  103.             n++;
  104.     }  
  105.     //合并模板 指令代码 05H
  106.     lenPkg=0;
  107.     cRet=CommSingleInstruction(MASK_INS, PS_RegModel, NULL,&lenPkg, Buf,&ERR,50);
  108.     if (cRet==CMD_OK&&ERR==0) //合并模板成功
  109.         {               
  110.         }
  111.         else //合并模板失败
  112.         {
  113.                 return  CMD_STEP_ERR;
  114.         }
  115.          //存储模板 指令代码 06H
  116.         Buf[0]= 1; //默认为1
  117.     Buf[1]= (wID>>8);
  118.     Buf[2]= (wID&0xff);
  119.     lenPkg=3;
  120.     cRet=CommSingleInstruction(MASK_INS,0x06, Buf,&lenPkg, Buf,&ERR,100);
  121.     if (cRet==CMD_OK&&ERR==0) //注册成功
  122.         {               
  123.         return CMD_OK;
  124.         }
  125.         else //注册失败
  126.         {
  127.                 return  CMD_STEP_ERR;
  128.         }   
  129. }




  130. /***************************************************************************************************
  131. ** Subroutine  : ExampleSeachFp
  132. ** Function    : 注册指纹例程
  133. ** Author      : yf
  134. ** Input       : UINT8 nTime  --   注册时需要按几次手指
  135. **               UINT16 wID   --   指纹ID号   
  136. ** Output      : 成功:CMD_OK  失败:CMD_ERR,超时:CMD_TIMEOUT  
  137. ** Description :   
  138. ** Date        : 2016/10/26
  139. ** ModifyRecord:
  140. ***************************************************************************************************/
  141. /*
  142. 1.主机->从机:发送采图命令采指纹命令
  143. 2.从机->主机:返回采集指纹结果。
  144. 3.如果没有采集到指纹循环1.2步骤直到采集到指纹 或超时
  145. 4.提取特征
  146. 5.搜索
  147. */
  148. UINT8 ExampleSeachFp(UINT16 *wID)
  149. {
  150.     UINT8 cRet,ERR,nErrTime,n;
  151.     UINT8 Buf[128];
  152.     UINT16 lenPkg,sSoucre,FpId;
  153.     //1.采指纹          指令代码 29H
  154.     nErrTime=0;
  155.     do
  156.     {
  157.         SY_memset(Buf,0,128);
  158.         lenPkg=0;
  159.         cRet=CommSingleInstruction(MASK_INS,0x29, NULL,&lenPkg, Buf,&ERR,500);
  160.    
  161.             if (cRet==CMD_OK&&ERR==0)//采集到指纹
  162.             {
  163.                     break;
  164.             }               
  165.             else if (cRet==CMD_TIMEOUT)
  166.             {
  167.                     return CMD_TIMEOUT;
  168.             }       
  169.             else //CMD_SUM_ERR
  170.             {
  171.                    
  172.             }
  173.         //超时判断
  174.         if (0)//超时退出
  175.         {
  176.             return CMD_TIMEOUT;       
  177.         }                          
  178.     }while (1);
  179.     //1.提取特征          指令代码 02H
  180.     Buf[0]= 1;
  181.     lenPkg=1;
  182.     cRet=CommSingleInstruction(MASK_INS,0x02, Buf,&lenPkg, Buf,&ERR,1000);      
  183.     if (cRet==CMD_OK&&ERR==0) //取特征成功
  184.         {               
  185.         }
  186.         else //提取特征失败
  187.         {
  188.                 return  CMD_STEP_ERR;
  189.         }           

  190.     //搜索 指令代码 1BH
  191.     Buf[0]= 1;
  192.     Buf[1]= 0;
  193.     Buf[2]= 0;
  194.     Buf[3]= (1024>>8);
  195.     Buf[4]= (1024&0xff);
  196.     lenPkg=5;
  197.     cRet=CommSingleInstruction(MASK_INS,0x1B, Buf,&lenPkg, Buf,&ERR,2000);
  198.     if (cRet==CMD_OK&&ERR==0) //搜索成功
  199.         {
  200.         if (lenPkg==16)
  201.         {
  202.                 sSoucre=(Buf[12]<<8)+Buf[13];
  203.                 FpId=(Buf[10]<<8)+Buf[11];
  204.                 *wID=FpId;
  205.                 return  CMD_OK;
  206.         }                    
  207.         return CMD_LOGIC_ERR ;  
  208.         }
  209.         else //合并模板失败
  210.         {
  211.                 return  CMD_STEP_ERR;
  212.         }

  213. }

  214. /***************************************************************************************************
  215. ** Subroutine  : FptEx_SaveChar
  216. ** Function    : 传感器获取指纹并生成特征上传给上位机
  217. ** Author      : Comon
  218. ** Input       : UINT8 nTime  --   注册时需要按几次手指
  219. **               UINT16 wID   --   指纹ID号   
  220. ** Output      : 成功:CMD_OK  失败:CMD_ERR,超时:CMD_TIMEOUT  
  221. ** Description :   
  222. ** Date        : 2016/11/9
  223. ** ModifyRecord:
  224. ***************************************************************************************************/
  225. /*
  226. 1.主机->从机:发送采图命令采指纹命令
  227. 2.从机->主机:返回采集指纹结果。
  228. 3.如果没有采集到指纹循环1.2步骤直到采集到指纹 或超时
  229. 4.提取特征
  230. 5.搜索
  231. */
  232. UINT8 FptEx_SaveChar()
  233. {
  234.     UINT8 cRet, cRerr;
  235.     UINT8 nOverTime, n;
  236.     UINT8 Buf[128];
  237.     UINT16 nInBufLen = 0;
  238.     UINT16 i;
  239. //    UINT16 sSoucre, FpId;
  240.    
  241.     memset(Buf, 0, sizeof(Buf));
  242.     nOverTime = 500;     //设定范围如何确定
  243.     while(1)
  244.     {
  245.         cRet = CommSingleInstruction(MASK_INS, PS_GetImage, NULL, &nInBufLen, Buf, &cRerr, nOverTime);
  246.         if(cRet == CMD_TIMEOUT)
  247.             return cRet;
  248.         else if((cRet != CMD_OK) || (cRerr != 0))
  249.             continue;
  250.         
  251.         Buf[0] = 1;
  252.         nInBufLen = 1;   
  253.         cRet = CommSingleInstruction(MASK_INS, PS_GenChar, Buf, &nInBufLen, Buf, &cRerr, nOverTime);
  254.         if(cRet == CMD_TIMEOUT)
  255.             return cRet;
  256.         else if((cRet != CMD_OK) || (cRerr != 0))
  257.             continue;
  258.         else
  259.             break;          
  260.     }   

  261.     do{
  262.         Buf[0] = 1;
  263.         nInBufLen = 1;
  264.         cRet = CommSingleInstruction(MASK_INS, PS_UpChar, Buf, &nInBufLen, Buf, &cRerr, nOverTime);
  265.         if(cRet == CMD_TIMEOUT)
  266.             return cRet;
  267.         else if((cRet != CMD_OK) || (cRerr != 0))
  268.             continue;
  269.         else
  270.             break;   
  271.     }while(1);
  272.     //1.order如何定义;2.数据分包大小;3.发包数据总长度;4.
  273. //    for(i = 0; i < tLen/padLen; i++)
  274. //    {
  275. //        CommUpDataInstruction(MASK_DAT, MASK_DAT, Buf, &padLen, Buf, &cRerr, nOverTime);
  276. //           
  277. //    }   
  278. //    CommUpDataInstruction(MASK_DAT_LAST, MASK_DAT_LAST, Buf, &(tLen % padLen), );
  279.    
  280.    
  281. //接收后续数据包?
  282. }   

  283. UINT8 FptEx_AutoEnroll()
  284. {
  285.     UINT8 cRet, cRerr;
  286.     UINT8 Buf[128];
  287.     UINT16 nBufLen = 0;
  288.     UINT16 n = 0, nLevel = 10;
  289.     UINT16 nOutTimeMS = 500;
  290.     //指令合法性,是否握手?
  291.     cRet = FunHandshakeModule(1);
  292.     if(cRet != CMD_OK)
  293.         return CMD_ERR;       
  294.    
  295.     while(n < nLevel)
  296.     {
  297.         n++;
  298.             cRet = CommSingleInstruction(MASK_INS, PS_GetEnrollImage, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
  299.             if(cRet == CMD_TIMEOUT)
  300.             return cRet;
  301.         else if((cRet != CMD_OK) || (cRerr != 0))
  302.             continue;
  303.         
  304.         Buf[0] = n;
  305.         nBufLen = 1;
  306.         cRet = CommSingleInstruction(MASK_INS, PS_GenChar, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
  307.         if(cRet == CMD_TIMEOUT)
  308.             return cRet;
  309.         else if((cRet != CMD_OK) || (cRerr != 0))
  310.             continue;
  311.       
  312.        Buf[0] = n;  //BuffID 取值规则,范围
  313.        Buf[1] = n & 0xff;       //PageID取值规则,范围
  314.        Buf[2] = (n>>8) & 0xff;
  315.        nBufLen = 3;
  316.        cRet = CommSingleInstruction(MASK_INS, PS_StoreChar, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
  317.        if(cRet == CMD_TIMEOUT)
  318.        {
  319.                    return cRet;
  320.        }      
  321.        else if((cRet != CMD_OK) || (cRerr != 0))
  322.             continue;            
  323.     }
  324.    
  325.     cRet = CommSingleInstruction(MASK_INS, PS_RegModel, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
  326.     if((cRet != CMD_OK) || (cRet != 0))
  327.         return cRet;
  328.         
  329.     //指纹重复检测成功???GetEnroll指令?
  330.     cRet = CommSingleInstruction(MASK_INS, PS_GetEnrollImage, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
  331.     if((cRet != CMD_OK) || (cRerr != 0))
  332. ……………………

  333. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
模块资料及例程.zip (2.33 MB, 下载次数: 250)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:390243 发表于 2018-9-5 10:31 | 显示全部楼层
终于找到了,非常感谢呀。
回复

使用道具 举报

ID:413080 发表于 2019-2-18 01:09 来自手机 | 显示全部楼层
能提供一下完整的51代码吗?谢谢邮箱1337173140@qq.com
回复

使用道具 举报

ID:360887 发表于 2019-3-11 23:59 | 显示全部楼层
学习了,谢谢!
回复

使用道具 举报

ID:657254 发表于 2019-12-6 08:47 | 显示全部楼层
请问    cRet = FunHandshakeModule(1);  这个握手函数具体是怎么实现握手呀?
回复

使用道具 举报

ID:299054 发表于 2019-12-6 10:47 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:636603 发表于 2019-12-26 08:00 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:460337 发表于 2019-12-26 13:59 | 显示全部楼层

谢谢分享
回复

使用道具 举报

ID:452950 发表于 2020-2-17 11:18 | 显示全部楼层
请问这个JM101是属于AS608指纹模块的吗,是只支持JM101手册里的八条指令还是支持AS60X通讯手册里的所有三十多条指令呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表