51單片機實現指紋識別,首先錄入指紋,然后與庫中的指紋對比,來實現指紋的識別簽到
51hei圖片20220420234557.png (189.74 KB, 下載次數: 77)
下載附件
2022-4-20 23:47 上傳
單片機源程序如下:
- /*******************************************************************************
- **文件名:BIOVO.c
- **說明:指紋芯片數據處理
- **編程人員:李
- *******************************************************************************/
- #include "config.h"
- #define UART_BUF_LEN 8
- #define BUF_N 8
- unsigned char rBuf[UART_BUF_LEN]; //接收返回信息
- unsigned char tBuf[UART_BUF_LEN]; //發送命令或者數據
- unsigned char g_ucUartRxEnd ; //接收返回信息結束標志
- unsigned char g_ucUartRxLen ; //接收返回信息長度
- unsigned char l_ucFPID; //用戶編號
- extern unsigned char p; // 串口接收地址
- /*******************************************************************
- **功能:延時程序
- **參數:
- **返回:無
- *******************************************************************/
-
- void Delay_ms(unsigned int ms)
- {
- unsigned int i=0,j=0;
- for(i=0;i<ms;i++)
- for(j=0;j<123;j++);
- }
- /*******************************************************************************
- **功能:等待數據包發送完成
- **參數:
- **返回:無
- *******************************************************************************/
- 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;//指紋芯片沒有返回
- else return TRUE;
- }
- /*******************************************************************************
- **功能: 計算校驗值
- **參數: 要發送的數據指針地址
- **返回: 校驗值
- *******************************************************************************/
- 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;
- }
- /*******************************************************************************
- **功能: 發送控制指紋芯片指令
- **參數: wLen 數據長度
- cpPara 發送的數據
- **返回: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);
- }
-
- /*******************************************************************************
- **功能:返回信息處理
- **參數: cmd 不同命令不同處理
- **返回:處理結果
- *******************************************************************************/
- unsigned char Check_Package(unsigned char cmd)
- {
- unsigned char flag = FALSE;
- if(!WaitFpData()) return flag; //等待接收返回信息
- p = 0 ;
- if(g_ucUartRxEnd)
- g_ucUartRxEnd = 0;//清數據包接收標志
- 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: //刪除指定編號指紋
- case CMD_CLEAR: //清空所有指紋
- case CMD_IDENTIFY: //1:1比對
- if(ACK_SUCCESS == rBuf[4])flag = TRUE;
- break;
- case CMD_USERNUMB: //取用戶總數
- if(ACK_SUCCESS == rBuf[4])
- {
- flag = TRUE;
- l_ucFPID = rBuf[3];
- }
- break;
- case CMD_SEARCH: //1:N比對
- if((1 == rBuf[4])||(2 == rBuf[4])||(3 == rBuf[4]))
- {
- flag = TRUE;
- l_ucFPID = rBuf[3];
- }
- break;
- default:
- break;
- }
-
- return flag;
- }
- /*******************************************************************************
- **功能:以CharBuffer1 或CharBuffer2 中的特征文件搜索整個或部分指紋庫
- **參數:
- **返回:無
- *******************************************************************************/
- void FP_Search(void)
- {
- unsigned char buf[BUF_N];
-
- *buf = CMD_SEARCH; //1:N比對
- *(buf+1) = 0x00;
- *(buf+2) = 0x00;
- *(buf+3) = 0x00;
- *(buf+4) = 0x00;
- UART_SendPackage(5, buf);
- }
- /*******************************************************************************
- **功能:清空 flash 指紋庫
- **參數:
- **返回:無
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **功能:刪除指定編號指紋
- **參數: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比對
- **參數: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);
- }
- /*******************************************************************************
- **注冊指紋
- **輸入兩次指紋注冊一個指紋模板
- **參數:UserID 指紋號
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **注冊指紋
- **輸入兩次指紋注冊一個指紋模板
- **參數:UserID 指紋號
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **注冊指紋
- **輸入三次指紋注冊一個指紋模板
- **參數:UserID 指紋號
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **注冊指紋
- **輸入三次指紋注冊一個指紋模板
- **參數:UserID 指紋號
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **清空指紋
- **
- **參數:UserID 指紋號
- *******************************************************************************/
- unsigned char Finger_Clear(void)
- {
- FP_Clear();
- // if(FALSE == WaitFpData())return FALSE;
- return Check_Package(CMD_CLEAR);
- }
- /*******************************************************************************
- **刪除指定指紋
- **
- **參數:UserID 指紋號
- *******************************************************************************/
- unsigned char Finger_Delete(unsigned int u_id)
- {
- FP_Delete(u_id);
- // if(FALSE == WaitFpData())return FALSE;
- return Check_Package(CMD_DELETE);
- }
- /*******************************************************************************
- **讀取用戶總數
- **
- **參數
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- **讀取用戶總數
- **
- **參數
- *******************************************************************************/
- unsigned char Finger_Search(void)
- {
- FP_Search();
- return Check_Package(CMD_SEARCH);
- }
復制代碼
Keil代碼下載:
FPC1020 _51單片機.rar
(64.04 KB, 下載次數: 47)
2022-4-20 23:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|