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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于STC8A單片機無法與AS608指紋模塊通信的提問

[復制鏈接]
跳轉到指定樓層
樓主
ID:830954 發表于 2021-2-3 15:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    各位高手,我正在做一個指紋解鎖的設計,MCU為STC8A8K64S4A12,指紋模塊為AS608,程序編譯無錯誤,但是指紋模塊怎么也與單片機握手不成功,無法通信!程序是借鑒別人的,借鑒的程序原先是在AT89C52運行的,我把它移植到STC8A上,只是把LCD1602改成了0.96寸7針OLED顯示屏,采用SPI通信,增加了電機控制等,但是移植后串口死活不能通信!用串口助手調試了串口能收發,但是運行自己的程序時指紋模塊就是不能和單片機握手成功,我懷疑是串口配置有問題,請高手能幫我看一下嗎?以下貼出相關代碼,感謝!      主函數如下,開始運行
  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,等待指紋模塊復位
  15. 15.    Device_Check();                           //校對指紋模塊是否接入正確,液晶做出相應的提示
  16. 16.   Delay_Ms(1000);                        //對接成功界面停留一定時間
復制代碼
程序運行到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;                                           //串口數組第九位可判斷是否通信正常
  5. 21.    OLED_ShowString(0,2,"Loading...");        
  6. 22.    Delay_Ms(5000);
  7. 23.    //設備加載中界面               
  8. 24.      OLED_ShowString(0,2,"Docking  fail");//液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋        
  9. 25.      FPM10A_Cmd_Check();                                                                        //單片機向指紋模塊發送校對命令
  10. 26.    FPM10A_Receive_Data(12);                                                        //將串口接收到的數據轉存
  11. 27.    if(FPM10A_RECEICE_BUFFER[9] == 0)                                        //判斷數據低第9位是否接收到0 ,根據信息格式判斷的。
  12. 28.    {
  13. 29.          OLED_Clear();
  14. 30.         OLED_ShowString(0,2,"Docking  success");                 //符合成功條件則顯示對接成功
  15. 31.    }
  16. 32. }
復制代碼

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


  1. *****************************發送指令***********************[indent]33.    void FPM10A_Cmd_Check(void)
  2. 34.    {
  3. 35.      int i=0;
  4. 36.      FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  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] *****************************發送包頭*************************[/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]
復制代碼
運行至  FPM10A_Cmd_Send_Pack_Head(void)  發現是 47. Uart_Send_Byte(FPM10A_Pack_Head[ i]); 有問題,串口發送不了指令!下面貼出串口的初始化配置。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位數據,可變波特率
  8. 56.    //AUXR = 0xBF;                //定時器1時鐘為Fosc/12,即12T
  9. 57.    //AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  10. 58.    //TMOD &= 0x0F;                //清除定時器1模式位
  11. 59.       TMOD |= 0x20;                //設定定時器1為8位自動重裝方式
  12. 60.       TL1 = 0xFF;                //設定定時初值
  13. 61.       TH1 = 0xFF;                //設定定時器重裝值
  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 發送一個 byte
  19. 67.      {
  20. 69.             SBUF = c;
  21. 70.             while(!TI);                //發送完為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.     }
復制代碼

          再次說明,我使用的是STC8A的單片機,感覺是串口的配置有問,希望各位高手能幫我看一下到底是哪里的問題,感謝!!!!!!!!下面是一部分的指紋模塊通信協議定義
  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通信協議定義

  12. code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證,驗證模塊是否正確連接 ,對應19號指令。
  13. code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
  14. code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像,對應1號指令。
  15. code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數
  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:系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據
  24. /*------------------ FINGERPRINT命令字 --------------------------*/
  25. //發送包頭
  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. //發送指令
  35. void FPM10A_Cmd_Check(void)
  36. {
  37.         int i=0;
  38.         FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  39.         for(i=0;i<10;i++)
  40.          {               
  41.                 Uart_Send_Byte(FPM10A_Get_Device[i]);
  42.           }
  43. }
  44. //接收反饋數據緩沖
  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(); //發送通信協議包頭
  56.     for(i=0;i<6;i++) //發送命令 0x1d
  57.         {
  58.        Uart_Send_Byte(FPM10A_Get_Img[i]);
  59.         }
  60. }
  61. //講圖像轉換成特征碼存放在Buffer1中
  62. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  63. {
  64.          unsigned char i;
  65.         FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭      
  66.            for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  67.      {
  68.       Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
  69.              }
  70. }
  71. //將圖像轉換成特征碼存放在Buffer2中
  72. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  73. {
  74.      unsigned char i;
  75.      for(i=0;i<6;i++)    //發送包頭
  76.          {
  77.             Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  78.             }
  79.      for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 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(); //發送通信協議包頭
  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(); //發送通信協議包頭

  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; //存放校驗數據
  125.                    FPM10A_Save_Finger[8]= temp & 0x0000FF;                  
  126.        FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭        
  127.        for(i=0;i<9;i++)  
  128.                       Uart_Send_Byte(FPM10A_Save_Finger[i]);      //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  129. }
復制代碼


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

使用道具 舉報

沙發
ID:693038 發表于 2021-2-3 18:19 | 只看該作者
改動太多,要慢慢調試,接好模塊然后用邏輯分析儀抓一下串口信號,看看串口有沒有收發,看看新增加的屏如果有開內存給屏的話看看數組有沒有溢出,不懂是否能在線調試,能的話打一下斷點看看程序掛在什么位置,慢慢找一下咯,調代碼沒法一蹴而就
回復

使用道具 舉報

板凳
ID:584814 發表于 2021-2-4 09:31 | 只看該作者
這AT89C52和STC8A單片機同屬51但速度和功能差很多,所以要看看器件手冊
回復

使用道具 舉報

地板
ID:830954 發表于 2021-2-4 17:16 | 只看該作者
lincheng15 發表于 2021-2-3 18:19
改動太多,要慢慢調試,接好模塊然后用邏輯分析儀抓一下串口信號,看看串口有沒有收發,看看新增加的屏如果 ...

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

使用道具 舉報

5#
ID:830954 發表于 2021-2-4 17:17 | 只看該作者
man1234567 發表于 2021-2-4 09:31
這AT89C52和STC8A單片機同屬51但速度和功能差很多,所以要看看器件手冊

我也感覺
回復

使用道具 舉報

6#
ID:883031 發表于 2021-2-5 16:06 | 只看該作者
STC單片機比AT89C51速度快,看看是不是時序上有問題。
回復

使用道具 舉報

7#
ID:971944 發表于 2022-1-7 11:40 | 只看該作者
請問你解決了嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 请别相信他免费喜剧电影在线观看 | av天天看 | www.三级 | 久久久五月天 | xxxcom在线观看 | 亚洲天堂中文字幕 | 8x国产精品视频一区二区 | 国产精品1区 | 伊人伊成久久人综合网站 | 亚洲网站在线观看 | 日韩视频国产 | 中文字幕欧美日韩 | 日本黄色影片在线观看 | 欧美精品一区二区三区在线播放 | 精品在线视频播放 | 黄色网址av | 永久免费在线观看 | 蜜桃av一区二区三区 | 欧美精品在线观看 | www.99re| 国产日韩欧美精品一区二区三区 | 日韩综合在线 | 中文字幕av一区 | 97高清国语自产拍 | 自拍偷拍亚洲视频 | 在线免费观看黄色 | 国产精品精品久久久久久 | 欧美1—12sexvideos | 东方伊人免费在线观看 | 国产一区91精品张津瑜 | 一区二区免费视频 | 亚洲不卡 | 精品视频一区二区三区在线观看 | 在线看片国产精品 | 日韩成人免费中文字幕 | 天天操网| av网站免费看 | 亚洲精品一区二三区不卡 | 日韩视频中文字幕 | 精品一区二区三区四区五区 | 成人在线免费观看视频 |