关于STC8A单片机无法与AS608指纹模块通信的提问

关于STC8A单片机无法与AS608指纹模块通信的提问,    各位高手,我正在做一个指纹解锁的设计,MCU为STC8A8K64S4A12,指纹模块为AS608…

关于STC8A单片机无法与AS608指纹模块通信的提问,    各位高手,我正在做一个指纹解锁的设计,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. }

复制代码

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115