找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 565|回复: 6
收起左侧

求助大佬,51单片机控制AS608指纹模块卡在对接怎么解决

[复制链接]
ID:1103416 发表于 2023-12-9 14:43 | 显示全部楼层 |阅读模式
附我的代码,及板子图片
1.jpg

指纹测试2.zip

56.18 KB, 下载次数: 2

回复

使用道具 举报

ID:883242 发表于 2023-12-9 21:24 | 显示全部楼层
用逻辑分析仪或示波器看下波形,是否符合通讯协议。
回复

使用道具 举报

ID:327265 发表于 2023-12-9 23:02 | 显示全部楼层
查看写的驱动程序是否有问题,或者您贴上来可以帮您查看
回复

使用道具 举报

ID:1103416 发表于 2023-12-10 08:41 | 显示全部楼层
Hephaestus 发表于 2023-12-9 21:24
用逻辑分析仪或示波器看下波形,是否符合通讯协议。

没有逻辑分析仪咋办
回复

使用道具 举报

ID:1103416 发表于 2023-12-10 08:52 | 显示全部楼层
whwteng 发表于 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:系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据
/*------------------ FINGERPRINT命令字 --------------------------*/
//发送包头
void FPM10A_Cmd_Send_Pack_Head(void)
{
        int i;       
        for(i=0;i<6;i++) //包头
   {
     Uart_Send_Byte(FPM10A_Pack_Head);   
    }               
}
//发送指令
void FPM10A_Cmd_Check(void)
{
        int i=0;
        FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
        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(); //发送通信协议包头
    for(i=0;i<6;i++) //发送命令 0x1d
        {
       Uart_Send_Byte(FPM10A_Get_Img);
        }
}
//讲图像转换成特征码存放在Buffer1中
void FINGERPRINT_Cmd_Img_To_Buffer1(void)
{
        unsigned char i;
        FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头      
           for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 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++)    //发送包头
         {
            Uart_Send_Byte(FPM10A_Pack_Head);   
            }
     for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
      {
              Uart_Send_Byte(FPM10A_Img_To_Buffer2);
             }
}
//搜索全部用户999枚
void FPM10A_Cmd_Search_Finger(void)
{
       unsigned char i;                       
                         FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
       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(); //发送通信协议包头

       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(); //发送通信协议包头       
       for(i=0;i<9;i++)  
                      Uart_Send_Byte(FPM10A_Save_Finger);      //发送命令 将图像转换成 特征码 存放在 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调整状态   
                                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();                                                                        //单片机向指纹模块发送校对命令
                FPM10A_Receive_Data(12);                                                        //将串口接收到的数据转存
                if(FPM10A_RECEICE_BUFFER[9] == 0)                                        //判断数据低第9位是否接收到0 ,根据信息格式判断的。
                {
                        LCD1602_Display(0xc0,"Docking  success",0,16);        //符合成功条件则显示对接成功
                }
}





回复

使用道具 举报

ID:1103416 发表于 2023-12-10 09:02 | 显示全部楼层
现在的情况是板子启动卡在对接,用上位机测试程序连接指纹模块后才能进入功能,但是功能会卡住。还有就是在上位机测试程序接通情况下重启板子,修改指纹模块的波特率为9600 或19200都能过对接,但是也是卡在后续功能。
回复

使用道具 举报

ID:648281 发表于 2023-12-11 11:18 | 显示全部楼层
1、看看开发板晶振是多少,这个要确定
2、根据晶振计算波特率初值,不能错啦
3、采用不同的波特率和AS608对接测试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表