|
51單片機(jī)實(shí)現(xiàn)指紋識(shí)別,首先錄入指紋,然后與庫(kù)中的指紋對(duì)比,來(lái)實(shí)現(xiàn)指紋的識(shí)別簽到
51hei圖片20220420234557.png (189.74 KB, 下載次數(shù): 77)
下載附件
2022-4-20 23:47 上傳
單片機(jī)源程序如下:
- /*******************************************************************************
- **文件名:BIOVO.c
- **說(shuō)明:指紋芯片數(shù)據(jù)處理
- **編程人員:李
- *******************************************************************************/
- #include "config.h"
- #define UART_BUF_LEN 8
- #define BUF_N 8
- unsigned char rBuf[UART_BUF_LEN]; //接收返回信息
- unsigned char tBuf[UART_BUF_LEN]; //發(fā)送命令或者數(shù)據(jù)
- unsigned char g_ucUartRxEnd ; //接收返回信息結(jié)束標(biāo)志
- unsigned char g_ucUartRxLen ; //接收返回信息長(zhǎng)度
- unsigned char l_ucFPID; //用戶(hù)編號(hào)
- extern unsigned char p; // 串口接收地址
- /*******************************************************************
- **功能:延時(shí)程序
- **參數(shù):
- **返回:無(wú)
- *******************************************************************/
-
- void Delay_ms(unsigned int ms)
- {
- unsigned int i=0,j=0;
- for(i=0;i<ms;i++)
- for(j=0;j<123;j++);
- }
- /*******************************************************************************
- **功能:等待數(shù)據(jù)包發(fā)送完成
- **參數(shù):
- **返回:無(wú)
- *******************************************************************************/
- unsigned char WaitFpData(void)
- {
- unsigned char i;
-
- for(i=200; i>0; i--)//等待指紋芯片返回
- {
- Delay_ms(40);
- if(g_ucUartRxEnd)break;
- }
- if(i==0)return FALSE;//指紋芯片沒(méi)有返回
- else return TRUE;
- }
- /*******************************************************************************
- **功能: 計(jì)算校驗(yàn)值
- **參數(shù): 要發(fā)送的數(shù)據(jù)指針地址
- **返回: 校驗(yàn)值
- *******************************************************************************/
- unsigned char CmdGenCHK(unsigned char wLen,unsigned char *ptr)
- {
- unsigned char i,temp = 0;
-
- for(i = 0; i < wLen; i++)
- {
- temp ^= *(ptr + i);
- }
- return temp;
- }
- /*******************************************************************************
- **功能: 發(fā)送控制指紋芯片指令
- **參數(shù): wLen 數(shù)據(jù)長(zhǎng)度
- cpPara 發(fā)送的數(shù)據(jù)
- **返回:void
- *******************************************************************************/
- void UART_SendPackage(unsigned char wLen,unsigned char *ptr)
- {
- unsigned int i=0,len=0;
-
- tBuf[0] = DATA_START;//指令包
- for(i = 0; i < wLen; i++) // data in packet
- {
- tBuf[1+i] = *(ptr+i);
- }
-
- tBuf[wLen + 1] = CmdGenCHK(wLen, ptr); //Generate checkout data
- tBuf[wLen + 2] = DATA_END;
- len = wLen + 3;
-
- g_ucUartRxEnd = 0;
- g_ucUartRxLen = len ;
-
- UartSend(tBuf,len);
- }
-
- /*******************************************************************************
- **功能:返回信息處理
- **參數(shù): cmd 不同命令不同處理
- **返回:處理結(jié)果
- *******************************************************************************/
- unsigned char Check_Package(unsigned char cmd)
- {
- unsigned char flag = FALSE;
- if(!WaitFpData()) return flag; //等待接收返回信息
- p = 0 ;
- if(g_ucUartRxEnd)
- g_ucUartRxEnd = 0;//清數(shù)據(jù)包接收標(biāo)志
- else
- return flag;
-
- if(rBuf[0] != DATA_START)return flag;
- if(rBuf[1] != cmd)return flag;
- if(rBuf[6] != CmdGenCHK(g_ucUartRxLen - 3, &rBuf[1]))return flag;
- switch(cmd)
- {
- case CMD_ENROLL1:
- case CMD_ENROLL2:
- case CMD_ENROLL3:
- if(ACK_SUCCESS == rBuf[4])flag = TRUE;
- else if(ACK_USER_EXIST == rBuf[4])
- {
- // Spk_HaveUser();
- Delay_ms(1500);
- }
- break;
- case CMD_DELETE: //刪除指定編號(hào)指紋
- case CMD_CLEAR: //清空所有指紋
- case CMD_IDENTIFY: //1:1比對(duì)
- if(ACK_SUCCESS == rBuf[4])flag = TRUE;
- break;
- case CMD_USERNUMB: //取用戶(hù)總數(shù)
- if(ACK_SUCCESS == rBuf[4])
- {
- flag = TRUE;
- l_ucFPID = rBuf[3];
- }
- break;
- case CMD_SEARCH: //1:N比對(duì)
- if((1 == rBuf[4])||(2 == rBuf[4])||(3 == rBuf[4]))
- {
- flag = TRUE;
- l_ucFPID = rBuf[3];
- }
- break;
- default:
- break;
- }
-
- return flag;
- }
- /*******************************************************************************
- **功能:以CharBuffer1 或CharBuffer2 中的特征文件搜索整個(gè)或部分指紋庫(kù)
- **參數(shù):
- **返回:無(wú)
- *******************************************************************************/
- void FP_Search(void)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_SEARCH; //1:N比對(duì)
- *(buf+1) = 0x00;
- *(buf+2) = 0x00;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **功能:清空 flash 指紋庫(kù)
- **參數(shù):
- **返回:無(wú)
- *******************************************************************************/
- void FP_Clear(void)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_CLEAR;
- *(buf+1) = 0x00;
- *(buf+2) = 0x00;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **功能:刪除指定編號(hào)指紋
- **參數(shù):u_id
- **返回:void
- *******************************************************************************/
- void FP_Delete(unsigned int u_id)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_DELETE;
- *(buf+1) = u_id>>8;
- *(buf+2) = u_id&0xff;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **功能:1:1比對(duì)
- **參數(shù):u_id
- **返回:void
- *******************************************************************************/
- void FP_Identify(unsigned int u_id)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_IDENTIFY;
- *(buf+1) = u_id>>8;
- *(buf+2) = u_id&0xff;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **注冊(cè)指紋
- **輸入兩次指紋注冊(cè)一個(gè)指紋模板
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- void Enroll_Step1(unsigned int u_id)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_ENROLL1;
- *(buf+1) = u_id>>8;
- *(buf+2) = u_id&0xff;
- *(buf+3) = 1;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **注冊(cè)指紋
- **輸入兩次指紋注冊(cè)一個(gè)指紋模板
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- void Enroll_Step2(unsigned int u_id)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_ENROLL2;
- *(buf+1) = u_id>>8;
- *(buf+2) = u_id&0xff;
- *(buf+3) = 1;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **注冊(cè)指紋
- **輸入三次指紋注冊(cè)一個(gè)指紋模板
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- void Enroll_Step3(unsigned int u_id)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_ENROLL3;
- *(buf+1) = u_id>>8;
- *(buf+2) = u_id&0xff;
- *(buf+3) = 1;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **注冊(cè)指紋
- **輸入三次指紋注冊(cè)一個(gè)指紋模板
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- unsigned char Finger_Enroll(unsigned int u_id)
- {
- Enroll_Step1(u_id);
- if(FALSE == Check_Package(CMD_ENROLL1))return FALSE;
- Delay_ms(100);
-
- Enroll_Step2(u_id);
- if(FALSE == Check_Package(CMD_ENROLL2))return FALSE;
- Delay_ms(100);
-
- Enroll_Step3(u_id);
- return Check_Package(CMD_ENROLL3);
- }
- /*******************************************************************************
- **清空指紋
- **
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- unsigned char Finger_Clear(void)
- {
- FP_Clear();
- // if(FALSE == WaitFpData())return FALSE;
- return Check_Package(CMD_CLEAR);
- }
- /*******************************************************************************
- **刪除指定指紋
- **
- **參數(shù):UserID 指紋號(hào)
- *******************************************************************************/
- unsigned char Finger_Delete(unsigned int u_id)
- {
- FP_Delete(u_id);
- // if(FALSE == WaitFpData())return FALSE;
- return Check_Package(CMD_DELETE);
- }
- /*******************************************************************************
- **讀取用戶(hù)總數(shù)
- **
- **參數(shù)
- *******************************************************************************/
- unsigned char Finger_Read(void)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_USERNUMB;
- *(buf+1) = 0x00;
- *(buf+2) = 0x00;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- return Check_Package(CMD_USERNUMB);
- }
- /*******************************************************************************
- **讀取用戶(hù)總數(shù)
- **
- **參數(shù)
- *******************************************************************************/
- unsigned char Finger_Search(void)
- {
- FP_Search();
- return Check_Package(CMD_SEARCH);
- }
復(fù)制代碼
Keil代碼下載:
FPC1020 _51單片機(jī).rar
(64.04 KB, 下載次數(shù): 47)
2022-4-20 23:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|