找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2599|回复: 1
收起左侧

51单片机实现指纹识别程序,首先录入指纹,然后与库中的指纹对比,来实现指纹的识别签到

[复制链接]
ID:828888 发表于 2022-4-20 23:47 | 显示全部楼层 |阅读模式
51单片机实现指纹识别,首先录入指纹,然后与库中的指纹对比,来实现指纹的识别签到
51hei图片20220420234557.png
单片机源程序如下:
  1. /*******************************************************************************
  2. **文件名:BIOVO.c
  3. **说明:指纹芯片数据处理
  4. **编程人员:李
  5. *******************************************************************************/
  6. #include "config.h"
  7. #define UART_BUF_LEN  8
  8. #define BUF_N         8

  9. unsigned char rBuf[UART_BUF_LEN];          //接收返回信息
  10. unsigned char tBuf[UART_BUF_LEN];          //发送命令或者数据
  11. unsigned char g_ucUartRxEnd ;              //接收返回信息结束标志
  12. unsigned char g_ucUartRxLen ;             //接收返回信息长度
  13. unsigned char l_ucFPID;                  //用户编号

  14. extern unsigned char p;  //  串口接收地址


  15. /*******************************************************************      
  16. **功能:延时程序
  17. **参数:
  18. **返回:无                                                               
  19. *******************************************************************/      
  20.                                                                            
  21. void Delay_ms(unsigned int ms)                                                         
  22. {                                                                          
  23.                 unsigned int i=0,j=0;
  24.                 for(i=0;i<ms;i++)
  25.                 for(j=0;j<123;j++);
  26. }
  27. /*******************************************************************************
  28. **功能:等待数据包发送完成
  29. **参数:
  30. **返回:无
  31. *******************************************************************************/
  32. unsigned char WaitFpData(void)
  33. {
  34.   unsigned char i;
  35.   
  36.   for(i=200; i>0; i--)//等待指纹芯片返回
  37.   {
  38.     Delay_ms(40);
  39.     if(g_ucUartRxEnd)break;
  40.   }  
  41.   if(i==0)return FALSE;//指纹芯片没有返回
  42.   else return TRUE;
  43. }

  44. /*******************************************************************************
  45. **功能: 计算校验值
  46. **参数: 要发送的数据指针地址
  47. **返回: 校验值
  48. *******************************************************************************/
  49. unsigned char CmdGenCHK(unsigned char wLen,unsigned char *ptr)
  50. {
  51.         unsigned char i,temp = 0;
  52.        
  53.         for(i = 0; i < wLen; i++)
  54.         {
  55.                 temp ^= *(ptr + i);
  56.         }
  57.         return temp;
  58. }

  59. /*******************************************************************************
  60. **功能: 发送控制指纹芯片指令
  61. **参数: wLen 数据长度
  62.         cpPara 发送的数据
  63. **返回:void
  64. *******************************************************************************/
  65. void UART_SendPackage(unsigned char wLen,unsigned char *ptr)
  66. {
  67.   unsigned int i=0,len=0;

  68.   tBuf[0] = DATA_START;//指令包
  69.   for(i = 0; i < wLen; i++)      // data in packet
  70.   {
  71.     tBuf[1+i] = *(ptr+i);
  72.   }
  73.   
  74.   tBuf[wLen + 1] = CmdGenCHK(wLen, ptr);         //Generate checkout data
  75.   tBuf[wLen + 2] = DATA_END;
  76.   len = wLen + 3;
  77.        
  78.   g_ucUartRxEnd = 0;
  79.   g_ucUartRxLen = len ;
  80.        
  81.         UartSend(tBuf,len);
  82. }

  83. /*******************************************************************************
  84. **功能:返回信息处理
  85. **参数: cmd 不同命令不同处理
  86. **返回:处理结果
  87. *******************************************************************************/
  88. unsigned char Check_Package(unsigned char cmd)
  89. {
  90.     unsigned char flag = FALSE;
  91.            if(!WaitFpData()) return flag; //等待接收返回信息
  92.      p = 0 ;
  93.     if(g_ucUartRxEnd)
  94.       g_ucUartRxEnd = 0;//清数据包接收标志
  95.     else
  96.       return flag;
  97.    
  98.   if(rBuf[0] != DATA_START)return flag;
  99.         if(rBuf[1] != cmd)return flag;
  100.         if(rBuf[6] != CmdGenCHK(g_ucUartRxLen - 3, &rBuf[1]))return flag;
  101.         switch(cmd)
  102.         {
  103.         case CMD_ENROLL1:
  104.         case CMD_ENROLL2:
  105.         case CMD_ENROLL3:
  106.                 if(ACK_SUCCESS == rBuf[4])flag = TRUE;
  107.                 else if(ACK_USER_EXIST == rBuf[4])
  108.                 {
  109. //                Spk_HaveUser();
  110.                         Delay_ms(1500);
  111.                 }
  112.                 break;
  113.         case CMD_DELETE:  //删除指定编号指纹
  114.         case CMD_CLEAR:    //清空所有指纹
  115.         case CMD_IDENTIFY:  //1:1比对
  116.                 if(ACK_SUCCESS == rBuf[4])flag = TRUE;
  117.                 break;
  118.         case CMD_USERNUMB:  //取用户总数
  119.                 if(ACK_SUCCESS == rBuf[4])
  120.                 {
  121.                         flag = TRUE;
  122.                         l_ucFPID = rBuf[3];
  123.                 }
  124.                 break;
  125.         case CMD_SEARCH:   //1:N比对
  126.                 if((1 == rBuf[4])||(2 == rBuf[4])||(3 == rBuf[4]))
  127.                 {
  128.                         flag = TRUE;
  129.                         l_ucFPID = rBuf[3];
  130.                 }
  131.                 break;
  132.         default:
  133.                 break;
  134.         }
  135.      
  136.     return flag;
  137. }

  138. /*******************************************************************************
  139. **功能:以CharBuffer1 或CharBuffer2 中的特征文件搜索整个或部分指纹库
  140. **参数:
  141. **返回:无
  142. *******************************************************************************/
  143. void FP_Search(void)
  144. {
  145.   unsigned char buf[BUF_N];
  146.   
  147.   *buf = CMD_SEARCH;          //1:N比对
  148.   *(buf+1) = 0x00;
  149.   *(buf+2) = 0x00;
  150.   *(buf+3) = 0x00;
  151.   *(buf+4) = 0x00;

  152.   UART_SendPackage(5, buf);
  153. }

  154. /*******************************************************************************
  155. **功能:清空 flash 指纹库
  156. **参数:
  157. **返回:无
  158. *******************************************************************************/
  159. void FP_Clear(void)
  160. {
  161.   unsigned char buf[BUF_N];
  162.   
  163.   *buf = CMD_CLEAR;
  164.   *(buf+1) = 0x00;
  165.   *(buf+2) = 0x00;
  166.   *(buf+3) = 0x00;
  167.   *(buf+4) = 0x00;

  168.   UART_SendPackage(5, buf);
  169. }

  170. /*******************************************************************************
  171. **功能:删除指定编号指纹
  172. **参数:u_id
  173. **返回:void
  174. *******************************************************************************/
  175. void FP_Delete(unsigned int u_id)
  176. {
  177.   unsigned char buf[BUF_N];
  178.   
  179.   *buf = CMD_DELETE;
  180.   *(buf+1) = u_id>>8;
  181.   *(buf+2) = u_id&0xff;
  182.   *(buf+3) = 0x00;
  183.   *(buf+4) = 0x00;
  184.   UART_SendPackage(5, buf);
  185. }

  186. /*******************************************************************************
  187. **功能:1:1比对
  188. **参数:u_id
  189. **返回:void
  190. *******************************************************************************/
  191. void FP_Identify(unsigned int u_id)
  192. {
  193.   unsigned char buf[BUF_N];
  194.   
  195.   *buf = CMD_IDENTIFY;
  196.   *(buf+1) = u_id>>8;
  197.   *(buf+2) = u_id&0xff;
  198.   *(buf+3) = 0x00;
  199.   *(buf+4) = 0x00;
  200.   UART_SendPackage(5, buf);
  201. }

  202. /*******************************************************************************
  203. **注册指纹
  204. **输入两次指纹注册一个指纹模板
  205. **参数:UserID 指纹号
  206. *******************************************************************************/
  207. void Enroll_Step1(unsigned int u_id)
  208. {
  209.   unsigned char buf[BUF_N];
  210.   
  211.   *buf = CMD_ENROLL1;
  212.   *(buf+1) = u_id>>8;
  213.   *(buf+2) = u_id&0xff;
  214.   *(buf+3) = 1;
  215.   *(buf+4) = 0x00;

  216.   UART_SendPackage(5, buf);
  217. }

  218. /*******************************************************************************
  219. **注册指纹
  220. **输入两次指纹注册一个指纹模板
  221. **参数:UserID 指纹号
  222. *******************************************************************************/
  223. void Enroll_Step2(unsigned int u_id)
  224. {
  225.   unsigned char buf[BUF_N];
  226.   
  227.   *buf = CMD_ENROLL2;
  228.   *(buf+1) = u_id>>8;
  229.   *(buf+2) = u_id&0xff;
  230.   *(buf+3) = 1;
  231.   *(buf+4) = 0x00;

  232.   UART_SendPackage(5, buf);
  233. }

  234. /*******************************************************************************
  235. **注册指纹
  236. **输入三次指纹注册一个指纹模板
  237. **参数:UserID 指纹号
  238. *******************************************************************************/
  239. void Enroll_Step3(unsigned int u_id)
  240. {
  241.   unsigned char buf[BUF_N];
  242.   
  243.   *buf = CMD_ENROLL3;
  244.   *(buf+1) = u_id>>8;
  245.   *(buf+2) = u_id&0xff;
  246.   *(buf+3) = 1;
  247.   *(buf+4) = 0x00;

  248.   UART_SendPackage(5, buf);
  249. }

  250. /*******************************************************************************
  251. **注册指纹
  252. **输入三次指纹注册一个指纹模板
  253. **参数:UserID 指纹号
  254. *******************************************************************************/
  255. unsigned char Finger_Enroll(unsigned int u_id)
  256. {
  257.         Enroll_Step1(u_id);
  258.         if(FALSE == Check_Package(CMD_ENROLL1))return FALSE;
  259.         Delay_ms(100);
  260.        
  261.         Enroll_Step2(u_id);
  262.         if(FALSE == Check_Package(CMD_ENROLL2))return FALSE;
  263.         Delay_ms(100);
  264.        
  265.         Enroll_Step3(u_id);
  266.         return Check_Package(CMD_ENROLL3);
  267. }

  268. /*******************************************************************************
  269. **清空指纹
  270. **
  271. **参数:UserID 指纹号
  272. *******************************************************************************/
  273. unsigned char Finger_Clear(void)
  274. {
  275.         FP_Clear();
  276. //        if(FALSE == WaitFpData())return FALSE;
  277.         return Check_Package(CMD_CLEAR);
  278. }

  279. /*******************************************************************************
  280. **删除指定指纹
  281. **
  282. **参数:UserID 指纹号
  283. *******************************************************************************/
  284. unsigned char Finger_Delete(unsigned int u_id)
  285. {
  286.         FP_Delete(u_id);
  287. //        if(FALSE == WaitFpData())return FALSE;
  288.         return Check_Package(CMD_DELETE);
  289. }
  290. /*******************************************************************************
  291. **读取用户总数
  292. **
  293. **参数
  294. *******************************************************************************/
  295. unsigned char Finger_Read(void)
  296. {
  297.          unsigned char buf[BUF_N];
  298.   
  299.   *buf = CMD_USERNUMB;
  300.   *(buf+1) = 0x00;
  301.   *(buf+2) = 0x00;
  302.   *(buf+3) = 0x00;
  303.   *(buf+4) = 0x00;
  304.   UART_SendPackage(5, buf);
  305.         return Check_Package(CMD_USERNUMB);
  306. }
  307. /*******************************************************************************
  308. **读取用户总数
  309. **
  310. **参数
  311. *******************************************************************************/
  312. unsigned char Finger_Search(void)
  313. {
  314.          FP_Search();
  315.         return Check_Package(CMD_SEARCH);
  316. }
复制代码

Keil代码下载:
FPC1020 _51单片机.rar (64.04 KB, 下载次数: 47)

评分

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

查看全部评分

回复

使用道具 举报

ID:1040161 发表于 2022-7-21 19:27 | 显示全部楼层
请问用的是AS608吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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