关于STC8A单片机无法与AS608指纹模块通信的提问, 各位高手,我正在做一个指纹解锁的设计,MCU为STC8A8K64S4A12,指纹模块为AS608,程序编译无错误,但是指纹模块怎么也与单片机握手不成功,无法通信!程序是借鉴别人的,借鉴的程序原先是在AT89C52运行的,我把它移植到STC8A上,只是把LCD1602改成了0.96寸7针OLED显示屏,采用SPI通信,增加了电机控制等,但是移植后串口死活不能通信!用串口助手调试了串口能收发,但是运行自己的程序时指纹模块就是不能和单片机握手成功,我怀疑是串口配置有问题,请高手能帮我看一下吗?以下贴出相关代码,感谢! 主函数如下,开始运行
- 1. #include <stc8.h>
- 2. #include <intrins.h>
- 3. #include “key.h”
- 4. #include “uart.h”
- 5. #include “delay.h”
- 6. #include “FPM10A.h”
- 7. #include “oled.h”
- 8. void main(void)
- 9. {
- 10. OLED_Init();
- 11. OLED_Clear(); //初始化液晶
- 12. Uart_Init(); //初始化串口
- 13. Key_Init(); //初始化按键
- 14. Delay_Ms(200); //延时500MS,等待指纹模块复位
- 15. Device_Check(); //校对指纹模块是否接入正确,液晶做出相应的提示
- 16. Delay_Ms(1000); //对接成功界面停留一定时间
复制代码
程序运行到15. Device_Check();就运行不下去了,Device_Check()程序如下
- 17. void Device_Check(void)
- 18. {
- 19. unsigned char i=0;
- 20. FPM10A_RECEICE_BUFFER[9]=1; //串口数组第九位可判断是否通信正常
- 21. OLED_ShowString(0,2,”Loading…”);
- 22. Delay_Ms(5000);
- 23. //设备加载中界面
- 24. OLED_ShowString(0,2,”Docking fail”);//液晶先显示对接失败,如果指纹模块插对的话会将其覆盖
- 25. FPM10A_Cmd_Check(); //单片机向指纹模块发送校对命令
- 26. FPM10A_Receive_Data(12); //将串口接收到的数据转存
- 27. if(FPM10A_RECEICE_BUFFER[9] == 0) //判断数据低第9位是否接收到0 ,根据信息格式判断的。
- 28. {
- 29. OLED_Clear();
- 30. OLED_ShowString(0,2,”Docking success”); //符合成功条件则显示对接成功
- 31. }
- 32. }
复制代码
程序在 OLED显示完 Docking fail后,走到 25. FPM10A_Cmd_Check();就停止走不下去了
- *****************************发送指令***********************[indent]33. void FPM10A_Cmd_Check(void)
- 34. {
- 35. int i=0;
- 36. FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- 37. for(i=0;i<10;i++)
- 38. {
- 39. Uart_Send_Byte(FPM10A_Get_Device[i]);
- 40. }
- 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])在如下程序中
- 50. #include “uart.h”
- 51. #include <stc8.h>
- 52. void Uart_Init(void)
- 53. {
- 54. PCON |= 0x80; //使能波特率倍速位SMOD
- 55. SCON = 0x50; //8位数据,可变波特率
- 56. //AUXR = 0xBF; //定时器1时钟为Fosc/12,即12T
- 57. //AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- 58. //TMOD &= 0x0F; //清除定时器1模式位
- 59. TMOD |= 0x20; //设定定时器1为8位自动重装方式
- 60. TL1 = 0xFF; //设定定时初值
- 61. TH1 = 0xFF; //设定定时器重装值
- 62. ET1 = 0; //禁止定时器1中断
- 63. TR1 = 1; //启动定时器1
- 64. EA=1;
- 65.}
- 66. void Uart_Send_Byte(unsigned char c) //UART 发送一个 byte
- 67. {
- 69. SBUF = c;
- 70. while(!TI); //发送完为1
- 71. TI = 0;
- 72. }
- 73. unsigned char Uart_Receive_Byte()//UART Receive a byteg
- 74. {
- 75. unsigned char dat;
- 76. while(!RI); //接收完为1
- 77. RI = 0;
- 78. dat = SBUF;
- 79. return (dat);
- 80. }
复制代码
再次说明,我使用的是STC8A的单片机,感觉是串口的配置有问,希望各位高手能帮我看一下到底是哪里的问题,感谢!!!!!!!!下面是一部分的指纹模块通信协议定义
- #include “FPM10A.h”
- #include “key.h”
- #include “uart.h”
- #include “oled.h”
- #include “delay.h”
- #include <stdio.h>
- #include <string.h>
- //sbit SRD = P2^6;继电器
- volatile unsigned char FPM10A_RECEICE_BUFFER[32];
- unsigned int finger_id = 0;
- //FINGERPRINT通信协议定义
- code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令验证,验证模块是否正确连接 ,对应19号指令。
- code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头
- code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //获得指纹图像,对应1号指令。
- code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数
- code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //4号指令,搜索指纹搜索范围0 – 999,使用BUFFER1中的特征码搜索
- code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9号指纹
- code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //将图像放入到BUFFER1,2号功能
- code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //将图像放入到BUFFER2 ,2号功能
- code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //将BUFFER1跟BUFFER2合成特征模版,5号功能
- code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//删除指纹模块里所有的模版,13号功能
- volatile unsigned char FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置,6号功能
- //volatile:系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据
- /*—————— FINGERPRINT命令字 ————————–*/
- //发送包头
- void FPM10A_Cmd_Send_Pack_Head(void)
- {
- int i;
- for(i=0;i<6;i++) //包头
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- }
- //发送指令
- void FPM10A_Cmd_Check(void)
- {
- int i=0;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<10;i++)
- {
- Uart_Send_Byte(FPM10A_Get_Device[i]);
- }
- }
- //接收反馈数据缓冲
- void FPM10A_Receive_Data(unsigned char ucLength)
- {
- unsigned char i;
- for (i=0;i<ucLength;i++)
- FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();
- }
- //FINGERPRINT_获得指纹图像命令
- void FPM10A_Cmd_Get_Img(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<6;i++) //发送命令 0x1d
- {
- Uart_Send_Byte(FPM10A_Get_Img[i]);
- }
- }
- //讲图像转换成特征码存放在Buffer1中
- void FINGERPRINT_Cmd_Img_To_Buffer1(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<7;i++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
- }
- }
- //将图像转换成特征码存放在Buffer2中
- void FINGERPRINT_Cmd_Img_To_Buffer2(void)
- {
- unsigned char i;
- for(i=0;i<6;i++) //发送包头
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- for(i=0;i<7;i++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
- }
- }
- //搜索全部用户999枚
- void FPM10A_Cmd_Search_Finger(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<11;i++)
- {
- Uart_Send_Byte(FPM10A_Search[i]);
- }
- }
- void FPM10A_Cmd_Reg_Model(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<6;i++)
- {
- Uart_Send_Byte(FPM10A_Reg_Model[i]);
- }
- }
- //删除指纹模块里的所有指纹模版
- void FINGERPRINT_Cmd_Delete_All_Model(void)
- {
- unsigned char i;
- for(i=0;i<6;i++) //包头
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- for(i=0;i<6;i++) //命令合并指纹模版
- {
- Uart_Send_Byte(FPM10A_Delete_All_Model[i]);
- }
- }
- //保存指纹
- void FPM10A_Cmd_Save_Finger( unsigned int storeID )
- {
- unsigned long temp = 0;
- unsigned char i;
- FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
- FPM10A_Save_Finger[6] = (storeID&0x00FF);
- for(i=0;i<7;i++) //计算校验和
- temp = temp + FPM10A_Save_Finger[i];
- FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据
- FPM10A_Save_Finger[8]= temp & 0x0000FF;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<9;i++)
- Uart_Send_Byte(FPM10A_Save_Finger[i]); //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
- }
复制代码