|
主函數(shù)部分
#include<reg52.h>
#include<intrins.h>
#include"buzz.h"
#include"key.h"
#include"uart.h"
#include"delay.h"
#include"FPM10A.h"
#include"lcd_1602.h"
void main()
{
SRD = 0;//繼電器關(guān)閉
LCD1602_Init(); //初始化液晶
LCD1602_Display(0x80,"Fingerprint Test",0,16); //液晶開機(jī)顯示界面
Uart_Init(); //初始化串口
Key_Init(); //初始化按鍵
Delay_Ms(200); //延時(shí)500MS,等待指紋模塊復(fù)位
Device_Check(); //校對(duì)指紋模塊是否接入正確,液晶做出相應(yīng)的提示
Delay_Ms(1000); //對(duì)接成功界面停留一定時(shí)間
while(1)
{
/**************進(jìn)入主功能界面****************/
LCD1602_Display(0x80," Finger Unlock ",0,16); //第一排顯示搜索指紋
LCD1602_Display(0xc0," Add delete",0,16); //添加和刪除指紋
//第一個(gè)按鈕,切換鍵按下后,進(jìn)行功能選擇
if(KEY_DOWN == 0)
{
while(KEY_DOWN == 0); //等待松開按鍵
if(local_date<=2)
{
local_date++;
if(local_date==3)
local_date=0;
}
}
if(local_date==0)
{
LCD1602_Display(0x80, " *",0,2);
LCD1602_Display(0xc0, " ",0,2);
LCD1602_Display(0xc0+8," ",0,2);
}
else if(local_date==1)
{
LCD1602_Display(0x80, " ",0,2);
LCD1602_Display(0xc0, " *",0,2);
LCD1602_Display(0xc0+8," ",0,2);
}
else if(local_date==2)
{
LCD1602_Display(0x80, " ",0,2);
LCD1602_Display(0xc0, " ",0,2);
LCD1602_Display(0xc0+8," *",0,2);
}
//第二個(gè)按鈕,確認(rèn)鍵按下后,進(jìn)入各自對(duì)應(yīng)的功能。
if(KEY_OK == 0)
{
while(KEY_OK == 0);//等待松開按鍵
switch(local_date)
{
case 0: //搜索指紋
FPM10A_Find_Fingerprint();
break;
case 1: //添加指紋
FPM10A_Add_Fingerprint();
break;
case 2: //清空指紋
FPM10A_Delete_All_Fingerprint();
break;
}
}
if(KEY_LOCK == 0)
{
while(KEY_LOCK == 0);//等待松開按鍵
Buzz_Times(2);
SRD = 1;
Delay_Ms(2000);
SRD = 0;
}
Delay_Ms(100); //延時(shí)判斷100MS檢測一次
}
}
通訊部分
#include <reg52.h>
#include "FPM10A.h"
#include "key.h"
#include "uart.h"
#include "lcd_1602.h"
#include "delay.h"
#include "buzz.h"
//sbit SRD = P2^6;//繼電器
volatile unsigned char FPM10A_RECEICE_BUFFER[32];
unsigned int finger_id = 0;
//FINGERPRINT通信協(xié)議定義
code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗(yàn)證,驗(yàn)證模塊是否正確連接 ,對(duì)應(yīng)19號(hào)指令。
code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //協(xié)議包頭
code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //獲得指紋圖像,對(duì)應(yīng)1號(hào)指令。
code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數(shù)
code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //4號(hào)指令,搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號(hào)指紋
code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1,2號(hào)功能
code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2 ,2號(hào)功能
code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版,5號(hào)功能
code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版,13號(hào)功能
volatile unsigned char FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置,6號(hào)功能
//volatile:系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)
/*------------------ FINGERPRINT命令字 --------------------------*/
//發(fā)送包頭
void FPM10A_Cmd_Send_Pack_Head(void)
{
int i;
for(i=0;i<6;i++) //包頭
{
Uart_Send_Byte(FPM10A_Pack_Head);
}
}
//發(fā)送指令
void FPM10A_Cmd_Check(void)
{
int i=0;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<10;i++)
{
Uart_Send_Byte(FPM10A_Get_Device);
}
}
//接收反饋數(shù)據(jù)緩沖
void FPM10A_Receive_Data(unsigned char ucLength)
{
unsigned char i;
for (i=0;i<ucLength;i++)
FPM10A_RECEICE_BUFFER = Uart_Receive_Byte();
}
//FINGERPRINT_獲得指紋圖像命令
void FPM10A_Cmd_Get_Img(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<6;i++) //發(fā)送命令 0x1d
{
Uart_Send_Byte(FPM10A_Get_Img);
}
}
//講圖像轉(zhuǎn)換成特征碼存放在Buffer1中
void FINGERPRINT_Cmd_Img_To_Buffer1(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
{
Uart_Send_Byte(FPM10A_Img_To_Buffer1);
}
}
//將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
void FINGERPRINT_Cmd_Img_To_Buffer2(void)
{
unsigned char i;
for(i=0;i<6;i++) //發(fā)送包頭
{
Uart_Send_Byte(FPM10A_Pack_Head);
}
for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
{
Uart_Send_Byte(FPM10A_Img_To_Buffer2);
}
}
//搜索全部用戶999枚
void FPM10A_Cmd_Search_Finger(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<11;i++)
{
Uart_Send_Byte(FPM10A_Search);
}
}
void FPM10A_Cmd_Reg_Model(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<6;i++)
{
Uart_Send_Byte(FPM10A_Reg_Model);
}
}
//刪除指紋模塊里的所有指紋模版
void FINGERPRINT_Cmd_Delete_All_Model(void)
{
unsigned char i;
for(i=0;i<6;i++) //包頭
Uart_Send_Byte(FPM10A_Pack_Head);
for(i=0;i<6;i++) //命令合并指紋模版
{
Uart_Send_Byte(FPM10A_Delete_All_Model);
}
}
//保存指紋
void FPM10A_Cmd_Save_Finger( unsigned int storeID )
{
unsigned long temp = 0;
unsigned char i;
FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
FPM10A_Save_Finger[6] = (storeID&0x00FF);
for(i=0;i<7;i++) //計(jì)算校驗(yàn)和
temp = temp + FPM10A_Save_Finger;
FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗(yàn)數(shù)據(jù)
FPM10A_Save_Finger[8]= temp & 0x0000FF;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<9;i++)
Uart_Send_Byte(FPM10A_Save_Finger); //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
}
//添加指紋
void FPM10A_Add_Fingerprint()
{
unsigned char id_show[]={0,0,0};
LCD1602_WriteCMD(0x01); //清屏
finger_id=0;
while(1)
{
LCD1602_Display(0x80," Add finger ",0,16);
LCD1602_Display(0xc0," ID is ",0,16);
//按返回鍵直接回到主菜單
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
//按切換鍵指紋iD值加1
if(KEY_DOWN == 0)
{
while(KEY_DOWN==0);
if(finger_id == 1000)
{
finger_id = 0;
}
else
finger_id = finger_id + 1;
}
//指紋iD值顯示處理
LCD1602_WriteCMD(0xc0+10);
LCD1602_WriteDAT(finger_id/100+48);
LCD1602_WriteDAT(finger_id%100/10+48);
LCD1602_WriteDAT(finger_id%100%10+48);
//按確認(rèn)鍵開始錄入指紋信息
if(KEY_OK == 0)
{
while(KEY_OK==0);
LCD1602_Display(0x80," Please finger ",0,16);
LCD1602_Display(0xc0," ",0,16);
while(KEY_CANCEL == 1)
{
//按下返回鍵退出錄入返回fingerID調(diào)整狀態(tài)
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
FPM10A_Cmd_Get_Img(); //獲得指紋圖像
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
Delay_Ms(100);
FINGERPRINT_Cmd_Img_To_Buffer1();
FPM10A_Receive_Data(12);
LCD1602_Display(0x80,"Successful entry",0,16);
Buzz_Times(1);
Delay_Ms(1000);
LCD1602_Display(0x80," Please finger ",0,16);
LCD1602_Display(0xc0," ",0,16);
while(1)
{
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
FPM10A_Cmd_Get_Img(); //獲得指紋圖像
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
Delay_Ms(200);
LCD1602_Display(0x80,"Successful entry",0,16);
LCD1602_Display(0xc0," ID is ",0,16);
//指紋iD值顯示處理
LCD1602_WriteCMD(0xc0+10);
LCD1602_WriteDAT(finger_id/100+48);
LCD1602_WriteDAT(finger_id%100/10+48);
LCD1602_WriteDAT(finger_id%100%10+48);
FINGERPRINT_Cmd_Img_To_Buffer2();
FPM10A_Receive_Data(12);
FPM10A_Cmd_Reg_Model();//轉(zhuǎn)換成特征碼
FPM10A_Receive_Data(12);
FPM10A_Cmd_Save_Finger(finger_id);
FPM10A_Receive_Data(12);
Buzz_Times(1);
Delay_Ms(1000);
finger_id=finger_id+1;
break;
}
}
break;
}
}
// ClrScreen(); //清空顯示屏
}
// Delay_Ms(500);
}
}
//搜索指紋
void FPM10A_Find_Fingerprint()
{
unsigned int find_fingerid = 0;
unsigned char id_show[]={0,0,0};
do
{
LCD1602_Display(0x80," Please finger ",0,16);
LCD1602_Display(0xc0," ",0,16);
FPM10A_Cmd_Get_Img(); //獲得指紋圖像,將圖像存儲(chǔ)在imagebuffer中
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
Delay_Ms(100);
FINGERPRINT_Cmd_Img_To_Buffer1();
FPM10A_Receive_Data(12);
FPM10A_Cmd_Search_Finger();
FPM10A_Receive_Data(16);
if(FPM10A_RECEICE_BUFFER[9] == 0) //搜索到
{
LCD1602_Display(0x80," Search success ",0,16);
LCD1602_Display(0xc0," ID is ",0,16);
//拼接指紋ID數(shù)
find_fingerid = FPM10A_RECEICE_BUFFER[10]*256 + FPM10A_RECEICE_BUFFER[11];
//指紋iD值顯示處理
LCD1602_WriteCMD(0xc0+10);
LCD1602_WriteDAT(find_fingerid/100+48);
LCD1602_WriteDAT(find_fingerid%100/10+48);
LCD1602_WriteDAT(find_fingerid%100%10+48);
Buzz_Times(2);
SRD = 1;
Delay_Ms(2000);
SRD = 0;
}
else //沒有找到
{
LCD1602_Display(0x80," Search failed ",0,16);
LCD1602_Display(0xc0," ",0,16);
Buzz_Times(3);
}
}
}while(KEY_CANCEL == 1);
}
//刪除所有存貯的指紋庫
void FPM10A_Delete_All_Fingerprint()
{
unsigned char i=0;
LCD1602_Display(0x80," empty all ",0,16);
LCD1602_Display(0xc0," Yes or no ? ",0,16);
do
{
if(KEY_OK==0)
{
while(KEY_OK==0);
LCD1602_Display(0x80," emptying ",0,16);
LCD1602_Display(0xc0," ",0,16);
Delay_Ms(300);
LCD1602_WriteCMD(0xc0);
for(i=0;i<16;i++)
{
LCD1602_WriteDAT(42);
Delay_Ms(100);
}
FINGERPRINT_Cmd_Delete_All_Model();
FPM10A_Receive_Data(12);
LCD1602_Display(0x80," All empty ",0,16);
LCD1602_Display(0xc0," ",0,16);
Buzz_Times(3);
break;
}
}while(KEY_CANCEL==1);
}
void Device_Check(void)
{
unsigned char i=0;
FPM10A_RECEICE_BUFFER[9]=1; //串口數(shù)組第九位可判斷是否通信正常
LCD1602_Display(0xc0,"Loading",0,7); //設(shè)備加載中界面
for(i=0;i<8;i++) //進(jìn)度條式更新,看起來美觀
{
LCD1602_WriteDAT(42); //42對(duì)應(yīng)ASIC碼的 *
Delay_Ms(200); //控制進(jìn)度條速度
}
LCD1602_Display(0xc0,"Docking failure",0,16); //液晶先顯示對(duì)接失敗,如果指紋模塊插對(duì)的話會(huì)將其覆蓋
FPM10A_Cmd_Check(); //單片機(jī)向指紋模塊發(fā)送校對(duì)命令
FPM10A_Receive_Data(12); //將串口接收到的數(shù)據(jù)轉(zhuǎn)存
if(FPM10A_RECEICE_BUFFER[9] == 0) //判斷數(shù)據(jù)低第9位是否接收到0 ,根據(jù)信息格式判斷的。
{
LCD1602_Display(0xc0,"Docking success",0,16); //符合成功條件則顯示對(duì)接成功
}
}
|
|