各位高手,我正在做一個指紋解鎖的設(shè)計,MCU為STC8A8K64S4A12,指紋模塊為AS608,程序編譯無錯誤,但是指紋模塊怎么也與單片機握手不成功,無法通信!程序是借鑒別人的,借鑒的程序原先是在AT89C52運行的,我把它移植到STC8A上,只是把LCD1602改成了0.96寸7針OLED顯示屏,采用SPI通信,增加了電機控制等,但是移植后串口死活不能通信!用串口助手調(diào)試了串口能收發(fā),但是運行自己的程序時指紋模塊就是不能和單片機握手成功,我懷疑是串口配置有問題,請高手能幫我看一下嗎?以下貼出相關(guān)代碼,感謝! 主函數(shù)如下,開始運行
- 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,等待指紋模塊復(fù)位
- 15. Device_Check(); //校對指紋模塊是否接入正確,液晶做出相應(yīng)的提示
- 16. Delay_Ms(1000); //對接成功界面停留一定時間
復(fù)制代碼 程序運行到15. Device_Check();就運行不下去了,Device_Check()程序如下- 17. void Device_Check(void)
- 18. {
- 19. unsigned char i=0;
- 20. FPM10A_RECEICE_BUFFER[9]=1; //串口數(shù)組第九位可判斷是否通信正常
- 21. OLED_ShowString(0,2,"Loading...");
- 22. Delay_Ms(5000);
- 23. //設(shè)備加載中界面
- 24. OLED_ShowString(0,2,"Docking fail");//液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋
- 25. FPM10A_Cmd_Check(); //單片機向指紋模塊發(fā)送校對命令
- 26. FPM10A_Receive_Data(12); //將串口接收到的數(shù)據(jù)轉(zhuǎn)存
- 27. if(FPM10A_RECEICE_BUFFER[9] == 0) //判斷數(shù)據(jù)低第9位是否接收到0 ,根據(jù)信息格式判斷的。
- 28. {
- 29. OLED_Clear();
- 30. OLED_ShowString(0,2,"Docking success"); //符合成功條件則顯示對接成功
- 31. }
- 32. }
復(fù)制代碼
程序在 OLED顯示完 Docking fail后,走到 25. FPM10A_Cmd_Check();就停止走不下去了
- *****************************發(fā)送指令***********************[indent]33. void FPM10A_Cmd_Check(void)
- 34. {
- 35. int i=0;
- 36. FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
- 37. for(i=0;i<10;i++)
- 38. {
- 39. Uart_Send_Byte(FPM10A_Get_Device[i]);
- 40. }
- 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])在如下程序中
- 50. #include "uart.h"
- 51. #include <stc8.h>
- 52. void Uart_Init(void)
- 53. {
-
- 54. PCON |= 0x80; //使能波特率倍速位SMOD
- 55. SCON = 0x50; //8位數(shù)據(jù),可變波特率
- 56. //AUXR = 0xBF; //定時器1時鐘為Fosc/12,即12T
- 57. //AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
- 58. //TMOD &= 0x0F; //清除定時器1模式位
- 59. TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- 60. TL1 = 0xFF; //設(shè)定定時初值
- 61. TH1 = 0xFF; //設(shè)定定時器重裝值
- 62. ET1 = 0; //禁止定時器1中斷
- 63. TR1 = 1; //啟動定時器1
- 64. EA=1;
- 65.}
- 66. void Uart_Send_Byte(unsigned char c) //UART 發(fā)送一個 byte
- 67. {
- 69. SBUF = c;
- 70. while(!TI); //發(fā)送完為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. }
復(fù)制代碼
再次說明,我使用的是STC8A的單片機,感覺是串口的配置有問,希望各位高手能幫我看一下到底是哪里的問題,感謝!!!!!!!!下面是一部分的指紋模塊通信協(xié)議定義
- #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通信協(xié)議定義
- code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證,驗證模塊是否正確連接 ,對應(yīng)19號指令。
- code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //協(xié)議包頭
- code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //獲得指紋圖像,對應(yīng)1號指令。
- code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數(shù)
- 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:系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)
- /*------------------ FINGERPRINT命令字 --------------------------*/
- //發(fā)送包頭
- void FPM10A_Cmd_Send_Pack_Head(void)
- {
- int i;
- for(i=0;i<6;i++) //包頭
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- }
- //發(fā)送指令
- void FPM10A_Cmd_Check(void)
- {
- int i=0;
- FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
- for(i=0;i<10;i++)
- {
- Uart_Send_Byte(FPM10A_Get_Device[i]);
- }
- }
- //接收反饋數(shù)據(jù)緩沖
- 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(); //發(fā)送通信協(xié)議包頭
- for(i=0;i<6;i++) //發(fā)送命令 0x1d
- {
- Uart_Send_Byte(FPM10A_Get_Img[i]);
- }
- }
- //講圖像轉(zhuǎn)換成特征碼存放在Buffer1中
- void FINGERPRINT_Cmd_Img_To_Buffer1(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
- for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
- }
- }
- //將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
- void FINGERPRINT_Cmd_Img_To_Buffer2(void)
- {
- unsigned char i;
- for(i=0;i<6;i++) //發(fā)送包頭
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 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(); //發(fā)送通信協(xié)議包頭
- 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(); //發(fā)送通信協(xié)議包頭
- 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; //存放校驗數(shù)據(jù)
- FPM10A_Save_Finger[8]= temp & 0x0000FF;
- FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
- for(i=0;i<9;i++)
- Uart_Send_Byte(FPM10A_Save_Finger[i]); //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
- }
復(fù)制代碼
|