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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3188|回復(fù): 6
收起左側(cè)

關(guān)于STC8A單片機無法與AS608指紋模塊通信的提問

[復(fù)制鏈接]
ID:830954 發(fā)表于 2021-2-3 15:03 | 顯示全部樓層 |閱讀模式
    各位高手,我正在做一個指紋解鎖的設(shè)計,MCU為STC8A8K64S4A12,指紋模塊為AS608,程序編譯無錯誤,但是指紋模塊怎么也與單片機握手不成功,無法通信!程序是借鑒別人的,借鑒的程序原先是在AT89C52運行的,我把它移植到STC8A上,只是把LCD1602改成了0.96寸7針OLED顯示屏,采用SPI通信,增加了電機控制等,但是移植后串口死活不能通信!用串口助手調(diào)試了串口能收發(fā),但是運行自己的程序時指紋模塊就是不能和單片機握手成功,我懷疑是串口配置有問題,請高手能幫我看一下嗎?以下貼出相關(guān)代碼,感謝!      主函數(shù)如下,開始運行
  1. 1.    #include <stc8.h>
  2. 2.    #include <intrins.h>
  3. 3.    #include "key.h"
  4. 4.    #include "uart.h"
  5. 5.    #include "delay.h"
  6. 6.    #include "FPM10A.h"
  7. 7.    #include "oled.h"

  8. 8.    void main(void)
  9. 9.   {                                                                 
  10. 10.    OLED_Init();
  11. 11.    OLED_Clear();        //初始化液晶
  12. 12.    Uart_Init();                        //初始化串口
  13. 13.    Key_Init();                                //初始化按鍵
  14. 14.    Delay_Ms(200);          //延時500MS,等待指紋模塊復(fù)位
  15. 15.    Device_Check();                           //校對指紋模塊是否接入正確,液晶做出相應(yīng)的提示
  16. 16.   Delay_Ms(1000);                        //對接成功界面停留一定時間
復(fù)制代碼
程序運行到15. Device_Check();就運行不下去了,Device_Check()程序如下
  1. 17.    void Device_Check(void)
  2. 18.     {
  3. 19.    unsigned char i=0;
  4. 20.    FPM10A_RECEICE_BUFFER[9]=1;                                           //串口數(shù)組第九位可判斷是否通信正常
  5. 21.    OLED_ShowString(0,2,"Loading...");        
  6. 22.    Delay_Ms(5000);
  7. 23.    //設(shè)備加載中界面               
  8. 24.      OLED_ShowString(0,2,"Docking  fail");//液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋        
  9. 25.      FPM10A_Cmd_Check();                                                                        //單片機向指紋模塊發(fā)送校對命令
  10. 26.    FPM10A_Receive_Data(12);                                                        //將串口接收到的數(shù)據(jù)轉(zhuǎn)存
  11. 27.    if(FPM10A_RECEICE_BUFFER[9] == 0)                                        //判斷數(shù)據(jù)低第9位是否接收到0 ,根據(jù)信息格式判斷的。
  12. 28.    {
  13. 29.          OLED_Clear();
  14. 30.         OLED_ShowString(0,2,"Docking  success");                 //符合成功條件則顯示對接成功
  15. 31.    }
  16. 32. }
復(fù)制代碼

程序在 OLED顯示完 Docking fail后,走到 25. FPM10A_Cmd_Check();就停止走不下去了


  1. *****************************發(fā)送指令***********************[indent]33.    void FPM10A_Cmd_Check(void)
  2. 34.    {
  3. 35.      int i=0;
  4. 36.      FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
  5. 37.      for(i=0;i<10;i++)
  6. 38.     {               
  7. 39.        Uart_Send_Byte(FPM10A_Get_Device[i]);
  8. 40.      }
  9. 41.    }[/indent][indent] *****************************發(fā)送包頭*************************[/indent][indent]42.      void FPM10A_Cmd_Send_Pack_Head(void)[/indent][indent]43.     {[/indent][indent]44.               int i;        [/indent][indent]45.               for(i=0;i<6;i++) //包頭[/indent][indent]46.     {[/indent][indent]47.            Uart_Send_Byte(FPM10A_Pack_Head[ i]);   [/indent][indent]48.    }                [/indent][indent]49. }[/indent]
復(fù)制代碼
運行至  FPM10A_Cmd_Send_Pack_Head(void)  發(fā)現(xiàn)是 47. Uart_Send_Byte(FPM10A_Pack_Head[ i]); 有問題,串口發(fā)送不了指令!下面貼出串口的初始化配置。Uart_Send_Byte(FPM10A_Pack_Head[ i])在如下程序中

  1. 50.     #include "uart.h"
  2. 51.     #include <stc8.h>

  3. 52.      void Uart_Init(void)
  4. 53.  {
  5.   
  6. 54.       PCON |= 0x80;                //使能波特率倍速位SMOD
  7. 55.       SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  8. 56.    //AUXR = 0xBF;                //定時器1時鐘為Fosc/12,即12T
  9. 57.    //AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  10. 58.    //TMOD &= 0x0F;                //清除定時器1模式位
  11. 59.       TMOD |= 0x20;                //設(shè)定定時器1為8位自動重裝方式
  12. 60.       TL1 = 0xFF;                //設(shè)定定時初值
  13. 61.       TH1 = 0xFF;                //設(shè)定定時器重裝值
  14. 62.       ET1 = 0;                //禁止定時器1中斷
  15. 63.       TR1 = 1;                //啟動定時器1
  16. 64.       EA=1;
  17. 65.}


  18. 66.       void Uart_Send_Byte(unsigned char c) //UART 發(fā)送一個 byte
  19. 67.      {
  20. 69.             SBUF = c;
  21. 70.             while(!TI);                //發(fā)送完為1
  22. 71.             TI = 0;
  23. 72.       }
  24. 73.        unsigned char Uart_Receive_Byte()//UART Receive a byteg
  25. 74.      {        
  26. 75.              unsigned char dat;
  27. 76.            while(!RI);         //接收完為1
  28. 77.            RI = 0;
  29. 78.            dat = SBUF;
  30. 79.            return (dat);
  31. 80.     }
復(fù)制代碼

          再次說明,我使用的是STC8A的單片機,感覺是串口的配置有問,希望各位高手能幫我看一下到底是哪里的問題,感謝!!!!!!!!下面是一部分的指紋模塊通信協(xié)議定義
  1. #include "FPM10A.h"
  2. #include "key.h"
  3. #include "uart.h"
  4. #include "oled.h"
  5. #include "delay.h"
  6. #include <stdio.h>
  7. #include <string.h>



  8. //sbit SRD = P2^6;繼電器
  9. volatile unsigned char FPM10A_RECEICE_BUFFER[32];
  10. unsigned int finger_id = 0;

  11. //FINGERPRINT通信協(xié)議定義

  12. code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證,驗證模塊是否正確連接 ,對應(yīng)19號指令。
  13. code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協(xié)議包頭
  14. code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像,對應(yīng)1號指令。
  15. code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數(shù)
  16. code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //4號指令,搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
  17. code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號指紋
  18. code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1,2號功能
  19. code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2        ,2號功能
  20. code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版,5號功能
  21. code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版,13號功能
  22. volatile unsigned char  FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置,6號功能
  23. //volatile:系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)
  24. /*------------------ FINGERPRINT命令字 --------------------------*/
  25. //發(fā)送包頭
  26. void FPM10A_Cmd_Send_Pack_Head(void)
  27. {
  28.         int i;        
  29.         for(i=0;i<6;i++) //包頭
  30.    {
  31.      Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  32.     }               
  33. }
  34. //發(fā)送指令
  35. void FPM10A_Cmd_Check(void)
  36. {
  37.         int i=0;
  38.         FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
  39.         for(i=0;i<10;i++)
  40.          {               
  41.                 Uart_Send_Byte(FPM10A_Get_Device[i]);
  42.           }
  43. }
  44. //接收反饋數(shù)據(jù)緩沖
  45. void FPM10A_Receive_Data(unsigned char ucLength)
  46. {
  47.   unsigned char i;

  48.   for (i=0;i<ucLength;i++)
  49.      FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();

  50. }

  51. //FINGERPRINT_獲得指紋圖像命令
  52. void FPM10A_Cmd_Get_Img(void)
  53. {
  54.     unsigned char i;
  55.     FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
  56.     for(i=0;i<6;i++) //發(fā)送命令 0x1d
  57.         {
  58.        Uart_Send_Byte(FPM10A_Get_Img[i]);
  59.         }
  60. }
  61. //講圖像轉(zhuǎn)換成特征碼存放在Buffer1中
  62. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  63. {
  64.          unsigned char i;
  65.         FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭      
  66.            for(i=0;i<7;i++)   //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
  67.      {
  68.       Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
  69.              }
  70. }
  71. //將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
  72. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  73. {
  74.      unsigned char i;
  75.      for(i=0;i<6;i++)    //發(fā)送包頭
  76.          {
  77.             Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  78.             }
  79.      for(i=0;i<7;i++)   //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
  80.       {
  81.               Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
  82.              }
  83. }
  84. //搜索全部用戶999枚
  85. void FPM10A_Cmd_Search_Finger(void)
  86. {
  87.        unsigned char i;                       
  88.                          FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
  89.        for(i=0;i<11;i++)
  90.            {
  91.                   Uart_Send_Byte(FPM10A_Search[i]);   
  92.                       }
  93. }

  94. void FPM10A_Cmd_Reg_Model(void)
  95. {
  96.        unsigned char i;           
  97.             
  98.                          FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭

  99.        for(i=0;i<6;i++)
  100.            {
  101.                   Uart_Send_Byte(FPM10A_Reg_Model[i]);   
  102.                       }


  103. }
  104. //刪除指紋模塊里的所有指紋模版
  105. void FINGERPRINT_Cmd_Delete_All_Model(void)
  106. {
  107.      unsigned char i;   
  108.     for(i=0;i<6;i++) //包頭
  109.       Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  110.     for(i=0;i<6;i++) //命令合并指紋模版
  111.            {
  112.       Uart_Send_Byte(FPM10A_Delete_All_Model[i]);   
  113.                  }        
  114. }
  115. //保存指紋
  116. void FPM10A_Cmd_Save_Finger( unsigned int storeID )
  117. {
  118.        unsigned long temp = 0;
  119.                    unsigned char i;
  120.        FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
  121.        FPM10A_Save_Finger[6] = (storeID&0x00FF);
  122.                    for(i=0;i<7;i++)   //計算校驗和
  123.                               temp = temp + FPM10A_Save_Finger[i];
  124.                    FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數(shù)據(jù)
  125.                    FPM10A_Save_Finger[8]= temp & 0x0000FF;                  
  126.        FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭        
  127.        for(i=0;i<9;i++)  
  128.                       Uart_Send_Byte(FPM10A_Save_Finger[i]);      //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
  129. }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:693038 發(fā)表于 2021-2-3 18:19 | 顯示全部樓層
改動太多,要慢慢調(diào)試,接好模塊然后用邏輯分析儀抓一下串口信號,看看串口有沒有收發(fā),看看新增加的屏如果有開內(nèi)存給屏的話看看數(shù)組有沒有溢出,不懂是否能在線調(diào)試,能的話打一下斷點看看程序掛在什么位置,慢慢找一下咯,調(diào)代碼沒法一蹴而就
回復(fù)

使用道具 舉報

ID:584814 發(fā)表于 2021-2-4 09:31 | 顯示全部樓層
這AT89C52和STC8A單片機同屬51但速度和功能差很多,所以要看看器件手冊
回復(fù)

使用道具 舉報

ID:830954 發(fā)表于 2021-2-4 17:16 | 顯示全部樓層
lincheng15 發(fā)表于 2021-2-3 18:19
改動太多,要慢慢調(diào)試,接好模塊然后用邏輯分析儀抓一下串口信號,看看串口有沒有收發(fā),看看新增加的屏如果 ...

好的,感謝,其實改動不多,就改了一個顯示屏,我感覺可能單片機的串口配置有問題,我再去看一看吧。
回復(fù)

使用道具 舉報

ID:830954 發(fā)表于 2021-2-4 17:17 | 顯示全部樓層
man1234567 發(fā)表于 2021-2-4 09:31
這AT89C52和STC8A單片機同屬51但速度和功能差很多,所以要看看器件手冊

我也感覺
回復(fù)

使用道具 舉報

ID:883031 發(fā)表于 2021-2-5 16:06 | 顯示全部樓層
STC單片機比AT89C51速度快,看看是不是時序上有問題。
回復(fù)

使用道具 舉報

ID:971944 發(fā)表于 2022-1-7 11:40 | 顯示全部樓層
請問你解決了嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产播12软件 | 精品国产青草久久久久福利 | 亚洲成av人片在线观看无码 | 97精品超碰一区二区三区 | 99精品国自产在线 | 精品一区久久 | 午夜视频一区二区三区 | 国产做a爱免费视频 | 国产特黄一级 | 精品国产乱码久久久久久丨区2区 | 亚洲福利网站 | 国产精品一区一区 | 国产在线精品一区二区三区 | 国产激情一区二区三区 | 欧美一级大片免费看 | 久久久精品综合 | 国产乱精品一区二区三区 | 国产欧美一区二区三区久久手机版 | 欧美在线a| 日韩欧美综合在线视频 | wwww.xxxx免费 | 天天操天天射天天舔 | 精品国产1区2区3区 一区二区手机在线 | 羞羞视频网站在线观看 | 久99久视频 | 日本三级全黄三级a | 国产三级网站 | 成人精品鲁一区一区二区 | 欧美成人精品 | 99热.com| 精品无码久久久久久国产 | 国产91久久久久蜜臀青青天草二 | 91在线精品一区二区 | 天天综合操 | 国产精品视频一区二区三区四蜜臂 | 国产高清久久久 | 91精品国产色综合久久不卡98 | 亚洲性视频网站 | 亚洲国产小视频 | 中文字幕一区二区三区四区 | 日韩欧美在线免费 |