找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1624|回復: 6
打印 上一主題 下一主題
收起左側

求助大佬,51單片機控制AS608指紋模塊卡在對接怎么解決

[復制鏈接]
跳轉到指定樓層
樓主
ID:1103416 發(fā)表于 2023-12-9 14:43 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
附我的代碼,及板子圖片

1.jpg (5.29 MB, 下載次數: 46)

1.jpg

指紋測試2.zip

56.18 KB, 下載次數: 2

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

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2023-12-9 21:24 | 只看該作者
用邏輯分析儀或示波器看下波形,是否符合通訊協議。
回復

使用道具 舉報

板凳
ID:327265 發(fā)表于 2023-12-9 23:02 | 只看該作者
查看寫的驅動程序是否有問題,或者您貼上來可以幫您查看
回復

使用道具 舉報

地板
ID:1103416 發(fā)表于 2023-12-10 08:41 | 只看該作者
Hephaestus 發(fā)表于 2023-12-9 21:24
用邏輯分析儀或示波器看下波形,是否符合通訊協議。

沒有邏輯分析儀咋辦
回復

使用道具 舉報

5#
ID:1103416 發(fā)表于 2023-12-10 08:52 | 只看該作者
whwteng 發(fā)表于 2023-12-9 23:02
查看寫的驅動程序是否有問題,或者您貼上來可以幫您查看

主函數部分
#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;//繼電器關閉                                                       
        LCD1602_Init();                        //初始化液晶
        LCD1602_Display(0x80,"Fingerprint Test",0,16);         //液晶開機顯示界面
    Uart_Init();                        //初始化串口
        Key_Init();                                //初始化按鍵
        Delay_Ms(200);          //延時500MS,等待指紋模塊復位
        Device_Check();                           //校對指紋模塊是否接入正確,液晶做出相應的提示
        Delay_Ms(1000);                        //對接成功界面停留一定時間

        while(1)
        {
            /**************進入主功能界面****************/
                LCD1602_Display(0x80,"  Finger Unlock ",0,16);         //第一排顯示搜索指紋
                LCD1602_Display(0xc0,"  Add     delete",0,16);         //添加和刪除指紋
                    
                                       
            //第一個按鈕,切換鍵按下后,進行功能選擇
                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);       
                }
               
               
               
               
                                       
                //第二個按鈕,確認鍵按下后,進入各自對應的功能。
                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); //延時判斷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通信協議定義

code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證,驗證模塊是否正確連接 ,對應19號指令。
code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像,對應1號指令。
code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數
code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //4號指令,搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號指紋
code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1,2號功能
code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2        ,2號功能
code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版,5號功能
code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版,13號功能
volatile unsigned char  FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置,6號功能
//volatile:系統(tǒng)總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據
/*------------------ 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ā)送通信協議包頭
        for(i=0;i<10;i++)
         {               
                Uart_Send_Byte(FPM10A_Get_Device);
          }
}
//接收反饋數據緩沖
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ā)送通信協議包頭
    for(i=0;i<6;i++) //發(fā)送命令 0x1d
        {
       Uart_Send_Byte(FPM10A_Get_Img);
        }
}
//講圖像轉換成特征碼存放在Buffer1中
void FINGERPRINT_Cmd_Img_To_Buffer1(void)
{
        unsigned char i;
        FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協議包頭      
           for(i=0;i<7;i++)   //發(fā)送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
     {
      Uart_Send_Byte(FPM10A_Img_To_Buffer1);
             }
}
//將圖像轉換成特征碼存放在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ā)送命令 將圖像轉換成 特征碼 存放在 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ā)送通信協議包頭
       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ā)送通信協議包頭

       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++)   //計算校驗和
                              temp = temp + FPM10A_Save_Finger;
                   FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數據
                   FPM10A_Save_Finger[8]= temp & 0x0000FF;                  
       FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協議包頭       
       for(i=0;i<9;i++)  
                      Uart_Send_Byte(FPM10A_Save_Finger);      //發(fā)送命令 將圖像轉換成 特征碼 存放在 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);

         //按確認鍵開始錄入指紋信息                                         
         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調整狀態(tài)   
                                if(KEY_CANCEL == 0)
                                 {
                                  while(KEY_CANCEL==0);
                                  break;
                                  }
                                FPM10A_Cmd_Get_Img(); //獲得指紋圖像
                                FPM10A_Receive_Data(12);
                                //判斷接收到的確認碼,等于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);
                                        //判斷接收到的確認碼,等于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();//轉換成特征碼
                                         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(); //獲得指紋圖像,將圖像存儲在imagebuffer中
                FPM10A_Receive_Data(12);               
                //判斷接收到的確認碼,等于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數
                                 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;                                           //串口數組第九位可判斷是否通信正常
                LCD1602_Display(0xc0,"Loading",0,7);                   //設備加載中界面                                                          
                for(i=0;i<8;i++)                                                           //進度條式更新,看起來美觀
                {
                        LCD1602_WriteDAT(42);                               //42對應ASIC碼的 *
                        Delay_Ms(200);                                                           //控制進度條速度
                }                                                                       
                LCD1602_Display(0xc0,"Docking  failure",0,16);      //液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋       
                FPM10A_Cmd_Check();                                                                        //單片機向指紋模塊發(fā)送校對命令
                FPM10A_Receive_Data(12);                                                        //將串口接收到的數據轉存
                if(FPM10A_RECEICE_BUFFER[9] == 0)                                        //判斷數據低第9位是否接收到0 ,根據信息格式判斷的。
                {
                        LCD1602_Display(0xc0,"Docking  success",0,16);        //符合成功條件則顯示對接成功
                }
}





回復

使用道具 舉報

6#
ID:1103416 發(fā)表于 2023-12-10 09:02 | 只看該作者
現在的情況是板子啟動卡在對接,用上位機測試程序連接指紋模塊后才能進入功能,但是功能會卡住。還有就是在上位機測試程序接通情況下重啟板子,修改指紋模塊的波特率為9600 或19200都能過對接,但是也是卡在后續(xù)功能。
回復

使用道具 舉報

7#
ID:648281 發(fā)表于 2023-12-11 11:18 | 只看該作者
1、看看開發(fā)板晶振是多少,這個要確定
2、根據晶振計算波特率初值,不能錯啦
3、采用不同的波特率和AS608對接測試
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表