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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

做指紋識別系統時,指紋模塊程序與其它程序不能同時運行是咋回事?

[復制鏈接]
跳轉到指定樓層
樓主
ID:326898 發表于 2018-5-10 15:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. //#include<SHIJIAN.H>
  5. typedef unsigned char u8;                 // 重命名類型u8簡化代碼編寫
  6. typedef unsigned int u16;
  7. #define LCD1602_DATA_PORT P0
  8. #define KEY_PORT P1                // 矩陣按鍵接在P1端口
  9. //#define DDD                                P2
  10. sbit DSIO = P3^4;                 // DS1302的SPI接口IO線,輸入輸出都走這里
  11. sbit CE   = P3^5;                // chip enable,讀寫ds1302前要使能,讀寫完要禁止
  12. sbit SCLK = P3^6;                   // serial clock,串行時鐘線
  13. sbit gLcd1602_E=P2^7;
  14. sbit gLcd1602_RS=P2^6;
  15. sbit gLcd1602_RW=P2^5;
  16. sbit buzz=P1^5;
  17. sbit KEY_DOWN=P3^2;
  18. sbit KEY_OK=P3^3;
  19. sbit KEY_CANCEL=P3^1;
  20. sbit KEY_QIE=P3^0;
  21. sbit KEY_JIA=P1^1;
  22. sbit KEY_TIAO=P1^0;
  23. char local_date=0,base_date=0;
  24. u8 hour=0,minute=0,second=0,count=0;
  25. u8 slnum=0,cishu=0;
  26. code u8 SHIJIAN[60]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
  27. 0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,
  28. 0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
  29. code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證
  30. code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
  31. code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像
  32. code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數
  33. code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
  34. code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號指紋
  35. code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1
  36. code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2
  37. code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版
  38. code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版
  39. volatile unsigned char  FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置
  40. code u8 DS1302_READ_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  41. code u8 DS1302_WRITE_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  42. xdata u8 gTime[7];                                       // 用來存儲DS1302中7個時間的BCD碼值
  43. xdata u8 gDispBuf0[17];                                        // LCD1602上面一排的顯示buf
  44. xdata u8 gDispBuf1[17];        
  45. volatile unsigned char FPM10A_RECEICE_BUFFER[32];
  46. void Buzz_Times(unsigned char times);
  47. void zhishideng(u8 val);
  48. u8 KeyScan(void);
  49. void Uart_Init(void);
  50. void Uart_Send_Byte(unsigned char c);
  51. unsigned char Uart_Receive_Byte();
  52. void FPM10A_Cmd_Send_Pack_Head(void);
  53. void FPM10A_Cmd_Check(void);
  54. void FPM10A_Receive_Data(unsigned char ucLength);
  55. void FPM10A_Cmd_Get_Img(void);
  56. void FINGERPRINT_Cmd_Img_To_Buffer1(void);
  57. void FINGERPRINT_Cmd_Img_To_Buffer2(void);
  58. void FPM10A_Cmd_Search_Finger(void);
  59. void FPM10A_Cmd_Reg_Model(void);
  60. void FINGERPRINT_Cmd_Delete_All_Model(void);
  61. void FPM10A_Cmd_Save_Finger( unsigned int storeID );
  62. void FPM10A_Add_Fingerprint();
  63. void FPM10A_Find_Fingerprint();
  64. void FPM10A_Delete_All_Fingerprint();
  65. void Device_Check(void);
  66. static void fun1();
  67. static void fun2();        

  68. void delay(u16 z)
  69. {
  70.         u16 x,y,a;
  71.         for(x=z;x>0;x--)
  72.                 for(y=142;y>0;y--);
  73.                         for(a=2;a>0;a--);

  74.                
  75. }
  76. //static void delay5ms(void);
  77. static void Lcd1602WaitNoBusy(void)  //忙檢測函數,判斷bit7是0,允許執行;1禁止
  78. {
  79.     u8 sta = 0;      //

  80.     LCD1602_DATA_PORT = 0xff;
  81.     gLcd1602_RS = 0;
  82.     gLcd1602_RW = 1;
  83.     do
  84.     {
  85.         gLcd1602_E = 1;
  86.         sta = LCD1602_DATA_PORT;
  87.         gLcd1602_E = 0;    //使能,用完就拉低,釋放總線
  88.     }while(sta & 0x80);
  89. }
  90. static void Lcd1602WriteCmd(u8 cmd)         
  91. {
  92.         Lcd1602WaitNoBusy();                // 先等待LCD1602處于不忙狀態

  93.         gLcd1602_E = 0;                     // 禁止LCD
  94.         gLcd1602_RS = 0;                           // 選擇發送命令模式
  95.         gLcd1602_RW = 0;                           // 選擇寫入模式        
  96.         LCD1602_DATA_PORT = cmd;    // 將1字節命令字放入8位并行數據端口
  97.         gLcd1602_E = 1;                          // 使能LED
  98.         gLcd1602_E = 0;                                // 禁止LCD
  99. }
  100. static void Lcd1602WriteData(u8 dat)                        
  101. {
  102.         Lcd1602WaitNoBusy();                // 先等待LCD1602處于不忙狀態

  103.         gLcd1602_E = 0;                     // 禁止LCD
  104.         gLcd1602_RS = 1;                           // 選擇發送數據模式
  105.         gLcd1602_RW = 0;                           // 選擇寫入模式        
  106.         LCD1602_DATA_PORT = dat;    // 將1字節命令字放入8位并行數據端口
  107.         gLcd1602_E = 1;                          // 使能LED
  108.         gLcd1602_E = 0;                                // 禁止LCD
  109. }
  110. void Lcd1602Init(void)                                                
  111. {
  112.          Lcd1602WriteCmd(0x38);          // 按照數據手冊的初始化時序,先發送38H
  113.         delay(5);                                        // 延時5ms
  114.         Lcd1602WriteCmd(0x38);          // 按照數據手冊的初始化時序,先發送38H
  115.         delay(5);                                        // 延時5ms
  116.         Lcd1602WriteCmd(0x38);          // 按照數據手冊的初始化時序,先發送38H
  117.         delay(5);                                        // 延時5ms
  118.         Lcd1602WriteCmd(0x38);                // 顯示模式設置
  119.         Lcd1602WriteCmd(0x08);                // 關閉顯示
  120.         Lcd1602WriteCmd(0x01);                // 清屏(同時清數據指針)
  121.         Lcd1602WriteCmd(0x06);                // 讀寫后指針自動加1,寫1個字符后整屏顯示不移動
  122.         Lcd1602WriteCmd(0x0c);                // 開顯示,不顯示光標
  123. }
  124. void Lcd1602SetCursor(u8 x, u8 y)          // 坐標顯示
  125. {
  126.     u8 addr = 0;

  127.            switch (y)
  128.         {
  129.                 case 0:                                                 // 上面一行
  130.                         addr = 0x00 + x;                break;        
  131.                 case 1:                                                // 下面一行
  132.                         addr = 0x40 + x;                 break;
  133.                 default:
  134.                                                                         break;
  135.         }
  136.     Lcd1602WriteCmd(addr | 0x80);
  137. }
  138. void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr)     //顯示字符串
  139. {
  140.     Lcd1602SetCursor(x, y);      //當前字符的坐標
  141.     while (*pStr != '\0')
  142.     {
  143.         Lcd1602WriteData(*pStr++);
  144.     }
  145. }
  146. void Lcd1602DispBufInit(void)
  147. {
  148.         strcpy(gDispBuf0,"00:00:00        ");
  149.         //gDispBuf0[14] = 0xdf;                // 顯示攝氏度的小圓圈
  150.         //gDispBuf0[15] = 'C';                        // 顯示攝氏度的大寫C
  151.         //gDispBuf0[16] = '\0';                // 字符串結尾

  152.         //strcpy(gDispBuf1, "00 00 00EEOK-00H");               
  153. }


  154. void Lcd1602UpdateDisplay(void)
  155. {
  156.         Lcd1602ShowStr(0, 0,"menjingxitong  ");        
  157.         Lcd1602ShowStr(0, 1, gDispBuf0);
  158. }
  159. /*void write_hms(u8 add,u8 dat)          //時分秒寫函數,add:輸入位置設置變量   dat:輸入時分秒數據
  160. {
  161.         u8 sw,gw;                                         //定義十位個位變量
  162.         sw=dat/10;
  163.         gw=dat%10;
  164.         Lcd1602WriteCmd(0x80+0x40+add);//從第二行(add)位開始寫數據
  165.         Lcd1602WriteData(0x30+sw);         //寫入十位
  166.         Lcd1602WriteData(0x30+gw);         //寫入個位
  167. }  */
  168. static void Ds1302WriteReg(u8 addr, u8 dat)
  169. {
  170.         u8 i = 0;

  171.         CE = 0;
  172.         _nop_();                                // 空指令,延時

  173.         SCLK = 0;                                // 先將SCLK置低電平
  174.         _nop_();

  175.         CE = 1;                                 // CE拉高以使能對DS1302的讀寫權限
  176.         _nop_();

  177.         for (i=0; i<8; i++)                // 循環逐位發送addr的8個bit,注意低位在前
  178.         {
  179.                 DSIO = addr & 0x01;        // 數據從LSB低位開始傳送
  180.                 addr >>= 1;                        // 發完后addr右移一位原來的次低位變成新的低位
  181.                 SCLK = 1;                        // 拉高SCLK制造一個上升沿,通知DS1302讀取數據
  182.                 _nop_();                        // 延時等待DS1302讀取DSIO線上的1位數據

  183.                 SCLK = 0;                        // 讀完后,拉低SCLK為下一個位的傳輸做準備
  184.                 _nop_();
  185.         }
  186.                                                         // 循環結束后1字節的寄存器地址傳給DS1302
  187.         for (i=0; i<8; i++)                // 循環寫入8位數據,注意低位在前
  188.         {
  189.                 DSIO = dat & 0x01;
  190.                 dat >>= 1;
  191.                 SCLK = 1;                        //制造上升沿通知DS1302讀取數據
  192.                 _nop_();
  193.                 SCLK = 0;
  194.                 _nop_();        
  195.         }                                                   // 循環結束后1字節值成功傳給DS1302
  196.                  
  197.         CE = 0;                                        // 寫入完畢拉低CE以禁止對DS1302的讀寫,防止意外改寫事故
  198.         _nop_();
  199. }


  200. /*********************************************************************
  201. * 函 數 名       : Ds1302ReadReg
  202. * 函數功能                 : 向DS1302中地址為addr的寄存器寫入數值dat
  203. * 參數列表       : addr - 待讀出的寄存器的地址
  204. * 函數輸出             : 讀出的寄存器addr的數值
  205. *********************************************************************/
  206. static u8 Ds1302ReadReg(u8 addr)
  207. {
  208.         u8 i = 0, dat = 0, dat1 = 0;

  209.         CE = 0;                                                          // CE設置為初始狀態
  210.         _nop_();

  211.         SCLK = 0;                                                // SCLK設置為初始狀態
  212.         _nop_();

  213.         CE = 1;                                                        // 拉高CE使能對DS1302的寄存器讀寫權限
  214.         _nop_();

  215.         for (i=0; i<8; i++)                                // 循環發送8bit寄存器地址值
  216.         {
  217.                 DSIO = addr & 0x01;                        // DS1302的SPI接口從LSB開始發送
  218.                 addr >>= 1;

  219.                 SCLK = 1;                                        // 制造上升沿,DS1302在上升沿完成讀取動作
  220.                 _nop_();

  221.                 SCLK = 0;                                        // 拉低SCLK為下個bit發送做準備
  222.                 _nop_();
  223.         }
  224.         
  225.         for (i=0; i<8; i++)                                // 循環讀取8bit寄存器值數據
  226.         {
  227.                 dat1 = DSIO;//從最低位開始接收
  228.                 dat = (dat>>1) | (dat1<<7);
  229.                 SCLK = 1;
  230.                 _nop_();
  231.                 SCLK = 0;//DS1302下降沿時,放置數據
  232.                 _nop_();
  233.         }

  234.         CE = 0;
  235.         _nop_();        //以下為DS1302復位的穩定時間,必須的。

  236.         SCLK = 1;
  237.         _nop_();

  238.         DSIO = 0;
  239.         _nop_();

  240.         DSIO = 1;
  241.         _nop_();

  242.         return dat;        
  243. }


  244. /*********************************************************************
  245. * 函 數 名       : Ds1302WriteTime
  246. * 函數功能                 : 將全局變量gTime中的時間寫入DS1302中以重置DS1302時間
  247. * 參數列表       : 無
  248. * 函數輸出             : 無
  249. *********************************************************************/
  250. static void Ds1302WriteTime(void)
  251. {
  252.         u8 i = 0;

  253.         Ds1302WriteReg(0x8E, 0x00);                 // 禁用WP以獲取寫時間寄存器的權限
  254.         for (i=0; i<7; i++)                         // 依次寫入7個時間,順序依次:秒分時日月周年
  255.         {
  256.                 Ds1302WriteReg(DS1302_WRITE_ADDR[i], gTime[i]);        
  257.         }
  258.         Ds1302WriteReg(0x8E, 0x80);                 // 使能WP以禁止對時間寄存器的讀寫,防止意外改寫事故
  259. }


  260. /*********************************************************************
  261. * 函 數 名       : Ds1302InitTime
  262. * 函數功能                 : 以給定的初始時間來重置DS1302時間值
  263. * 參數列表       : 無
  264. * 函數輸出             : 無
  265. *********************************************************************/
  266. void Ds1302InitTime(void)
  267. {
  268.         // 先給個初始化時間
  269.         gTime[0] = 0x50;        // 初始化時間,秒,注意是BCD碼不是10進制也不是16進制
  270.         gTime[1] = 0x59;        // 初始化時間,分,注意是BCD碼不是10進制也不是16進制
  271.         gTime[2] = 0x23;        // 初始化時間,時,注意是BCD碼不是10進制也不是16進制
  272.         
  273.         
  274.         //gTime[3] = 0x23;        // 初始化時間,日,注意是BCD碼不是10進制也不是16進制
  275.         //gTime[4] = 0x10;        // 初始化時間,月,注意是BCD碼不是10進制也不是16進制
  276.         //gTime[5] = 0x01;        // 初始化時間,周,注意是BCD碼不是10進制也不是16進制
  277.         //gTime[6] = 0x17;        // 初始化時間,年,注意是BCD碼不是10進制也不是16進制,以2000為基數
  278.         // 將給定時間寫入DS1302內部時間寄存器以完成初始化
  279.         Ds1302WriteTime();
  280. }


  281. /*********************************************************************
  282. * 函 數 名       : Ds1302ReadTime
  283. * 函數功能                 : 讀出DS1302內部時間放入全局變量gTime中
  284. * 參數列表       : 無
  285. * 函數輸出             : 無
  286. *********************************************************************/
  287. void Ds1302ReadTime(void)
  288. {
  289.         u8 i = 0;

  290.         for (i=0; i<7; i++)//讀取7個字節的時鐘信號:秒分時日月周年
  291.         {
  292.                 gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
  293. //                gTime[i] = 0x23;
  294.         }
  295. }


  296. /*********************************************************************
  297. * 函 數 名       : Ds1302ReadTime
  298. * 函數功能                 : 讀出DS1302內部時間放入全局變量gTime中
  299. * 參數列表       : 無
  300. * 函數輸出             : 無
  301. *********************************************************************/
  302. void Ds1302WorkTest(void)
  303. {
  304.         // 第1步:從DS1302讀取時間存入gTime中
  305.         Ds1302ReadTime();                  

  306.         // 第2步:將gTime中的時間值格式化為字符串存入gTimeStr中
  307.         gDispBuf0[0] = ((gTime[2] >> 4) & 0x0f) + '0';                // Hour的高4位
  308.         gDispBuf0[1] = ((gTime[2] >> 0) & 0x0f) + '0';                // Hour的低4位
  309. //        gDispBuf0[2] = ':';                                                                        // 分隔符
  310.         
  311.         gDispBuf0[3] = ((gTime[1] >> 4) & 0x0f) + '0';                // Minute的高4位
  312.         gDispBuf0[4] = ((gTime[1] >> 0) & 0x0f) + '0';                // Minute的低4位
  313. //        gDispBuf0[5] = ':';                                                                        // 分隔符

  314.         gDispBuf0[6] = ((gTime[0] >> 4) & 0x0f) + '0';                // Second的高4位
  315.         gDispBuf0[7] = ((gTime[0] >> 0) & 0x0f) + '0';                // Second的低4位
  316. //        gDispBuf0[8] = '-';        
  317.         
  318. }

  319. void main(void)
  320. {        
  321.         Lcd1602Init();
  322.         // 上面1行給17個字符,超出的最后一個'g'沒有被顯示
  323.         Lcd1602ShowStr(0, 0, "men jin xi tong ");
  324.         // 下面1行給16個字符,剛好完美顯示               
  325.         Lcd1602ShowStr(0, 1, "welcome         ");
  326.         // 最后別忘了打結,不然程序會反復執行,反復刷屏,看到的現象是
  327.         // 屏幕顯示抖動。
  328.         //Lcd1602WriteCmd(0x01);
  329.         Uart_Init();
  330.         delay(200);
  331.         Ds1302InitTime();
  332.         Lcd1602DispBufInit();
  333.         gLcd1602_RW=0;
  334.         Device_Check();                           //校對指紋模塊是否接入正確,液晶做出相應的提示
  335.         delay(2000);        

  336.         while(1)
  337.         {
  338.                 if(KEY_QIE==0)
  339.                           {
  340.                           while(KEY_QIE==0);
  341.                           //shijian=1;
  342.                           //cishu+=1;
  343.                           if(cishu<2)
  344.                           {
  345.                                   cishu+=1;
  346.                                   if(cishu==2)
  347.                                     cishu=0;
  348.                           }
  349.                           
  350.                          }
  351.                         switch(cishu)
  352.                         {
  353.                                 case 0:  //指紋                                                
  354.                                 fun1();                                                                                                                                                                                                
  355.                                 break;        
  356.                                                 
  357.                                 case 1:         //        時間
  358.                                 fun2();
  359.                                 break;                                         
  360.                         }
  361.    }
  362. }        
  363. static void fun1()
  364. {                    
  365.                         //FPM10A_Cmd_Send_Pack_Head();
  366.                         //FPM10A_Cmd_Check();
  367.                         //FPM10A_Receive_Data(12);
  368.                 //delay(2000);
  369.                         Device_Check();
  370.                         do
  371.                         {
  372.                         Lcd1602WriteCmd(0x01);
  373.                         Lcd1602ShowStr(0, 0, "  search finger ");
  374.                         Lcd1602ShowStr(0, 1, "  Add     delete");
  375.                         if(local_date==0)
  376.                         {
  377.                         
  378.                                 Lcd1602ShowStr(1, 0, "*");
  379.                             Lcd1602ShowStr(1, 1, " ");
  380.                                 Lcd1602ShowStr(9, 1, " ");        
  381.                         }
  382.                         else if(local_date==1)
  383.                         {
  384.                         
  385.                                 Lcd1602ShowStr(1, 0, " ");
  386.                             Lcd1602ShowStr(1, 1, "*");
  387.                                 Lcd1602ShowStr(9, 1, " ");               
  388.                         }
  389.                         else if(local_date==2)
  390.                         {
  391.                                 
  392.                                 Lcd1602ShowStr(1, 0, " ");
  393.                             Lcd1602ShowStr(1, 1, " ");
  394.                                 Lcd1602ShowStr(9, 1, "*");               
  395.                         }                        
  396.                         //確認鍵        
  397.                         if(KEY_OK==0)
  398.                         {         
  399.                                 while(KEY_OK==0);//等待松開按鍵                                                        
  400.                                 switch(local_date)
  401.                                 {
  402.                                                 case 0:                //搜索指紋                                                
  403.                                                 FPM10A_Find_Fingerprint();                                                                                                                                                                                                
  404.                                                 break;        
  405.                                                 
  406.                                                 case 1:                      //添加指紋
  407.                                                 FPM10A_Add_Fingerprint();
  408.                                                 break;                                         
  409.                                                 
  410.                                                 case 2:                      //清空指紋
  411.                                                 FPM10A_Delete_All_Fingerprint();
  412.                                                   break;
  413.                                         }
  414.                         }
  415.                             //切換鍵
  416.                                 if(KEY_DOWN == 0)
  417.                                 {
  418.                                         while(KEY_DOWN == 0); //等待松開按?                        
  419.                                            if(local_date<=2)
  420.                                         {
  421.                                                 local_date++;
  422.                                                 if(local_date==3)
  423.                                                         local_date=0;                                                
  424.                                         }               
  425.                                 }                                                
  426.                                 delay(100); //延時判斷100MS檢測一次
  427.         }while(KEY_QIE!=0);                 
  428. }                                 
  429.         

  430. static void fun2()
  431. {
  432.         u8 i = 0;
  433.         Lcd1602WriteCmd(0x01);
  434.           Ds1302WorkTest();
  435.         Lcd1602UpdateDisplay();
  436.         if(KEY_TIAO==0)
  437.         {
  438.                 while(KEY_TIAO==0);
  439.                 Ds1302WriteReg(0x8E, 0x00);                 // 禁用WP以獲取寫時間寄存器的權限
  440.                 slnum++;
  441.                 switch(slnum)
  442.                 {
  443.                         case 1:Lcd1602WriteCmd(0x80+0x40+7);        
  444.                                 break;
  445.                         case 2:Lcd1602WriteCmd(0x80+0x40+4);
  446.                                 break;
  447.                         case 3:Lcd1602WriteCmd(0x80+0x40+1);
  448.                                 break;
  449.                 }
  450.                 Lcd1602WriteCmd(0x0f);
  451.                 if(slnum==4)
  452.                 {
  453.                         slnum=0;
  454.                         Lcd1602WriteCmd(0x0c);
  455.                 }
  456.                 //Ds1302WriteReg(0x8E, 0x80);                 // 禁用WP以獲取寫時間寄存器的權限
  457.                 }
  458.     if(KEY_JIA==0)
  459.         {
  460.                 while(KEY_JIA==0);
  461.                 switch(slnum)
  462.                 {
  463.                         case 1: second++;
  464.                                         if(second==60) second=0;
  465.                                         Ds1302WriteReg(DS1302_WRITE_ADDR[0], SHIJIAN[second]);
  466.                                     break;
  467.                         case 2:        minute++;
  468.                                         if(minute==60) minute=0;
  469.                                         Ds1302WriteReg(DS1302_WRITE_ADDR[1], SHIJIAN[minute]);
  470.                                         break;
  471.                         case 3: hour++;
  472.                                            if(hour==24) hour=0;
  473.                                         Ds1302WriteReg(DS1302_WRITE_ADDR[2], SHIJIAN[hour]);        
  474.                                         break;
  475.                                        
  476.                 }
  477.         } delay(100);
  478. }


  479. void Uart_Init(void)
  480. {
  481.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允許接收
  482.     PCON=0x00;   //SMOD=0:波特率不加倍
  483.     TMOD=0x20;   //T1方式2,用于UART波特率
  484.     TH1=0xFD;
  485.     TL1=0xFD;   //UART波特率設置:FDFD,9600;FFFF,57600
  486.     TR1=1;         //允許T1計數
  487.     EA=1;
  488. }


  489. void Uart_Send_Byte(unsigned char c)//UART Send a byte
  490. {
  491.         SBUF = c;
  492.         while(!TI);                //發送完為1
  493.         TI = 0;
  494. }

  495. unsigned char Uart_Receive_Byte()//UART Receive a byteg
  496. {        
  497.         unsigned char dat;
  498.         while(!RI);         //接收完為1
  499.         RI = 0;
  500.         dat = SBUF;
  501.         return (dat);
  502. }


  503. void FPM10A_Cmd_Send_Pack_Head(void)
  504. {
  505.         int i;        
  506.         for(i=0;i<6;i++) //包頭
  507.    {
  508.      Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  509.     }               
  510. }
  511. //發送指令
  512. void FPM10A_Cmd_Check(void)
  513. {
  514.         int i=0;
  515.         FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  516.         for(i=0;i<10;i++)
  517.          {               
  518.                 Uart_Send_Byte(FPM10A_Get_Device[i]);
  519.           }
  520. }
  521. //接收反饋數據緩沖
  522. void FPM10A_Receive_Data(unsigned char ucLength)
  523. {
  524.   unsigned char i;

  525.   for (i=0;i<ucLength;i++)
  526.      FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();

  527. }

  528. //FINGERPRINT_獲得指紋圖像命令
  529. void FPM10A_Cmd_Get_Img(void)
  530. {
  531.     unsigned char i;
  532.     FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  533.     for(i=0;i<6;i++) //發送命令 0x1d
  534.         {
  535.        Uart_Send_Byte(FPM10A_Get_Img[i]);
  536.         }
  537. }
  538. //講圖像轉換成特征碼存放在Buffer1中
  539. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  540. {
  541.          unsigned char i;
  542.         FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭      
  543.            for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  544.      {
  545.       Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
  546.              }
  547. }
  548. //將圖像轉換成特征碼存放在Buffer2中
  549. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  550. {
  551.      unsigned char i;
  552.      for(i=0;i<6;i++)    //發送包頭
  553.          {
  554.             Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  555.             }
  556.      for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer2
  557.       {
  558.               Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
  559.              }
  560. }
  561. //搜索全部用戶999枚
  562. void FPM10A_Cmd_Search_Finger(void)
  563. {
  564.        unsigned char i;                       
  565.                          FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  566.        for(i=0;i<11;i++)
  567.            {
  568.                   Uart_Send_Byte(FPM10A_Search[i]);   
  569.                       }
  570. }
  571. //將BUFFER1跟BUFFER2合成特征模版
  572. void FPM10A_Cmd_Reg_Model(void)
  573. {
  574.        unsigned char i;           
  575.             
  576.                          FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭

  577.        for(i=0;i<6;i++)
  578.            {
  579.                   Uart_Send_Byte(FPM10A_Reg_Model[i]);   
  580.                       }
  581. }
  582. //刪除指紋模塊里的所有指紋模版
  583. void FINGERPRINT_Cmd_Delete_All_Model(void)
  584. {
  585.     unsigned char i;   
  586.     for(i=0;i<6;i++) //包頭
  587.     Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  588.     for(i=0;i<6;i++) //命令合并指紋模版
  589.            {
  590.       Uart_Send_Byte(FPM10A_Delete_All_Model[i]);   
  591.            }        
  592. }
  593. //保存指紋
  594. void FPM10A_Cmd_Save_Finger( unsigned int storeID )
  595. {
  596.        unsigned long temp = 0;
  597.            unsigned char i;
  598.        FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;                 //0x00,0x0B,0x00,0x19.
  599.        FPM10A_Save_Finger[6] = (storeID&0x00FF);
  600.            for(i=0;i<7;i++)   //計算校驗和
  601.                    temp = temp + FPM10A_Save_Finger[i];
  602.                    FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數據
  603.                    FPM10A_Save_Finger[8]= temp & 0x0000FF;                  
  604.        FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭        
  605.        for(i=0;i<9;i++)  
  606.                       Uart_Send_Byte(FPM10A_Save_Finger[i]);      //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  607. }

  608. //添加指紋
  609. void FPM10A_Add_Fingerprint()
  610. {
  611.         unsigned char id_show[]={0,0,0};
  612.         u16 finger_id;
  613.         Lcd1602WriteCmd(0x01); //清屏
  614.         finger_id=0;  
  615.         while(1)
  616.         {
  617.         Lcd1602ShowStr(0,0,"  Add finger    ");
  618.         Lcd1602ShowStr(0,1,"  ID:          ");
  619.         
  620.         //按返回鍵直接回到主菜單
  621.         if(KEY_CANCEL == 0)
  622.         {
  623.                  while(KEY_CANCEL==0);
  624.                  break;
  625.         }

  626.         //按切換鍵指紋iD值加1
  627.         if(KEY_DOWN == 0)
  628.         {
  629.                 while(KEY_DOWN==0);
  630.                 if(finger_id == 1000)
  631.                 {
  632.                         finger_id = 0;
  633.                 }
  634.                 else
  635.                 finger_id = finger_id + 1;
  636.         }

  637.          //指紋iD值顯示處理
  638.          Lcd1602WriteCmd(0xc0+10);
  639.          Lcd1602WriteData(finger_id/100+48);
  640.          Lcd1602WriteData(finger_id%100/10+48);
  641.          Lcd1602WriteData(finger_id%100%10+48);

  642.          //按確認鍵開始錄入指紋信息                                          
  643.          if(KEY_OK == 0)
  644.           {        
  645.                           while(KEY_OK==0);
  646.                           Lcd1602ShowStr(0,0," Please finger ");
  647.                           //LCD1602_Display(0x80," Please  finger ",0,16);
  648.                           //LCD1602_Display(0xc0,"                ",0,16);
  649.                           Lcd1602ShowStr(0,1,"                ");
  650.                         //while(KEY_CANCEL == 1)
  651.                         while(KEY_CANCEL == 1)
  652.                    {
  653.                           //按下返回鍵退出錄入返回fingerID調整狀態   
  654.                                 if(KEY_CANCEL == 0)
  655.                                  {
  656.                                   while(KEY_CANCEL==0);
  657.                                   break;
  658.                                   }
  659.                                 FPM10A_Cmd_Get_Img(); //獲得指紋圖像
  660.                                 FPM10A_Receive_Data(12);
  661.                                 //判斷接收到的確認碼,等于0指紋獲取成功
  662.                                 if(FPM10A_RECEICE_BUFFER[9]==0)
  663.                                  {
  664.                                         //Delay_Ms(100);
  665.                                         delay(100);
  666.                                         FINGERPRINT_Cmd_Img_To_Buffer1();
  667.                                     FPM10A_Receive_Data(12);
  668.                                         Lcd1602ShowStr(0,0,"Successful entry");
  669.                                         //LCD1602_Display(0x80,"Successful entry",0,16);
  670.                                         Buzz_Times(1);
  671.                                         delay(1000);
  672.                                         Lcd1602ShowStr(0,0," Please  finger ");
  673.                                         Lcd1602ShowStr(0,1,"                ");
  674.                                         //LCD1602_Display(0x80," Please  finger ",0,16);
  675.                                           //LCD1602_Display(0xc0,"                ",0,16);
  676.                                         while(1)
  677.                                         {
  678.                                                 if(KEY_CANCEL == 0)
  679.                                                 {
  680.                                                         while(KEY_CANCEL==0);
  681.                                                         break;
  682.                                                 }
  683.                                          FPM10A_Cmd_Get_Img(); //獲得指紋圖像
  684.                                          FPM10A_Receive_Data(12);
  685.                                         //判斷接收到的確認碼,等于0指紋獲取成功
  686.                                         if(FPM10A_RECEICE_BUFFER[9]==0)
  687.                                         {
  688.                                                 delay(200);
  689.                                                 Lcd1602ShowStr(0,0,"Successful entry");
  690.                                             Lcd1602ShowStr(0,1,"    ID is       ");
  691.                                                 //LCD1602_Display(0x80,"Successful entry",0,16);
  692.                                                 //LCD1602_Display(0xc0,"    ID is       ",0,16);
  693.                                                  //指紋iD值顯示處理
  694.                                                  Lcd1602WriteCmd(0xc0+10);
  695.                                                  Lcd1602WriteData(finger_id/100+48);
  696.                                                  Lcd1602WriteData(finger_id%100/10+48);
  697.                                                  Lcd1602WriteData(finger_id%100%10+48);
  698.                                                 FINGERPRINT_Cmd_Img_To_Buffer2();
  699.                                                   FPM10A_Receive_Data(12);
  700.                                                 FPM10A_Cmd_Reg_Model();//轉換成特征碼
  701.                                          FPM10A_Receive_Data(12);
  702.                                                   FPM10A_Cmd_Save_Finger(finger_id);                                         
  703.                                           FPM10A_Receive_Data(12);
  704.                                                 Buzz_Times(1);
  705.                                                 delay(1000);
  706.                                                 finger_id=finger_id+1;
  707.                                             break;
  708.                                           }
  709.                                    }
  710.                                    
  711.                                 break;
  712.                                         }
  713.                                 }
  714. //                        ClrScreen(); //清空顯示屏
  715.                         }  
  716.                 //        Delay_Ms(500);
  717.                 }
  718. }

  719. //搜索指紋
  720. void FPM10A_Find_Fingerprint()
  721. {
  722.         unsigned int find_fingerid = 0;
  723.         unsigned char id_show[]={0,0,0};
  724.         do
  725.         {
  726.                 Lcd1602ShowStr(0,0," Please  finger ");
  727.                 Lcd1602ShowStr(0,1,"                ");
  728.                 //LCD1602_Display(0x80," Please  finger ",0,16);
  729.                 //LCD1602_Display(0xc0,"                ",0,16);
  730.                 FPM10A_Cmd_Get_Img(); //獲得指紋圖像
  731.                 FPM10A_Receive_Data(12);               
  732.                 //判斷接收到的確認碼,等于0指紋獲取成功
  733.                 if(FPM10A_RECEICE_BUFFER[9]==0)
  734.                 {                        
  735.                         delay(100);
  736.                         FINGERPRINT_Cmd_Img_To_Buffer1();
  737.                         FPM10A_Receive_Data(12);               
  738.                         FPM10A_Cmd_Search_Finger();
  739.                         FPM10A_Receive_Data(16);                        
  740.                         if(FPM10A_RECEICE_BUFFER[9] == 0) //搜索到  
  741.                         {
  742.                                 Lcd1602ShowStr(0,0," Search success ");
  743.                                 Lcd1602ShowStr(0,1,"    ID is       ");
  744.                                 //LCD1602_Display(0x80," Search success ",0,16);
  745.                                 //LCD1602_Display(0xc0,"    ID is       ",0,16);
  746.                                 Buzz_Times(1);                                       
  747.                                 //拼接指紋ID數
  748.                                 find_fingerid = FPM10A_RECEICE_BUFFER[10]*256 + FPM10A_RECEICE_BUFFER[11];                                       
  749.                                  //指紋iD值顯示處理
  750.                                  Lcd1602WriteCmd(0xc0+10);
  751.                                  Lcd1602WriteData(find_fingerid/100+48);
  752.                                  Lcd1602WriteData(find_fingerid%100/10+48);
  753.                                  Lcd1602WriteData(find_fingerid%100%10+48);
  754.                                  //LCD1602_WriteCMD(0xc0+10);
  755.                                  //LCD1602_WriteDAT(find_fingerid/100+48);
  756.                                  //LCD1602_WriteDAT(find_fingerid%100/10+48);
  757.                                  //LCD1602_WriteDAT(find_fingerid%100%10+48);                                                
  758.                                 delay(2000);                                
  759.                            }
  760.                                 else //沒有找到
  761.                                 {
  762.                                         //LCD1602_Display(0x80," Search  failed ",0,16);
  763.                                         //LCD1602_Display(0xc0,"                ",0,16);
  764.                                         Lcd1602ShowStr(0,0," Search  failed ");
  765.                                         Lcd1602ShowStr(0,1,"                ");
  766.                                          Buzz_Times(3);
  767.                                 }
  768.                         }               
  769.                 }while(KEY_CANCEL == 1);
  770. }
  771. //刪除所有存貯的指紋庫
  772. void FPM10A_Delete_All_Fingerprint()
  773. {
  774.                 unsigned char i=0;
  775.                                 //LCD1602_Display(0x80,"   empty all    ",0,16);
  776.                                 //LCD1602_Display(0xc0,"   Yes or no ?  ",0,16);
  777.                                 Lcd1602ShowStr(0,0,"   empty all    ");
  778.                                 Lcd1602ShowStr(0,1,"   Yes or no ?  ");
  779.                 do
  780.                  {if(KEY_OK==0)
  781.                         {
  782.                                 while(KEY_OK==0);
  783.                                 //LCD1602_Display(0x80,"   emptying     ",0,16);
  784.                                 //LCD1602_Display(0xc0,"                ",0,16);
  785.                                 Lcd1602ShowStr(0,0,"   emptying     ");
  786.                                 Lcd1602ShowStr(0,1,"                ");
  787.                                 delay(300);
  788.                                 Lcd1602WriteCmd(0xc0);
  789.                                 for(i=0;i<16;i++)
  790.                                  {
  791.                                         Lcd1602WriteData(42);
  792.                                         delay(100);
  793.                                  }
  794.                                 FINGERPRINT_Cmd_Delete_All_Model();
  795.                             FPM10A_Receive_Data(12);
  796.                         //        LCD1602_Display(0x80,"   All empty    ",0,16);
  797.                         //        LCD1602_Display(0xc0,"                ",0,16);
  798.                                 Lcd1602ShowStr(0,0,"   All empty    ");
  799.                                 Lcd1602ShowStr(0,1,"                ");
  800.                                 Buzz_Times(3);
  801.                                 break;
  802.                         }
  803.                  }while(KEY_CANCEL==1);
  804. }

  805. void Device_Check(void)
  806. {
  807.                 unsigned char i=0;
  808.                 FPM10A_RECEICE_BUFFER[9]=1;                                           //串口數組第九位可判斷是否通信正常
  809.                 Lcd1602ShowStr(0,1,"Loading     ");              //LCD1602_Display(0xc0,"Loading",0,7);                   //設備加載中界面                                                           
  810.                 for(i=0;i<8;i++)                                                           //進度條式更新,看起來美觀
  811.                 {
  812.                         Lcd1602WriteData(42);                               //42對應ASIC碼的 *
  813.                         delay(200);                                                           //控制進度條速度
  814.                 }
  815.                 Lcd1602ShowStr(0,1,"failure         ");                        //LCD1602_Display(0xc0,"Docking  failure",0,16);      //液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋        
  816.                 FPM10A_Cmd_Check();                                                                        //單片機向指紋模塊發送校對命令
  817.                 FPM10A_Receive_Data(12);                                                        //將串口接收到的數據轉存
  818.                  if(FPM10A_RECEICE_BUFFER[9]==0)                                        //判斷數據低第9位是否接收到0
  819.                 {
  820.                         Lcd1602ShowStr(0,1,"success         ");       //LCD1602_Display(0xc0,"Docking  success",0,16);        //符合成功條件則顯示對接成功
  821.                 }
  822. }
  823. void Buzz_Times(unsigned char times)
  824. {
  825.         unsigned char i=0;
  826.         for(i=0;i<times;i++)
  827.         {
  828.                  buzz=0;
  829.                  delay(1);
  830.                  buzz=1;
  831.                  delay(1);
  832.         }
  833. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:293977 發表于 2018-5-11 17:28 | 只看該作者
你這個問題問的讓人難以回答,能說具體點嗎?你這個模塊我之前用過,我看你程序里波特率設置是9600。這個指紋模塊波特率默認是57600,如果你沒改過設置的話那就是你串口波特率沒設置對。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 另类二区 | 日韩网站在线观看 | 久久久久久国产精品 | 中文字幕 在线观看 | 亚洲精品乱码久久久久久按摩 | 欧美日韩精品久久久免费观看 | 中文字幕久久精品 | 亚洲精品久久嫩草网站秘色 | 成人av在线大片 | 欧美一级片在线看 | 日本精品久久久久久久 | 日韩视频精品 | 国产一区二区在线看 | 黑人巨大精品欧美一区二区一视频 | 超碰免费观看 | 日本福利在线观看 | 一区 | 久久久精品影院 | 日韩一区欧美一区 | 久久av网站 | 欧美色图另类 | 波多野结衣中文视频 | 亚洲精品福利在线 | 999久久久国产精品 欧美成人h版在线观看 | 午夜精品视频在线观看 | 国产精品精品视频一区二区三区 | 国产精品视频网 | 亚洲一区三区在线观看 | 毛片免费视频 | 97伦理电影| 久久久久久av | 一区二区视频在线 | 在线观看免费黄色片 | 久久a久久 | 精品免费视频 | 一级毛片色一级 | 亚洲精品视频在线观看免费 | 欧美 日韩 国产 成人 在线 | 亚洲欧洲精品在线 | 欧美精品久久久久久久久久 | 国产精品自拍视频 |