久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3980|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片免费在线观看 | 久久网一区二区三区 | 久久久视 | 久久久久久久国产 | 亚洲精品一区二区冲田杏梨 | 精品成人佐山爱一区二区 | 久久久久久91| 日韩在线看片 | av片在线观看网站 | 在线视频一区二区三区 | 亚洲草草视频 | 日韩中文在线 | 亚洲天堂影院 | 精品久久久久久久久久久久 | 视频一区 国产精品 | 欧美日韩在线精品 | 超碰在线网站 | 国产精品区二区三区日本 | 四色永久| 亚洲国产高清高潮精品美女 | 红桃成人在线 | 亚洲国产精品99久久久久久久久 | 欧美精品久久久 | 中文字幕福利视频 | 天天狠狠| 一区二区三区视频在线观看 | 中文字幕a√ | 91精品久久久久久综合五月天 | 97精品视频在线观看 | 国产视频一区二区 | 一区二区三区免费 | 99精品国产一区二区三区 | www在线| 久久成人精品一区二区三区 | 美国十次成人欧美色导视频 | 国内精品久久久久 | 一本一道久久a久久精品综合蜜臀 | 精久久久久 | 欧美成人影院在线 | 亚洲欧美日本在线 | 午夜精品一区二区三区免费视频 |