找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3382|回复: 16
打印 上一主题 下一主题
收起左侧

求助大神,AS608指纹模块与51单片机编程问题

[复制链接]
跳转到指定楼层
楼主
本帖最后由 立夏匆匆 于 2020-5-4 10:36 编辑

我的程序.zip (94 KB, 下载次数: 18)



这个问题已经折磨我快一周了,怎么查程序的问题都查不出来,增加指纹这个函数只要一运行,就只能显示“请按指纹”这四个字,然后即便按指纹也不会运行下面的程序,确认码也能返回,就是不往下运行。附程序:#include <reg52.h>
#include <intrins.h>

sbit TCH = P3^7;//按指纹识别
uchar data querenma=11;//用于缓存确认码
uchar sum[2],sum1[2];//sum存放应答包的校验和,sum1存放指令包的校验和
int sum_ans,sum_ins;//定义整形变量用来存放2字节大小的校验和
uint page_ID;//存放注册函数中的页码

/**************************************************
函数名称:端口初始化
单片机:晶振11.0592MHz 波特率为9600bps
指纹模块:波特率为9600bps
***************************************************/
void UART_init()
{
        SCON = 0x50;//串行寄存器设为串行口工作方式1(01010000)
        PCON = 0x00;//一般默认为0
  TMOD = 0x20;//定时器1,工作方式2
        TH1 = 0xfd;//T1定时器装初值(波特率9600bps)
        TL1 = 0xfd;//T1定时器装初值
        TR1 = 1;//启动定时器1
        EA = 1;//开总中断
}
/**************************************************
函数作用:串口发送1帧数据
***************************************************/
void UART_sent_byte(uchar c)
{
  SBUF = c;//将要发送的数据放在SBUF中,单片机会自动发送
        while (!TI);//判断一下TI有没有置1,如果TI等于0,说明没有
                    //发完,那么会一直等待。如果发送完了,那么TI
                    //等于1,1取反为0,那么会跳出这句话。
        TI = 0;//发送完了,要把发送标志位清零
}
/**************************************************
函数作用:串口接收1帧数据
和发送函数原理一样,只是把发送标志位改为接收标志位。
***************************************************/
uchar UART_receive_byte()
{
        uchar dat;
        while (!RI);
        RI = 0;
        dat = SBUF;
  return (dat);
}
/**************************************************
函数作用:录入指纹图像
***************************************************/
void getimage()
{
        uchar i;
  UART_sent_byte(0xef);
        UART_sent_byte(0x01);//协议包头为0xef01
        
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);//芯片地址为0xffffffff
        
        UART_sent_byte(0x01);//包标识

        UART_sent_byte(0x00);
        UART_sent_byte(0x03);//包长度是2字节的03H
        
        UART_sent_byte(0x01);//录入图像指令码
        
        UART_sent_byte(0x00);
        UART_sent_byte(0x05);//校验和是2字节的05H
        
        for (i=0;i<9;i++)//接收应答包前9字节为包头,芯片地址,包识别,包长度
        {
          while (!RI);
                RI = 0;
        }
        
        querenma = UART_receive_byte();
        sum[1] = UART_receive_byte();
        sum[0] = UART_receive_byte();
        sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
        
}

/**************************************************
函数作用:生成指纹特征,并存入bufferID中
***************************************************/
void genchar(uchar bufferID)
{
  uchar i;
  UART_sent_byte(0xef);
        UART_sent_byte(0x01);//协议包头为0xef01
        
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);//芯片地址为0xffffffff
        
        UART_sent_byte(0x01);//包标识

        UART_sent_byte(0x00);
        UART_sent_byte(0x04);//包长度是2字节的04H
        
        UART_sent_byte(0x02);//生成特征指令码
        
        UART_sent_byte(bufferID);//输入特征缓冲区号
        
  sum_ins = 0x07+bufferID;
        sum1[0] = sum_ins;
        sum1[1] = sum_ins>>8;
        UART_sent_byte(sum1[1]);
        UART_sent_byte(sum1[0]);
        
        for (i=0;i<9;i++)//接收应答包前9字节为包头,芯片地址,包识别,包长度
        {
          while (!RI);
                RI = 0;
        }
        
        querenma = UART_receive_byte();
        sum[1] = UART_receive_byte();
        sum[0] = UART_receive_byte();
        sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}
/**************************************************
函数作用:自动注册模板。
采集一次指纹注册模板,在指纹库中搜索空位并存储,返回
储存ID。
***************************************************/
void enroll()
{
        uchar i,ID1,ID2;
  UART_sent_byte(0xef);
        UART_sent_byte(0x01);//协议包头为0xef01
        
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);//芯片地址为0xffffffff
        
        UART_sent_byte(0x01);//包标识

        UART_sent_byte(0x00);
        UART_sent_byte(0x03);//包长度是2字节的03H
        
        UART_sent_byte(0x10);//指令码
        
        UART_sent_byte(0x00);
        UART_sent_byte(0x14);//校验和
        
        for (i=0;i<9;i++)////接收应答包前9字节为包头,芯片地址,包识别,包长度
        {
          while (!RI);
                RI = 0;
        }
        
        querenma = UART_receive_byte();
        
        ID1 = UART_receive_byte();
        ID2 = UART_receive_byte();//存放页码
        
        sum[1] = UART_receive_byte();
        sum[0] = UART_receive_byte();
        
        page_ID = (ID1<<8)+ID2;//存放16位页码
        sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}

/**************************************************
函数作用:高速搜索。
1.以charbuffer1或charbuffer2中的特征文件高速搜索整个或
部分指纹库。若搜索到就返回页码。
2.该指令对于的确存在于指纹库中,且登录时质量很好的指纹,
会很快给出搜索结果。
***************************************************/
void fastsearch(uchar BufferID)
{
  uchar i,ID1,ID2;
  UART_sent_byte(0xef);
        UART_sent_byte(0x01);//协议包头为0xef01
        
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);
        UART_sent_byte(0xff);//芯片地址为0xffffffff
        
        UART_sent_byte(0x01);//包标识

        UART_sent_byte(0x00);
        UART_sent_byte(0x08);//包长度
        
        UART_sent_byte(0x1b);//指令码
        
        UART_sent_byte(BufferID);//缓冲区号
        
        UART_sent_byte(0x00);
        UART_sent_byte(0x00);//起始页码
        
        UART_sent_byte(0x00);
        UART_sent_byte(0xb4);//页码数量180
        
        sum_ins = 9+0x1b+BufferID+0xb4;//校验和
        sum1[0] = sum_ins;
        sum1[1] = sum_ins>>8;
        UART_sent_byte(sum[1]);
        UART_sent_byte(sum[0]);
        
        for (i=0;i<9;i++)////接收应答包前9字节为包头,芯片地址,包识别,包长度
        {
          while (!RI);
                RI = 0;
        }
        
        querenma = UART_receive_byte();
        
        ID1 = UART_receive_byte();
        ID2 = UART_receive_byte();//存放页码
        
        while(!RI);
        RI = 0;
        while(!RI);
        RI = 0;         //2字节的得分
        
        sum[1] = UART_receive_byte();
        sum[0] = UART_receive_byte();
        
        page_ID = (ID1<<8)+ID2;//存放16位页码
        sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}



/**************************************************
增加指纹函数
***************************************************/

void addfinger()
{
        uchar IDa,IDb,IDc;//存储返回的指纹序号
  PutStr(1,2,"请按手指");
        getimage();
        while (querenma != 0)
        getimage();
        genchar(bufferID1);
        UART_init();
        fastsearch(bufferID1);
        while (querenma == 1)
        fastsearch(bufferID1);
        if (querenma == 0)
        {
          lcdclear();
                PutStr(1,1,"指纹已被录入");
                PutStr(2,1,"请按任意键继续");
                while(keycheck()==0);
        }
  else if (querenma == 9)
        {
          lcdclear();
                PutStr(1,1,"请再按手指");
                enroll();
                while (querenma == 2)
                enroll();
                lcdclear();
                if (querenma == 0)
                {
                  IDa = page_ID /100;//取百位
                        IDb = (page_ID-IDa*100)/10;//取十位
                        IDc = page_ID%10;//取个位
                        PutStr(1,1,"指纹录入成功");
                        PutStr(2,1,"编号为:");
                        lcd_wcmd(0x8d);
                        lcd_wdat(0x30+IDa);lcd_wdat(0x30+IDb);lcd_wdat(0x30+IDc);//通过ASC码值进行输出
                }
    else if(querenma != 0)
                {
                        PutStr(1,1,"指纹录入失败");
                        PutStr(2,1,"请重新操作");
                }
                PutStr(3,0,"请按任意键继续");
                while (keycheck() == 0);
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648281 发表于 2020-5-2 16:51 | 只看该作者
你好!
这个只能是软硬件结合,分步来调试
回复

使用道具 举报

板凳
ID:742880 发表于 2020-5-2 17:12 | 只看该作者
51hei**1140 发表于 2020-5-2 16:51
你好!
这个只能是软硬件结合,分步来调试

硬件是没问题的,我已经调了好几次了。程序运行也没有报错,所以我现在根本不知道到底是硬件的问题还是软件的问题
回复

使用道具 举报

地板
ID:452950 发表于 2020-5-2 19:41 | 只看该作者
你好,你用的指令太繁琐了,可以只用自动注册指纹enroll实现录入指纹,可以用AS608的手指探测功能(Touch引脚),检测到手指后再发送enroll指令。
回复

使用道具 举报

5#
ID:742880 发表于 2020-5-2 20:51 | 只看该作者
xxpp2011 发表于 2020-5-2 19:41
你好,你用的指令太繁琐了,可以只用自动注册指纹enroll实现录入指纹,可以用AS608的手指探测功能(Touch引 ...

你好,也许是指令太繁琐的问题吧,但是感觉逻辑上也讲得通啊。不过我在程序里还使用了删除指纹和识别指纹两个指令,这两个指令都是单独放在一个函数里就可以运行。这个增加指纹的函数里面放了三个指令就不能运行,我再调试一下吧。先谢谢了。
回复

使用道具 举报

6#
ID:452950 发表于 2020-5-2 22:22 | 只看该作者
立夏匆匆 发表于 2020-5-2 20:51
你好,也许是指令太繁琐的问题吧,但是感觉逻辑上也讲得通啊。不过我在程序里还使用了删除指纹和识别指纹 ...

       genchar(bufferID1);
        while (querenma != 0)
        genchar(bufferID1);
改成
        genchar(bufferID1);
生成特征处理信息只在指纹模块内部进行,不像录入图像需要按手指,如果录入的指纹图像够清晰完整,一次就肯定成功,当录入的指纹图像不够清晰完整时,无论生成多少次也不会成功,会导致卡在循环里面。
回复

使用道具 举报

7#
ID:742880 发表于 2020-5-3 09:15 | 只看该作者
xxpp2011 发表于 2020-5-2 22:22
genchar(bufferID1);
        while (querenma != 0)
        genchar(bufferID1);

我照您说的方法改了,但还是不行,程序还是卡在“请按指纹”这个地方,然后按指纹也不往下运行。
回复

使用道具 举报

8#
ID:452950 发表于 2020-5-3 10:37 | 只看该作者
立夏匆匆 发表于 2020-5-3 09:15
我照您说的方法改了,但还是不行,程序还是卡在“请按指纹”这个地方,然后按指纹也不往下运行。

你好,你的录入指纹函数里面的文字是请按手指,你说卡在请按指纹的界面,说明不是卡在录入指纹这一程序,建议发完整代码或者仔细检查一下。
回复

使用道具 举报

9#
ID:452950 发表于 2020-5-3 11:29 | 只看该作者
如果确实是这个函数卡住,只能在中间试试串口初始化了,毕竟用的指令太多,中间某一环丢包了就很麻烦。
void addfinger()
{
        uchar IDa,IDb,IDc;//存储返回的指纹序号
  PutStr(1,2,"请按手指");
        getimage();
        while (querenma != 0)
        getimage();
        genchar(bufferID1);
        UART_init();
        fastsearch(bufferID1);
        while (querenma == 1)
        fastsearch(bufferID1);
        if (querenma == 0)
        {
          lcdclear();
                PutStr(1,1,"指纹已被录入");
                PutStr(2,1,"请按任意键继续");
                while(keycheck()==0);
        }
回复

使用道具 举报

10#
ID:718485 发表于 2020-5-3 13:54 来自手机 | 只看该作者
楼主,我也出现和你一模一样的问题,请问楼主解决这个问题了吗?
回复

使用道具 举报

11#
ID:742880 发表于 2020-5-3 17:18 | 只看该作者
xxpp2011 发表于 2020-5-3 11:29
如果确实是这个函数卡住,只能在中间试试串口初始化了,毕竟用的指令太多,中间某一环丢包了就很麻烦。
vo ...

其实您说的这些方法,我之前都有试过,都不行。而且我还调试过这样一个程序
void addfinger()
{
        uchar IDa,IDb,IDc;//存储返回的指纹序号
  PutStr(1,2,"请按手指");
        getimage();
        while (querenma != 0)
        {getimage();PutStr(2,2,"错误");}
        genchar(bufferID1);
        UART_init();
        fastsearch(bufferID1);
        while (querenma == 1)
        fastsearch(bufferID1);
        if (querenma == 0)
        {
          lcdclear();
                PutStr(1,1,"指纹已被录入");
                PutStr(2,1,"请按任意键继续");
                while(keycheck()==0);
        }
我主要是想看它是不是能返回确认码,但是它确实可以返回,在我没按指纹时,它就能在屏幕上显示错误。当我按指纹的时候,“错误”就不会显示。但是程序依旧只能卡在这里。
回复

使用道具 举报

12#
ID:742880 发表于 2020-5-3 17:18 | 只看该作者
HAYA 发表于 2020-5-3 13:54
楼主,我也出现和你一模一样的问题,请问楼主解决这个问题了吗?

还没有,正在苦恼着。
回复

使用道具 举报

13#
ID:742880 发表于 2020-5-3 17:32 | 只看该作者
xxpp2011 发表于 2020-5-3 10:37
你好,你的录入指纹函数里面的文字是请按手指,你说卡在请按指纹的界面,说明不是卡在录入指纹这一程序, ...

完整的程序,除了调用以外,和增加指纹函数相关的函数,我又都附上了,有一些定义之类的,您看看可不可以
回复

使用道具 举报

14#
ID:818291 发表于 2020-11-28 16:29 | 只看该作者
sum[1] = UART_receive_byte();         sum[0] = UART_receive_byte();                  page_ID = (ID1<<8)+ID2;//存放16位页码         sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和 这个是什么意思呀?
回复

使用道具 举报

15#
ID:714012 发表于 2022-4-26 18:19 | 只看该作者
楼主,问题解决了吗,我也遇到这个问题了,不知道怎么解决了

回复

使用道具 举报

16#
ID:161164 发表于 2022-4-27 11:32 | 只看该作者
清风无虑 发表于 2022-4-26 18:19
楼主,问题解决了吗,我也遇到这个问题了,不知道怎么解决了

手上没有AS608模组
只能从代码和数据手册入手如果你是用了楼主的代码
可以参考我的发现
在main.c






358行的指令码应该是0x04而不是0x1b
AS608的指令码中没有0x1b
不知道AS608会不会有数据返回/返回多长的数据

因为后面的代码


一定要接收等于/多于16字节的数据
不然就会被while(!RI)卡死

不太建议用while(!RI)这种写法来等待数据
一不小心/丢包就会卡死程序

回复

使用道具 举报

17#
ID:1004248 发表于 2022-6-10 08:16 | 只看该作者
请问指纹WAK和Vt端是不是一直接高电平

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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