久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12單片機+AS608指紋打卡系統(tǒng)源程序分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:906199 發(fā)表于 2021-5-6 02:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機的指紋打卡系統(tǒng),
有增加,修改,刪除的功能。
可以用于STC12C5A60S2的增強型芯片。
附加oled顯示,oled使用IIC通信方式。
可以在oled上直接觀察指紋用戶的相關(guān)信息。
指紋模塊采用AS608,如果有大佬有更好的方案,也可以一起交流。
當(dāng)然如果有FPM10A模塊的,也可以一起交流學(xué)習(xí)。

單片機源程序如下:
  1. #ifndef __AS608_H
  2. #define __AS608_H
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "UART2.h"
  6. //#include "oled.h"
  7. #include "KEY.h"

  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. #define ulong unsigned long


  11. #define CharBuffer1 0x01
  12. #define CharBuffer2 0x02
  13. uint CuoWu,jiaoyanwei;
  14. ulong AS608Addr = 0XFFFFFFFF; //默認(rèn)模塊地址

  15. char str2[6]={0};

  16. typedef struct  
  17. {
  18.         uint pageID;//指紋ID
  19.         uint mathscore;//匹配得分
  20. }SearchResult;

  21. typedef struct
  22. {
  23.         uint PS_max;//指紋最大容量
  24.         uchar  PS_level;//安全等級
  25.         ulong PS_addr;
  26.         uchar  PS_size;//通訊數(shù)據(jù)包大小
  27.         uchar  PS_N;//波特率基數(shù)N
  28. }SysPara;

  29. const char *EnsureMessage(uchar ensure);

  30. //發(fā)送包頭
  31. static void SendHead(void)
  32. {
  33.         UART2_SendData(0xEF);
  34.         UART2_SendData(0x01);
  35. }
  36. //發(fā)送地址
  37. static void SendAddr(void)
  38. {
  39.         UART2_SendData(AS608Addr>>24);
  40.         UART2_SendData(AS608Addr>>16);
  41.         UART2_SendData(AS608Addr>>8);
  42.         UART2_SendData(AS608Addr);
  43. }
  44. //發(fā)送包標(biāo)識,
  45. static void SendFlag(uchar flag)
  46. {
  47.         UART2_SendData(flag);
  48. }
  49. //發(fā)送包長度
  50. static void SendLength(int length)
  51. {
  52.         UART2_SendData(length>>8);
  53.         UART2_SendData(length);
  54. }
  55. //發(fā)送指令碼
  56. static void Sendcmd(uchar cmd)
  57. {
  58.         UART2_SendData(cmd);
  59. }
  60. //發(fā)送校驗和
  61. static void SendCheck(uint check)
  62. {
  63.         UART2_SendData(check>>8);
  64.         UART2_SendData(check);
  65. }

  66. //判斷中斷接收的數(shù)組有沒有應(yīng)答包
  67. //waittime為等待中斷接收數(shù)據(jù)的時間(單位1ms)
  68. //返回值:數(shù)據(jù)包首地址
  69. static uchar *JudgeStr(uint waittime)
  70. {
  71. //        uint temp;
  72.         char *rdata;
  73.         uchar str[8];
  74.         str[0]=0xef;str[1]=0x01;str[2]=AS608Addr>>24;
  75.         str[3]=AS608Addr>>16;str[4]=AS608Addr>>8;
  76.         str[5]=AS608Addr;str[6]=0x07;str[7]='\0';   
  77.         UART2_RX_STA=0;
  78.         while(--waittime)
  79.         {
  80.                 Delay_Ms(1);
  81.                 if(UART2_RX_STA&0X8000)//接收到一次數(shù)據(jù)
  82.                 {
  83.                         UART2_RX_STA=0;
  84.                         rdata=strstr((const char*)UART2_RX_BUF,(const char*)str);
  85.                         if(rdata)
  86.                                 return (uchar*)rdata;        
  87.                 }               
  88.         }
  89.         return 0;
  90. }

  91. //錄入圖像 PS_GetImage
  92. //功能:探測手指,探測到后錄入指紋圖像存于ImageBuffer。
  93. //模塊返回確認(rèn)字
  94. uchar PS_GetImage(void)
  95. {
  96.   uint temp;
  97.   uchar  ensure;
  98.         uchar  *rdata;
  99.         SendHead();
  100.         SendAddr();
  101.         SendFlag(0x01);//命令包標(biāo)識
  102.         SendLength(0x03);
  103.         Sendcmd(0x01);
  104.   temp =  0x01+0x03+0x01;
  105.         SendCheck(temp);
  106.         rdata=JudgeStr(2000);
  107.         if(rdata)
  108.                 ensure=rdata[9];
  109.         else
  110.                 ensure=0xff;
  111.         return ensure;
  112. }

  113. //生成特征 PS_GenChar
  114. //功能:將ImageBuffer中的原始圖像生成指紋特征文件存于CharBuffer1或CharBuffer2                        
  115. //參數(shù):BufferID --> charBuffer1:0x01        charBuffer1:0x02                                                                                                
  116. //模塊返回確認(rèn)字
  117. uchar PS_GenChar(uchar BufferID)
  118. {
  119.         uint temp;
  120.   uchar  ensure;
  121.         uchar  *rdata;
  122.         SendHead();
  123.         SendAddr();
  124.         SendFlag(0x01);//命令包標(biāo)識
  125.         SendLength(0x04);
  126.         Sendcmd(0x02);
  127.         UART2_SendData(BufferID);
  128.         temp = 0x01+0x04+0x02+BufferID;
  129.         SendCheck(temp);
  130.         rdata=JudgeStr(2000);
  131.         if(rdata)
  132.                 ensure=rdata[9];
  133.         else
  134.                 ensure=0xff;
  135.         return ensure;
  136. }

  137. //精確比對兩枚指紋特征 PS_Match
  138. //功能:精確比對CharBuffer1 與CharBuffer2 中的特征文件
  139. //模塊返回確認(rèn)字
  140. uchar PS_Match(void)
  141. {
  142.         uint temp;
  143.   uchar  ensure;
  144.         uchar  *rdata;
  145.         SendHead();
  146.         SendAddr();
  147.         SendFlag(0x01);//命令包標(biāo)識
  148.         SendLength(0x03);
  149.         Sendcmd(0x03);
  150.         temp = 0x01+0x03+0x03;
  151.         SendCheck(temp);
  152.         rdata=JudgeStr(2000);
  153.         if(rdata)
  154.                 ensure=rdata[9];
  155.         else
  156.                 ensure=0xff;
  157.         return ensure;
  158. }

  159. //搜索指紋 PS_Search
  160. //功能:以CharBuffer1或CharBuffer2中的特征文件搜索整個或部分指紋庫.若搜索到,則返回頁碼。                        
  161. //參數(shù):  BufferID @ref CharBuffer1        CharBuffer2
  162. //說明:  模塊返回確認(rèn)字,頁碼(相配指紋模板)
  163. //uchar PS_Search(uchar BufferID,uint StartPage,uint PageNum,SearchResult *p)
  164. //{
  165. //        uint temp;
  166. //  uchar  ensure;
  167. //        uchar  *rdata;
  168. //        memset(UART2_RX_BUF,'\0',sizeof(UART2_RX_BUF));
  169. //        UART2_RX_STA=0;
  170. //        SendHead();
  171. //        SendAddr();
  172. //        SendFlag(0x01);//命令包標(biāo)識
  173. //        SendLength(0x08);
  174. //        Sendcmd(0x04);
  175. //        UART2_SendData(BufferID);
  176. //        UART2_SendData(StartPage>>8);
  177. //        UART2_SendData(StartPage);
  178. //        UART2_SendData(PageNum>>8);
  179. //        UART2_SendData(PageNum);
  180. //        temp = 0x01+0x08+0x04+BufferID
  181. //        +(StartPage>>8)+(uchar)StartPage
  182. //        +(PageNum>>8)+(uchar)PageNum;
  183. //        SendCheck(temp);
  184. //        Delay_Ms(100);
  185. //        rdata=JudgeStr(2000);
  186. //        if(rdata)
  187. //        {
  188. //                ensure = rdata[9];
  189. //                p->pageID   =(rdata[10]<<8)+rdata[11];
  190. //                p->mathscore=(rdata[12]<<8)+rdata[13];        
  191. //        }
  192. //        else
  193. //                ensure = 0xff;
  194. //        return ensure;        
  195. //}

  196. //合并特征(生成模板)PS_RegModel
  197. //功能:將CharBuffer1與CharBuffer2中的特征文件合并生成 模板,結(jié)果存于CharBuffer1與CharBuffer2        
  198. //說明:  模塊返回確認(rèn)字
  199. uchar PS_RegModel(void)
  200. {
  201.         uint temp;
  202.   uchar  ensure;
  203.         uchar  *rdata;
  204.         SendHead();
  205.         SendAddr();
  206.         SendFlag(0x01);//命令包標(biāo)識
  207.         SendLength(0x03);
  208.         Sendcmd(0x05);
  209.         temp = 0x01+0x03+0x05;
  210.         SendCheck(temp);
  211.         rdata=JudgeStr(2000);
  212.         if(rdata)
  213.                 ensure=rdata[9];
  214.         else
  215.                 ensure=0xff;
  216.         return ensure;               
  217. }
  218. //儲存模板 PS_StoreChar
  219. //功能:將 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 號flash數(shù)據(jù)庫位置。                        
  220. //參數(shù):  BufferID @ref charBuffer1:0x01        charBuffer1:0x02
  221. //       PageID(指紋庫位置號)
  222. //說明:  模塊返回確認(rèn)字
  223. uchar PS_StoreChar(uchar BufferID,uint PageID)
  224. {
  225.         uint temp;
  226.   uchar  ensure;
  227.         uchar  *rdata;
  228.         SendHead();
  229.         SendAddr();
  230.         SendFlag(0x01);//命令包標(biāo)識
  231.         SendLength(0x06);
  232.         Sendcmd(0x06);
  233.         UART2_SendData(BufferID);
  234.         UART2_SendData(PageID>>8);
  235.         UART2_SendData(PageID);
  236.         temp = 0x01+0x06+0x06+BufferID
  237.         +(PageID>>8)+(uchar)PageID;
  238.         SendCheck(temp);
  239.         rdata=JudgeStr(2000);
  240.         if(rdata)
  241.                 ensure=rdata[9];
  242.         else
  243.                 ensure=0xff;
  244.         return ensure;        
  245. }
  246. //刪除模板 PS_DeletChar
  247. //功能:  刪除flash數(shù)據(jù)庫中指定ID號開始的N個指紋模板
  248. //參數(shù):  PageID(指紋庫模板號),N刪除的模板個數(shù)。
  249. //說明:  模塊返回確認(rèn)字
  250. uchar PS_DeletChar(uint PageID,uint N)
  251. {
  252.         uint temp;
  253.   uchar  ensure;
  254.         uchar  *rdata;
  255.         SendHead();
  256.         SendAddr();
  257.         SendFlag(0x01);//命令包標(biāo)識
  258.         SendLength(0x07);
  259.         Sendcmd(0x0C);
  260.         UART2_SendData(PageID>>8);
  261.         UART2_SendData(PageID);
  262.         UART2_SendData(N>>8);
  263.         UART2_SendData(N);
  264.         temp = 0x01+0x07+0x0C
  265.         +(PageID>>8)+(uchar)PageID
  266.         +(N>>8)+(uchar)N;
  267.         SendCheck(temp);
  268.         rdata=JudgeStr(2000);
  269.         if(rdata)
  270.                 ensure=rdata[9];
  271.         else
  272.                 ensure=0xff;
  273.         return ensure;
  274. }
  275. //清空指紋庫 PS_Empty
  276. //功能:  刪除flash數(shù)據(jù)庫中所有指紋模板
  277. //參數(shù):  無
  278. //說明:  模塊返回確認(rèn)字
  279. uchar PS_Empty(void)
  280. {
  281.         uint temp;
  282.   uchar  ensure;
  283.         uchar  *rdata;
  284.         SendHead();
  285.         SendAddr();
  286.         SendFlag(0x01);//命令包標(biāo)識
  287.         SendLength(0x03);
  288.         Sendcmd(0x0D);
  289.         temp = 0x01+0x03+0x0D;
  290.         SendCheck(temp);
  291.         rdata=JudgeStr(2000);
  292.         if(rdata)
  293.                 ensure=rdata[9];
  294.         else
  295.                 ensure=0xff;
  296.         return ensure;
  297. }

  298. //寫系統(tǒng)寄存器 PS_WriteReg
  299. //功能:  寫模塊寄存器
  300. //參數(shù):  寄存器序號RegNum:4\5\6
  301. //說明:  模塊返回確認(rèn)字
  302. //uchar PS_WriteReg(uchar RegNum,uchar DATA)
  303. //{
  304. //        uint temp;
  305. //  uchar  ensure;
  306. //        uchar  *rdata;
  307. //        SendHead();
  308. //        SendAddr();
  309. //        SendFlag(0x01);//命令包標(biāo)識
  310. //        SendLength(0x05);
  311. //        Sendcmd(0x0E);
  312. //        UART2_SendData(RegNum);
  313. //        UART2_SendData(DATA);
  314. //        temp = RegNum+DATA+0x01+0x05+0x0E;
  315. //        SendCheck(temp);
  316. //        Delay_Ms(100);
  317. //        rdata=JudgeStr(2000);
  318. //        if(rdata)
  319. //                ensure=rdata[9];
  320. //        else
  321. //                ensure=0xff;
  322. //        if(ensure==0)
  323. //                printf("\r\n設(shè)置參數(shù)成功!");
  324. //        else
  325. //                printf("\r\n%s",EnsureMessage(ensure));
  326. //        return ensure;
  327. //}
  328. //讀系統(tǒng)基本參數(shù) PS_ReadSysPara
  329. //功能:  讀取模塊的基本參數(shù)(波特率,包大小等)
  330. //參數(shù):  無
  331. //說明:  模塊返回確認(rèn)字 + 基本參數(shù)(16bytes)
  332. //uchar PS_ReadSysPara(SysPara *p)
  333. //{
  334. //        uint temp;
  335. //  uchar  ensure;
  336. //        uchar  *rdata;
  337. //        SendHead();
  338. //        SendAddr();
  339. //        SendFlag(0x01);//命令包標(biāo)識
  340. //        SendLength(0x03);
  341. //        Sendcmd(0x0F);
  342. //        temp = 0x01+0x03+0x0F;
  343. //        SendCheck(temp);
  344. //        Delay_Ms(100);
  345. //        rdata=JudgeStr(1000);
  346. //        if(rdata)
  347. //        {
  348. //                ensure = rdata[9];
  349. //                p->PS_max = (rdata[14]<<8)+rdata[15];
  350. //                p->PS_level = rdata[17];
  351. //                p->PS_addr=(rdata[18]<<24)+(rdata[19]<<16)+(rdata[20]<<8)+rdata[21];
  352. //                p->PS_size = rdata[23];
  353. //                p->PS_N = rdata[25];
  354. //        }               
  355. //        else
  356. //                ensure=0xff;
  357. //        if(ensure==0x00)
  358. //        {
  359. //                printf("\r\n模塊最大指紋容量=%d",p->PS_max);
  360. //                printf("\r\n對比等級=%d",p->PS_level);
  361. //                printf("\r\n地址=%x",p->PS_addr);
  362. //                printf("\r\n波特率=%d",p->PS_N*9600);
  363. //        }
  364. //        else
  365. //                        printf("\r\n%s",EnsureMessage(ensure));
  366. //        return ensure;
  367. //}
  368. //設(shè)置模塊地址 PS_SetAddr
  369. //功能:  設(shè)置模塊地址
  370. //參數(shù):  PS_addr
  371. //說明:  模塊返回確認(rèn)字
  372. //uchar PS_SetAddr(ulong PS_addr)
  373. //{
  374. //        uint temp;
  375. //  uchar  ensure;
  376. //        uchar  *rdata;
  377. //        SendHead();
  378. //        SendAddr();
  379. //        SendFlag(0x01);//命令包標(biāo)識
  380. //        SendLength(0x07);
  381. //        Sendcmd(0x15);
  382. //        UART2_SendData(PS_addr>>24);
  383. //        UART2_SendData(PS_addr>>16);
  384. //        UART2_SendData(PS_addr>>8);
  385. //        UART2_SendData(PS_addr);
  386. //        temp = 0x01+0x07+0x15
  387. //        +(uchar)(PS_addr>>24)+(uchar)(PS_addr>>16)
  388. //        +(uchar)(PS_addr>>8) +(uchar)PS_addr;                                
  389. //        SendCheck(temp);
  390. //        AS608Addr=PS_addr;//發(fā)送完指令,更換地址
  391. //        Delay_Ms(100);
  392. //  rdata=JudgeStr(2000);
  393. //        if(rdata)
  394. //                ensure=rdata[9];
  395. //        else
  396. //                ensure=0xff;        
  397. //                AS608Addr = PS_addr;
  398. //        if(ensure==0x00)
  399. //                printf("\r\n設(shè)置地址成功!");
  400. //        else
  401. //                printf("\r\n%s",EnsureMessage(ensure));
  402. //        return ensure;
  403. //}

  404. //高速搜索PS_HighSpeedSearch
  405. //功能:以 CharBuffer1或CharBuffer2中的特征文件高速搜索整個或部分指紋庫。
  406. //                  若搜索到,則返回頁碼,該指令對于的確存在于指紋庫中 ,且登錄時質(zhì)量
  407. //                  很好的指紋,會很快給出搜索結(jié)果。
  408. //參數(shù):  BufferID, StartPage(起始頁),PageNum(頁數(shù))
  409. //說明:  模塊返回確認(rèn)字+頁碼(相配指紋模板)
  410. uchar PS_HighSpeedSearch(uchar BufferID,uint StartPage,uint PageNum,SearchResult *p)
  411. {
  412.         uint temp;
  413.   uint  ensure;
  414.         uchar  *rdata;
  415.         SendHead();
  416.         SendAddr();
  417.         SendFlag(0x01);//命令包標(biāo)識
  418.         SendLength(0x08);
  419.         Sendcmd(0x1b);
  420.         UART2_SendData(BufferID);
  421.         UART2_SendData(StartPage>>8);
  422.         UART2_SendData(StartPage);
  423.         UART2_SendData(PageNum>>8);
  424.         UART2_SendData(PageNum);
  425.         temp = 0x01+0x08+0x1b+BufferID
  426.         +(StartPage>>8)+(uchar)StartPage
  427.         +(PageNum>>8)+(uchar)PageNum;
  428.         SendCheck(temp);
  429.         rdata=JudgeStr(2000);
  430.          if(rdata)
  431.         {
  432.                 ensure=rdata[9];
  433.                 p->pageID         =   (uint)(rdata[10]<<8) +rdata[11];
  434.                 p->mathscore=                (uint)(rdata[12]<<8) +rdata[13];
  435.         }
  436.         else
  437.                 ensure=0xff;
  438.         return ensure;
  439. }
  440. //讀有效模板個數(shù) PS_ValidTempleteNum
  441. //功能:讀有效模板個數(shù)
  442. //參數(shù): 無
  443. //說明: 模塊返回確認(rèn)字+有效模板個數(shù)ValidN
  444. //uchar PS_ValidTempleteNum(uint *ValidN)
  445. //{
  446. //        uint temp;
  447. //  uchar  ensure;
  448. //        uchar  *rdata;
  449. //        SendHead();
  450. //        SendAddr();
  451. //        SendFlag(0x01);//命令包標(biāo)識
  452. //        SendLength(0x03);
  453. //        Sendcmd(0x1d);
  454. //        temp = 0x01+0x03+0x1d;
  455. //        SendCheck(temp);
  456. //  rdata=JudgeStr(2000);
  457. //        if(rdata)
  458. //        {
  459. //                ensure=rdata[9];
  460. //                *ValidN = (rdata[10]<<8) +rdata[11];
  461. //        }               
  462. //        else
  463. //                ensure=0xff;
  464. //        
  465. //        if(ensure==0x00)
  466. //        {
  467. //                printf("\r\n有效指紋個數(shù)=%d",(rdata[10]<<8)+rdata[11]);
  468. //        }
  469. //        else
  470. //                printf("\r\n%s",EnsureMessage(ensure));
  471. //        return ensure;
  472. //}
  473. //與AS608握手 PS_HandShake
  474. //參數(shù): PS_Addr地址指針
  475. //說明: 模塊返新地址(正確地址)        
  476. //uchar PS_HandShake(ulong *PS_Addr)
  477. //{
  478. //        SendHead();
  479. //        SendAddr();
  480. //        UART2_SendData(0X01);
  481. //        UART2_SendData(0X00);
  482. //        UART2_SendData(0X00);        
  483. //        Delay_Ms(200);        
  484. //        if(        UART2_RX_BUF[0]==0XEF && UART2_RX_BUF[1]==0X01 && UART2_RX_BUF[6]==0X07)//判斷是不是模塊返回的應(yīng)答包        
  485. //                {
  486. //                        *PS_Addr=(UART2_RX_BUF[2]<<24) + (UART2_RX_BUF[3]<<16)
  487. //                                                        +(UART2_RX_BUF[4]<<8) + (UART2_RX_BUF[5]);
  488. //                        UART2_RX_STA=0;
  489. //                        return 0;
  490. //                }
  491. //        UART2_RX_STA=0;                                       
  492. //        return 1;               
  493. //}
  494. //模塊應(yīng)答包確認(rèn)碼信息解析
  495. //功能:解析確認(rèn)碼錯誤信息返回信息
  496. //參數(shù): ensure
  497. const char *EnsureMessage(uchar ensure)
  498. {
  499.         const char *p;
  500.         switch(ensure)
  501.         {
  502.                 case  0x00:
  503.                         p="       OK       ";break;               
  504.                 case  0x01:
  505.                         p=" 數(shù)據(jù)包接收錯誤 ";break;
  506.                 case  0x02:
  507.                         p="傳感器上沒有手指";break;
  508.                 case  0x03:
  509.                         p="錄入指紋圖像失敗";break;
  510.                 case  0x04:
  511.                         p=" 指紋太干或太淡 ";break;
  512.                 case  0x05:
  513.                         p=" 指紋太濕或太糊 ";break;
  514.                 case  0x06:
  515.                         p="  指紋圖像太亂  ";break;
  516.                 case  0x07:
  517.                         p=" 指紋特征點太少 ";break;
  518.                 case  0x08:
  519.                         p="   指紋不匹配   ";break;
  520.                 case  0x09:
  521.                         p=" 沒有搜索到指紋 ";break;
  522.                 case  0x0a:
  523.                         p="   特征合并失敗 ";break;
  524.                 case  0x0b:
  525.                         p="地址序號超出范圍";
  526.                 case  0x10:
  527.                         p="  刪除模板失敗  ";break;
  528.                 case  0x11:
  529.                         p=" 清空指紋庫失敗 ";break;        
  530.                 case  0x15:
  531.                         p="緩沖區(qū)內(nèi)無有效圖";break;
  532.                 case  0x18:
  533.                         p=" 讀寫FLASH出錯  ";break;
  534.                 case  0x19:
  535.                         p="   未定義錯誤   ";break;
  536.                 case  0x1a:
  537.                         p="  無效寄存器號  ";break;
  538.                 case  0x1b:
  539.                         p=" 寄存器內(nèi)容錯誤 ";break;
  540.                 case  0x1c:
  541.                         p=" 記事本頁碼錯誤 ";break;
  542.                 case  0x1f:
  543.                         p="    指紋庫滿    ";break;
  544.                 case  0x20:
  545.                         p="    地址錯誤    ";break;
  546.                 default :
  547.                         p=" 返回確認(rèn)碼有誤 ";break;
  548.         }
  549. return p;        
  550. }

  551. //顯示確認(rèn)碼錯誤信息
  552. void ShowErrMessage(uchar ensure)
  553. {
  554.         EnsureMessage(ensure);
  555. }

  556. //錄指紋
  557. void Add_FR(void)
  558. {
  559.         uchar i,ensure ,processnum=0;
  560.         uint ID_NUM=0;
  561.         while(1)
  562.         {
  563.                 switch (processnum)
  564.                 {
  565.                         case 0:
  566.                                 i++;
  567.                                 OLED_ShowCH(0,2,"    請按手指    ");
  568.                                 ensure=PS_GetImage();
  569.                                 if(ensure==0x00)
  570.                                 {
  571.                                         ensure=PS_GenChar(CharBuffer1);//生成特征
  572.                                         if(ensure==0x00)
  573.                                         {
  574.                                                 Delay_Ms(1);
  575.                                                 OLED_ShowCH(0,2,"    指紋正常    ");
  576.                                                 OLED_ShowCH(0,4,"                ");
  577.                                                 Delay_Ms(100);
  578.                                                 i=0;
  579.                                                 processnum=1;//跳到第二步                                                
  580.                                         }else {};                                
  581.                                 }else {};                                                
  582.                                 break;
  583.                         
  584.                         case 1:
  585.                                 i++;
  586.                                 OLED_ShowCH(0,2,"   請再按一次   ");
  587.                                 OLED_ShowCH(0,4,"                ");
  588.                                 Delay_Ms(100);
  589.                                 ensure=PS_GetImage();
  590.                                 if(ensure==0x00)
  591.                                 {
  592.                                         ensure=PS_GenChar(CharBuffer2);//生成特征
  593.                                         if(ensure==0x00)
  594.                                         {
  595.                                                 Delay_Ms(1);
  596.                                                 OLED_ShowCH(0,2,"    指紋正常    ");
  597.                                                 OLED_ShowCH(0,4,"                ");
  598.                                                 Delay_Ms(100);
  599.                                                 i=0;
  600.                                                 processnum=2;//跳到第三步
  601.                                         }else {};        
  602.                                 }else {};               
  603.                                 break;

  604.                         case 2:
  605.                                 OLED_ShowCH(0,2,"  對比兩次指紋  ");
  606.                                 OLED_ShowCH(0,4,"                ");
  607.                                 ensure=PS_Match();
  608.                                 if(ensure==0x00)
  609.                                 {
  610.                                         OLED_ShowCH(0,2,"    對比成功    ");
  611.                                         OLED_ShowCH(0,4,"                ");
  612.                                         processnum=3;//跳到第四步
  613.                                 }
  614.                                 else
  615.                                 {                                       
  616.                                         OLED_ShowCH(0,2,"    對比失敗    ");
  617.                                         OLED_ShowCH(0,4,"                ");
  618.                                         ShowErrMessage(ensure);
  619.                                         i=0;
  620.                                         processnum=0;//跳回第一步               
  621.                                 }
  622.                                 Delay_Ms(500);
  623.                                 break;

  624.                         case 3:
  625.                                 OLED_ShowCH(0,2,"  生成指紋模板  ");
  626.                                 OLED_ShowCH(0,4,"                ");
  627.                                 Delay_Ms(500);
  628.                                 ensure=PS_RegModel();
  629.                                 if(ensure==0x00)
  630.                                 {
  631.                                         OLED_ShowCH(0,2,"生成指紋模板成功");
  632.                                         OLED_ShowCH(0,4,"                ");
  633.                                         processnum=4;//跳到第五步
  634.                                 }else {processnum=0;}
  635.                                 Delay_Ms(1000);
  636.                                 break;
  637.                                 
  638.                         case 4:        
  639.                                 OLED_ShowCH(0,0," 按K4加,按K2減 ");
  640.                                 OLED_ShowCH(0,2,"    按K3保存    ");
  641.                                 OLED_ShowCH(0,4,"  0=< ID <=99   ");
  642.                           ID_NUM=0;
  643.                                 while(key_num!=3)
  644.                                 {
  645.                                         key_num=KEY_Scan(0);
  646.                                         if(key_num==2)
  647.                                         {
  648.                                                 key_num=0;
  649.                                                 if(ID_NUM>0)
  650.                                                         ID_NUM--;
  651.                                         }
  652.                                         if(key_num==4)
  653.                                         {
  654.                                                 key_num=0;
  655.                                                 if(ID_NUM<99)
  656.                                                         ID_NUM++;
  657.                                         }
  658.                                         OLED_ShowCH(40,6,"ID=");
  659.                                         OLED_ShowNum(65,6,ID_NUM,2,1);
  660.                                 }
  661.                                 key_num=0;
  662.                                 ensure=PS_StoreChar(CharBuffer2,ID_NUM);//儲存模板
  663.                                 if(ensure==0x00)
  664.                                 {               
  665.                                         OLED_Clear();
  666.                                         OLED_ShowCH(0,2,"  錄入指紋成功  ");
  667.                                         OLED_ShowCH(0,4,"                ");
  668.                                         Delay_Ms(1500);
  669.                                         OLED_Clear();
  670.                                         OLED_ShowCH(0,0,"指紋模塊測試程序");
  671.                                         OLED_ShowCH(16,2,"K1鍵添加指紋");
  672.                                         OLED_ShowCH(16,4,"K3鍵刪除指紋");
  673.                                         OLED_ShowCH(16,6,"K5鍵驗證指紋");
  674.                                         return ;
  675.                                 }else {OLED_Clear();processnum=0;}                                       
  676.                                 break;                                
  677.                 }
  678.                 Delay_Ms(400);
  679.                 if(i==10)//超過5次沒有按手指則退出
  680.                 {
  681.                         OLED_Clear();
  682.                         break;        
  683.                 }
  684.         }               
  685. }

  686. SysPara AS608Para;//指紋模塊AS608參數(shù)
  687. //刷指紋
  688. void press_FR(void)
  689. {
  690.         SearchResult seach;
  691.         uchar ensure;
  692.         char str[20];
  693.         while(key_num!=1)
  694.         {
  695.                 key_num=KEY_Scan(0);
  696.                 ensure=PS_GetImage();
  697.                 if(ensure==0x00)//獲取圖像成功
  698.                 {        
  699.                         ensure=PS_GenChar(CharBuffer1);
  700.                         if(ensure==0x00) //生成特征成功
  701.                         {                        
  702.                                 ensure=PS_HighSpeedSearch(CharBuffer1,0,99,&seach);
  703.                                 if(ensure==0x00)//搜索成功
  704.                                 {                                
  705.                                         OLED_ShowCH(0,2,"  指紋驗證成功  ");                                
  706.                                         sprintf(str," ID:%d 得分:%d ",seach.pageID,seach.mathscore);
  707.                                         OLED_ShowCH(0,4,(u8*)str);
  708.                                         Delay_Ms(3000);
  709.                                 }
  710.                                 if(ensure==0x09)
  711.                                 {
  712.                                         OLED_ShowCH(32,2,"驗證失敗");
  713.                                         Delay_Ms(1500);
  714.                                 }               
  715.                         }
  716.                         else
  717.                                 {};
  718.                         OLED_Clear();
  719.                         OLED_ShowCH(32,2,"請按手指");
  720.                 }
  721.         }        
  722.         OLED_Clear();
  723.         OLED_ShowCH(0,0,"指紋模塊測試程序");
  724.         OLED_ShowCH(16,2,"K1鍵添加指紋");
  725.         OLED_ShowCH(16,4,"K3鍵刪除指紋");
  726.         OLED_ShowCH(16,6,"K5鍵驗證指紋");
  727. }

  728. //刪除指紋
  729. void Del_FR(void)
  730. {
  731.         uchar  ensure;
  732.         uint ID_NUM=0;
  733.         OLED_ShowCH(0,0,"K4加 K2減 K3確認(rèn)");
  734.         OLED_ShowCH(0,2,"  K5清空指紋庫  ");
  735.         OLED_ShowCH(0,4,"K1返回 0=<ID<=99");
  736.         while(key_num!=3)
  737.         {
  738.                 key_num=KEY_Scan(0);
  739.                 if(key_num==2)
  740.                 {
  741.                         key_num=0;
  742.                         if(ID_NUM>0)
  743.                                 ID_NUM--;
  744.                 }
  745.                 if(key_num==4)
  746.                 {
  747.                         key_num=0;
  748.                         if(ID_NUM<99)
  749.                                 ID_NUM++;
  750.                 }
  751.                 if(key_num==1)
  752.                         goto MENU ; //返回主頁面
  753.                 if(key_num==5)
  754.                 {
  755.                         key_num=0;
  756.                         ensure=PS_Empty();//清空指紋庫
  757.                         if(ensure==0)
  758.                         {
  759.                                 OLED_Clear();
  760.                                 OLED_ShowCH(0,2," 清空指紋庫成功 ");               
  761.                         }
  762.                         else
  763.                                 {};
  764.                         Delay_Ms(1500);
  765.                         goto MENU ; //返回主頁面
  766.                 }               
  767.                 OLED_ShowCH(40,6,"ID=");
  768.                 OLED_ShowNum(65,6,ID_NUM,2,1);
  769.         }
  770.         ensure=PS_DeletChar(ID_NUM,1);//刪除單個指紋
  771.         if(ensure==0)
  772.         {
  773.                 OLED_Clear();
  774.                 OLED_ShowCH(0,2,"  刪除指紋成功  ");               
  775.         }
  776.   else
  777.                 {};        
  778.         Delay_Ms(1500);
  779. MENU:        
  780.         OLED_Clear();
  781.         OLED_ShowCH(0,0,"指紋模塊測試程序");
  782.         OLED_ShowCH(16,2,"K1鍵添加指紋");
  783.         OLED_ShowCH(16,4,"K3鍵刪除指紋");
  784.         OLED_ShowCH(16,6,"K5鍵驗證指紋");
  785.         key_num=0;
  786. }

  787. #endif
復(fù)制代碼


全部資料51hei下載地址:
STC12C5A60S2指紋模塊程序.rar (114.97 KB, 下載次數(shù): 53)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:245302 發(fā)表于 2021-5-14 14:40 | 只看該作者
怎么把串口2改成串口1
回復(fù)

使用道具 舉報

板凳
ID:99490 發(fā)表于 2021-6-10 15:52 | 只看該作者
有原理圖可以參考嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 最新伦理片 | 欧美精品久久久久 | 欧美一区二区三区四区五区无卡码 | 日本免费一区二区三区 | 一区二区三区四区在线 | 国产一级片免费看 | 成人免费共享视频 | 成人av一区 | 一区二区三区国产好的精 | 国产精品一区二区免费 | 国产日韩精品久久 | 欧美日韩亚洲国产综合 | 国产成人精品免费视频 | 午夜天堂精品久久久久 | 国产精品一区在线 | 国产在线不卡 | 欧美日韩在线播放 | 黄色一级片在线播放 | 日日天天| 日本一二三区在线观看 | 一区二区三区在线播放 | 成年人国产在线观看 | 亚洲视频免费观看 | 欧美视频精品 | 在线看一区二区三区 | 亚洲精品久久嫩草网站秘色 | 三级免费毛片 | 国产在线观 | 91国内在线观看 | 99成人精品 | 免费观看www | 国产欧美日韩一区 | 一级毛片免费 | 国产精品久久 | 欧美成人第一页 | 日韩欧美国产精品 | 日本一区二区三区免费观看 | 日日夜夜91 | 久久久久免费 | 免费久久网站 | 请别相信他免费喜剧电影在线观看 |