找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2962|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)實(shí)現(xiàn)指紋識(shí)別程序,首先錄入指紋,然后與庫(kù)中的指紋對(duì)比,來(lái)實(shí)現(xiàn)指紋的識(shí)別簽到

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)實(shí)現(xiàn)指紋識(shí)別,首先錄入指紋,然后與庫(kù)中的指紋對(duì)比,來(lái)實(shí)現(xiàn)指紋的識(shí)別簽到

單片機(jī)源程序如下:
  1. /*******************************************************************************
  2. **文件名:BIOVO.c
  3. **說(shuō)明:指紋芯片數(shù)據(jù)處理
  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];          //發(fā)送命令或者數(shù)據(jù)
  11. unsigned char g_ucUartRxEnd ;              //接收返回信息結(jié)束標(biāo)志
  12. unsigned char g_ucUartRxLen ;             //接收返回信息長(zhǎng)度
  13. unsigned char l_ucFPID;                  //用戶(hù)編號(hào)

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


  15. /*******************************************************************      
  16. **功能:延時(shí)程序
  17. **參數(shù):
  18. **返回:無(wú)                                                               
  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. **功能:等待數(shù)據(jù)包發(fā)送完成
  29. **參數(shù):
  30. **返回:無(wú)
  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;//指紋芯片沒(méi)有返回
  42.   else return TRUE;
  43. }

  44. /*******************************************************************************
  45. **功能: 計(jì)算校驗(yàn)值
  46. **參數(shù): 要發(fā)送的數(shù)據(jù)指針地址
  47. **返回: 校驗(yàn)值
  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. **功能: 發(fā)送控制指紋芯片指令
  61. **參數(shù): wLen 數(shù)據(jù)長(zhǎng)度
  62.         cpPara 發(fā)送的數(shù)據(jù)
  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. **參數(shù): cmd 不同命令不同處理
  86. **返回:處理結(jié)果
  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;//清數(shù)據(jù)包接收標(biāo)志
  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:  //刪除指定編號(hào)指紋
  114.         case CMD_CLEAR:    //清空所有指紋
  115.         case CMD_IDENTIFY:  //1:1比對(duì)
  116.                 if(ACK_SUCCESS == rBuf[4])flag = TRUE;
  117.                 break;
  118.         case CMD_USERNUMB:  //取用戶(hù)總數(shù)
  119.                 if(ACK_SUCCESS == rBuf[4])
  120.                 {
  121.                         flag = TRUE;
  122.                         l_ucFPID = rBuf[3];
  123.                 }
  124.                 break;
  125.         case CMD_SEARCH:   //1:N比對(duì)
  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 中的特征文件搜索整個(gè)或部分指紋庫(kù)
  140. **參數(shù):
  141. **返回:無(wú)
  142. *******************************************************************************/
  143. void FP_Search(void)
  144. {
  145.   unsigned char buf[BUF_N];
  146.   
  147.   *buf = CMD_SEARCH;          //1:N比對(duì)
  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 指紋庫(kù)
  156. **參數(shù):
  157. **返回:無(wú)
  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. **功能:刪除指定編號(hào)指紋
  172. **參數(shù):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比對(duì)
  188. **參數(shù):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. **注冊(cè)指紋
  204. **輸入兩次指紋注冊(cè)一個(gè)指紋模板
  205. **參數(shù):UserID 指紋號(hào)
  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. **注冊(cè)指紋
  220. **輸入兩次指紋注冊(cè)一個(gè)指紋模板
  221. **參數(shù):UserID 指紋號(hào)
  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. **注冊(cè)指紋
  236. **輸入三次指紋注冊(cè)一個(gè)指紋模板
  237. **參數(shù):UserID 指紋號(hào)
  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. **注冊(cè)指紋
  252. **輸入三次指紋注冊(cè)一個(gè)指紋模板
  253. **參數(shù):UserID 指紋號(hào)
  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. **參數(shù):UserID 指紋號(hào)
  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. **參數(shù):UserID 指紋號(hào)
  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. **讀取用戶(hù)總數(shù)
  292. **
  293. **參數(shù)
  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. **讀取用戶(hù)總數(shù)
  309. **
  310. **參數(shù)
  311. *******************************************************************************/
  312. unsigned char Finger_Search(void)
  313. {
  314.          FP_Search();
  315.         return Check_Package(CMD_SEARCH);
  316. }
復(fù)制代碼

Keil代碼下載:
FPC1020 _51單片機(jī).rar (64.04 KB, 下載次數(shù): 47)


評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1040161 發(fā)表于 2022-7-21 19:27 | 只看該作者
請(qǐng)問(wèn)用的是AS608嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表