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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+電磁鎖+AS608指紋鎖設計源碼與實物圖分享 LCD12864顯示

  [復制鏈接]
跳轉到指定樓層
樓主
ID:247778 發表于 2018-11-25 21:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
輸入模塊:AS608,矩陣鍵盤
處理器:STC90C52
輸出設備:LCD12864,電磁鎖,繼電器

總流程:當AS608探測到有手指接觸時,判斷是否符合已儲存的指紋數據,符合輸出電平開鎖,否則12864顯示錯誤。或者當輸入數字密碼相符合也可開鎖,內部存有開鎖密碼,和管理員密碼(設置指紋庫和開門密碼),密碼和指紋ID號存儲在EEPROM中防止掉電丟失。

制作出來的實物圖如下:


單片機程序源碼:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define jzaj P1
  7. uchar x,Administrators,out=0,k=0,h,b,reset1=0;
  8. uchar password[6]={1,2,3,4,5,6};
  9. uchar password1[6];
  10. uchar password2[6]={1,2,3,4,5,6};
  11. uchar adminpassword[6]={6,6,6,6,6,6};
  12. uchar adminpassword1[6];
  13. uchar adminpassword2[6]={6,6,6,6,6,6};
  14. sbit kai=P0^5;
  15. sbit kai1=P0^6;
  16. sbit kai2=P0^7;
  17. uchar code  DIS1[] = {"    歡迎使用   "};                  //一個漢字占用兩個字符空間,故漢字只能占用偶數地址
  18. uchar code  DIS2[] = {"  云部落指紋鎖 "};
  19. uchar code  DIS3[] = {"    密碼吻合   "};
  20. uchar code  DIS14[] = {"    密碼錯誤   "};
  21. uchar code  DIS4[] = {"已識別  ID:   "};
  22. uchar code  DIS5[] = {"  沒有找到     "};
  23. uchar code  DIS6[] = {"請輸入管理員密碼"};
  24. uchar code  DIS7[] = {"1.添加指紋     "};
  25. uchar code  DIS8[] = {"2.清空指紋     "};
  26. uchar code  DIS9[] = {"3.開鎖密碼     "};
  27. uchar code  DIS10[] = {"4.管理密碼     "};
  28. uchar code  DIS11[] = {"  請輸入指紋   "};
  29. uchar code  DIS12[] = {"  請再次輸入指紋"};
  30. uchar code  DIS13[] = {"添加成功ID:   "};
  31. uchar code  DIS15[] = {"  清空成功     "};
  32. uchar code  DIS16[] = {"  清空失敗     "};
  33. uchar code  DIS17[] = {"  確認清空?   "};
  34. uchar code  DIS18[] = {"  請輸入新密碼 "};
  35. uchar code  DIS19[] = {"  確認修改?   "};
  36. uchar code  DIS20[] = {"  修改成功     "};
  37. uchar code  DIS21[] = {"  復位成功     "};
  38. /************* 12864LCD引腳定義 *************/
  39. #define LCD_data  P2       //數據口
  40. sbit LCD_RS  =  P0^0;      //寄存器選擇輸入
  41. sbit LCD_RW  =  P0^1;      //液晶讀/寫控制
  42. sbit LCD_EN  =  P0^2;      //液晶使能控制
  43. sbit LCD_PSB =  P0^3;      //串/并方式控制
  44. sbit LCD_RST =  P0^4;      //液晶復位端口
  45. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  46. void delay(int ms)
  47. {
  48.     while(ms--)
  49.         {
  50.       uchar i;
  51.           for(i=0;i<150;i++)  
  52.            {
  53.             _nop_();                           
  54.                 _nop_();
  55.                 _nop_();
  56.                 _nop_();
  57.            }
  58.         }
  59. }
  60. /*******************************************************************/
  61. /*                                                                 */
  62. /*檢查LCD忙狀態                                                    */
  63. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
  64. /*                                                                 */
  65. /*******************************************************************/
  66. bit lcd_busy()
  67. {                          
  68.     bit result;
  69.     LCD_RS = 0;
  70.     LCD_RW = 1;
  71.     LCD_EN = 1;
  72.     delayNOP();
  73.     result = (bit)(LCD_data&0x80);
  74.     LCD_EN = 0;
  75.     return(result);
  76. }
  77. /*******************************************************************/
  78. /*                                                                 */
  79. /*寫指令數據到LCD                                                  */
  80. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  81. /*                                                                 */
  82. /*******************************************************************/
  83. void lcd_wcmd(uchar cmd)
  84. {                          
  85.    while(lcd_busy());
  86.     LCD_RS = 0;
  87.     LCD_RW = 0;
  88.     LCD_EN = 0;
  89.     _nop_();
  90.     _nop_();
  91.     LCD_data = cmd;
  92.     delayNOP();
  93.     LCD_EN = 1;
  94.     delayNOP();
  95.     LCD_EN = 0;  
  96. }
  97. /*******************************************************************/
  98. /*                                                                 */
  99. /*寫顯示數據到LCD                                                  */
  100. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
  101. /*                                                                 */
  102. /*******************************************************************/
  103. void lcd_wdat(uchar dat)
  104. {                          
  105.    while(lcd_busy());
  106.     LCD_RS = 1;
  107.     LCD_RW = 0;
  108.     LCD_EN = 0;
  109.     LCD_data = dat;
  110.     delayNOP();
  111.     LCD_EN = 1;
  112.     delayNOP();
  113.     LCD_EN = 0;
  114. }
  115. /*******************************************************************/
  116. /*                                                                 */
  117. /*  LCD初始化設定                                                  */
  118. /*                                                                 */
  119. /*******************************************************************/
  120. void lcd_init()
  121. {
  122.     LCD_PSB = 1;         //并口方式
  123.    
  124.         LCD_RST = 0;                 //液晶復位
  125.     delay(3);                  
  126.     LCD_RST = 1;      
  127.     delay(3);
  128.    
  129.     lcd_wcmd(0x34);      //擴充指令操作
  130.     delay(5);
  131.     lcd_wcmd(0x30);      //基本指令操作
  132.     delay(5);
  133.     lcd_wcmd(0x0C);      //顯示開,關光標
  134.     delay(5);
  135.     lcd_wcmd(0x01);      //清除LCD的顯示內容
  136.     delay(5);
  137. }
  138. /*********************************************************/
  139. /*                                                       */
  140. /* 設定顯示位置                                          */
  141. /*                                                       */
  142. /*********************************************************/
  143. void lcd_pos(uchar X,uchar Y)
  144. {                          
  145.    uchar  pos;
  146.    if (X==1)
  147.      {X=0x80;}
  148.    else if (X==2)
  149.      {X=0x90;}
  150.    else if (X==3)
  151.      {X=0x88;}
  152.    else if (X==4)
  153.      {X=0x98;}
  154.    pos = X+Y ;

  155.    lcd_wcmd(pos);     //顯示地址
  156. }
  157. /*********************************************************
  158. *                                                        *
  159. * 清屏函數                                               *
  160. *                                                        *
  161. *********************************************************/
  162. void  clr_screen()
  163. {
  164.    lcd_wcmd(0x34);      //擴充指令操作
  165.    delay(5);   
  166.    lcd_wcmd(0x30);      //基本指令操作
  167.    delay(5);
  168.    lcd_wcmd(0x01);      //清屏
  169.    delay(5);     
  170. }
  171. //////////////////////////////////////////////////////////////////////////
  172. void kaisuo();
  173. //////////////////////////////////////////////////////////////////////////
  174. sfr ISP_DATA = 0xe2;
  175. sfr ISP_ADDRH = 0xe3;
  176. sfr ISP_ADDRL = 0xe4;
  177. sfr ISP_CMD = 0xe5;
  178. sfr ISP_TRIG = 0xe6;
  179. sfr ISP_CONTR = 0xe7;
  180. void  cc(uint addr);
  181. void  xcx(uint addr,uchar dat);
  182. uchar dcx(uint addr);
  183. void  Q0();
  184. /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  185. 函數:擦除某一扇區(每個扇區 512 字節)
  186. 入口: addr = 某一扇區首地址
  187. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
  188. void cc(uint addr)
  189. {
  190. // 打開 IAP 功能 (ISP_CONTR.7)=1: 允許編程改變 Flash, 設置 Flash 操作等待時間
  191. // 0x83( 晶振 <5M)  0x82(晶振 <10M)  0x81(晶振 <20M)  0x80(晶振 <40M)
  192.   ISP_CONTR = 0x81;
  193.   ISP_CMD  = 0x03;  // 用戶可以對 "Data Flash/EEPROM區"進行扇區擦除
  194.   ISP_ADDRL = addr;  // ISP/IAP 操作時的地址寄存器低八位,
  195.   ISP_ADDRH = addr>>8;  // ISP/IAP 操作時的地址寄存器高八位。
  196.   EA =0;
  197.   ISP_TRIG = 0x46;  // 在 ISPEN(ISP_CONTR.7)=1 時,對 ISP_TRIG先寫入 46h,
  198.   ISP_TRIG = 0xB9;  // 再寫入 B9h,ISP/IAP命令才會生效。
  199.   _nop_();
  200.   Q0();  // 關閉 ISP/IAP
  201. }
  202. /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  203. 函數:寫一字節
  204. 入口: addr = 扇區單元地址 , dat = 待寫入數據
  205. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
  206. void xcx(uint addr,uchar dat)
  207. {
  208.   ISP_CONTR = 0x81;
  209.   ISP_CMD  = 0x02;  // 用戶可以對 "Data Flash/EEPROM區"進行字節編程
  210.   ISP_ADDRL = addr;
  211.   ISP_ADDRH = addr>>8;
  212.   ISP_DATA = dat;  // 數據進 ISP_DATA
  213.   EA = 0;
  214.   ISP_TRIG = 0x46;
  215.   ISP_TRIG = 0xB9;
  216.   _nop_();
  217.   Q0();  // 關閉 ISP/IAP
  218. }
  219. /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  220. 函數:讀一字節
  221. 入口: addr = 扇區單元地址
  222. 出口: dat  = 讀出的數據
  223. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
  224. uchar dcx(uint addr)
  225. {
  226.   uchar dat;
  227.   ISP_CONTR = 0x81;
  228.   ISP_CMD  = 0x01;  // 用戶可以對 "Data Flash/EEPROM區 "進行字節讀
  229.   ISP_ADDRL = addr;
  230.   ISP_ADDRH = addr>>8;
  231.   EA = 0;
  232.   ISP_TRIG = 0x46;
  233.   ISP_TRIG = 0xB9;
  234.   _nop_();
  235.   dat = ISP_DATA;  // 取出數據
  236.   Q0();  // 關閉 ISP/IAP
  237.   return dat;
  238. }
  239. /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  240. 函數:關閉 ISP/IAP操作
  241. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
  242. void Q0()
  243. {
  244.   ISP_CONTR = 0;  // 關閉 IAP功能
  245.   ISP_CMD  = 0;  // 待機模式,無 ISP操作
  246.   ISP_TRIG = 0;  // 關閉 IAP功能 , 清與 ISP有關的特殊功能寄存器
  247. }
  248. void wolegequ()
  249. {
  250.   uchar i;
  251.   cc(0x2200); // 擦除第 2 個扇區
  252.   for(i=0;i<6;i++)
  253.   {
  254.     xcx(0x2200+i,password2[i]);  // 對 EEPROM區 2200h 寫入
  255.   }
  256.   cc(0x2400); // 擦除第 2 個扇區
  257.   for(i=0;i<6;i++)
  258.   {
  259.     xcx(0x2400+i,adminpassword2[i]);  // 對 EEPROM區 2200h 寫入
  260.   }
  261.   EA=1;
  262. }
  263. //////////////////////////////////////////////////////////////////////////
  264. volatile unsigned char FPM10A_RECEICE_BUFFER[32];
  265. unsigned int finger_id=0 ;

  266. code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
  267. code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像
  268. code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1
  269. code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2
  270. code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版
  271. code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
  272. code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版
  273. volatile unsigned char  FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置

  274. //發送包頭

  275. void Uart_Init(void)
  276. {
  277.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允許接收
  278.     PCON=0x00;   //SMOD=0:波特率不加倍
  279.     TMOD=0x20;   //T1方式2,用于UART波特率
  280.     TH1=0xFD;
  281.     TL1=0xFD;   //UART波特率設置:FDFD,9600;FFFF,57600
  282.     TR1=1;         //允許T1計數
  283.     EA=1;
  284. }


  285. void Uart_Send_Byte(unsigned char c)//UART Send a byte
  286. {
  287.         SBUF = c;
  288.         while(!TI);                //發送完為1
  289.         TI = 0;
  290. }

  291. unsigned char Uart_Receive_Byte()//UART Receive a byteg
  292. {        
  293.         unsigned char dat;
  294.         while(!RI);         //接收完為1
  295.         RI = 0;
  296.         dat = SBUF;
  297.         return (dat);
  298. }

  299. void FPM10A_Cmd_Send_Pack_Head(void)
  300. {
  301.         int i;        
  302.         for(i=0;i<6;i++) //包頭
  303.    {
  304.      Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  305.     }               
  306. }

  307. //接收反饋數據緩沖
  308. void FPM10A_Receive_Data(unsigned char ucLength)
  309. {
  310.   unsigned char i;

  311.   for (i=0;i<ucLength;i++)
  312.      FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();

  313. }

  314. //FINGERPRINT_獲得指紋圖像命令
  315. void FPM10A_Cmd_Get_Img(void)
  316. {
  317.     unsigned char i;
  318.     FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  319.     for(i=0;i<6;i++) //發送命令 0x1d
  320.         {
  321.        Uart_Send_Byte(FPM10A_Get_Img[i]);
  322.         }
  323. }
  324. //講圖像轉換成特征碼存放在Buffer1中
  325. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  326. {
  327.          unsigned char i;
  328.         FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭      
  329.            for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  330.      {
  331.       Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
  332.              }
  333. }
  334. //將圖像轉換成特征碼存放在Buffer2中
  335. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  336. {
  337.      unsigned char i;
  338.      for(i=0;i<6;i++)    //發送包頭
  339.          {
  340.             Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  341.             }
  342.      for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  343.       {
  344.               Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
  345.              }
  346. }
  347. void FPM10A_Cmd_Reg_Model(void)
  348. {
  349.        unsigned char i;           
  350.             
  351.                          FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭

  352.        for(i=0;i<6;i++)
  353.            {
  354.                   Uart_Send_Byte(FPM10A_Reg_Model[i]);   
  355.                       }


  356. }
  357. //搜索全部用戶999枚
  358. void FPM10A_Cmd_Search_Finger(void)
  359. {
  360.        unsigned char i;                       
  361.                          FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
  362.        for(i=0;i<11;i++)
  363.            {
  364.                   Uart_Send_Byte(FPM10A_Search[i]);   
  365.                       }
  366. }
  367. //保存指紋
  368. void FPM10A_Cmd_Save_Finger( unsigned int storeID )
  369. {
  370.        unsigned long temp = 0;
  371.                    unsigned char i;
  372.        FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
  373.        FPM10A_Save_Finger[6] = (storeID&0x00FF);
  374.                    for(i=0;i<7;i++)   //計算校驗和
  375.                               temp = temp + FPM10A_Save_Finger[i];
  376.                    FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數據
  377.                    FPM10A_Save_Finger[8]= temp & 0x0000FF;                  
  378.        FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭        
  379.        for(i=0;i<9;i++)  
  380.                       Uart_Send_Byte(FPM10A_Save_Finger[i]);      //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  381. }
  382. //刪除指紋模塊里的所有指紋模版
  383. void FINGERPRINT_Cmd_Delete_All_Model(void)
  384. {
  385.      unsigned char i;   
  386.     for(i=0;i<6;i++) //包頭
  387.       Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  388.     for(i=0;i<6;i++) //命令合并指紋模版
  389.            {
  390.       Uart_Send_Byte(FPM10A_Delete_All_Model[i]);   
  391.                  }        
  392. }
  393. //搜索指紋
  394. void FPM10A_Find_Fingerprint()
  395. {
  396.   unsigned int find_fingerid = 0,i;
  397.   unsigned char id_show[3];
  398.   
  399.   
  400.   FPM10A_Cmd_Get_Img();                                         //獲得指紋圖像命令
  401.   FPM10A_Receive_Data(12);                                  //接收反饋數據緩沖
  402.   if(FPM10A_RECEICE_BUFFER[9]==0)                 //根據反饋回來的第9位數據來判斷模塊上有無指紋,有則繼續執行無則退出
  403.   {
  404.     FINGERPRINT_Cmd_Img_To_Buffer1();          //講圖像轉換成特征碼存放在Buffer1中
  405.         FPM10A_Receive_Data(12);               
  406.         FPM10A_Cmd_Search_Finger();                                //搜索全部用戶999枚
  407.         FPM10A_Receive_Data(16);
  408.         if(FPM10A_RECEICE_BUFFER[9] == 0) //搜索到  
  409.         {
  410.           clr_screen();
  411.           lcd_pos(2,0);             //設置顯示“已識別”
  412.       for(i=0;i<16;i++)
  413.             {
  414.         lcd_wdat(DIS4[i]);
  415.             
  416.             }         
  417.           find_fingerid = FPM10A_RECEICE_BUFFER[10]*256 + FPM10A_RECEICE_BUFFER[11];
  418.           id_show[0]=find_fingerid/100+0x30;
  419.           id_show[1]=find_fingerid%100/10+0x30;
  420.           id_show[2]=find_fingerid%100%10+0x30;
  421.           lcd_pos(2,13);             //設置顯示ID號
  422.       for(i=0;i<3;i++)
  423.             {
  424.         lcd_wdat(id_show[i]);
  425.             }
  426.           delay(1000);
  427.           kaisuo();
  428.         }
  429.         else
  430.         { clr_screen();
  431.           lcd_pos(2,0);             //設置顯示“沒有找到”
  432.       for(i=0;i<16;i++)
  433.             {
  434.         lcd_wdat(DIS5[i]);           
  435.             }
  436.           delay(1000);
  437.         }
  438.         clr_screen();
  439.   }
  440. }
  441. void HSjzaj();                                                         ///////////////////////////聲明函數以便調用
  442. //刪除所有存貯的指紋庫
  443. void FPM10A_Delete_All_Fingerprint()
  444. {
  445.   char i;
  446.   clr_screen();
  447.   lcd_pos(1,0);             //
  448.   for(i=0;i<16;i++)
  449.   {
  450.     lcd_wdat(DIS17[i]);
  451.   }
  452.   delay(1000);
  453.   x=0;
  454.   HSjzaj();
  455.   if(x==1)
  456.   {
  457.     FINGERPRINT_Cmd_Delete_All_Model();
  458.     FPM10A_Receive_Data(12);
  459.     if(FPM10A_RECEICE_BUFFER[9]==0)
  460.     {
  461.       lcd_pos(2,0);             //設置顯示位置為第一行
  462.             for(i=0;i<16;i++)
  463.             {
  464.                     lcd_wdat(DIS15[i]);
  465.             }
  466.           delay(1000);
  467.           finger_id=0;
  468.           cc(0x2000); // 擦除第 1 個扇區( 2000h~21FFh)
  469.       xcx(0x2002,finger_id);  // 對 EEPROM區 2002h 寫入
  470.           EA=1;
  471.     }
  472.     else
  473.     {
  474.       lcd_pos(2,0);             //設置顯示位置為第一行
  475.       for(i=0;i<16;i++)
  476.             {
  477.             lcd_wdat(DIS16[i]);
  478.                     
  479.            }
  480.           delay(1000);
  481.     }
  482.   }
  483.   clr_screen();
  484. }
  485. //添加指紋
  486. void FPM10A_Add_Fingerprint()
  487. {
  488.   uchar i;
  489.   volatile unsigned char id_show[3];
  490.   clr_screen();
  491.   lcd_pos(1,0);             //設置顯示位置為第一行
  492.   for(i=0;i<16;i++)
  493.   {
  494.     lcd_wdat(DIS11[i]);
  495.   }
  496.   delay(2000);
  497.   FPM10A_Cmd_Get_Img(); //獲得指紋圖像
  498.   FPM10A_Receive_Data(12);
  499.   if(FPM10A_RECEICE_BUFFER[9]==0)
  500.   {
  501.     FINGERPRINT_Cmd_Img_To_Buffer1();
  502.         FPM10A_Receive_Data(12);
  503.     lcd_pos(2,0);             //設置顯示位置為第一行
  504.     for(i=0;i<16;i++)
  505.     {
  506.       lcd_wdat(DIS12[i]);
  507.     }
  508.         delay(2000);
  509.         FPM10A_Cmd_Get_Img(); //獲得指紋圖像
  510.         FPM10A_Receive_Data(12);
  511.         if(FPM10A_RECEICE_BUFFER[9]==0)
  512.         {
  513.           FINGERPRINT_Cmd_Img_To_Buffer2();
  514.           FPM10A_Receive_Data(12);
  515.           FPM10A_Cmd_Reg_Model();//轉換成特征碼
  516.           FPM10A_Receive_Data(12);
  517.           id_show[0]=finger_id/100+0x30;                                         //加0x30,轉換成字符串
  518.           id_show[1]=finger_id%100/10+0x30;
  519.           id_show[2]=finger_id%100%10+0x30;
  520.           clr_screen();
  521.           lcd_pos(1,0);             //設置顯示位置為第一行
  522.       for(i=0;i<16;i++)
  523.       {
  524.               lcd_wdat(DIS13[i]);
  525.              delay(0);
  526.       }
  527.           lcd_pos(3,12);             //設置顯示位置為第一行
  528.       for(i=0;i<3;i++)
  529.       {
  530.               lcd_wdat(id_show[i]);
  531.       }
  532.           delay(1000);
  533.           FPM10A_Cmd_Save_Finger(finger_id++);
  534.           cc(0x2000); // 擦除第 1 個扇區( 2000h~21FFh)
  535.       xcx(0x2002,finger_id);  // 對 EEPROM區 2002h 寫入
  536.           EA=1;                                         
  537.           FPM10A_Receive_Data(12);
  538.         }

  539.   }
  540. }
  541. //確認指令
  542. void confirm()                                                         
  543. {
  544.   uchar i,p=0;
  545.   clr_screen();
  546.   for(i=0;i<6;i++)
  547.   {
  548.     if(password1[i]==password[i])
  549.         {
  550.           delay(0);
  551.         }
  552.     else
  553.         {
  554.           p=1;
  555.         }
  556.   }
  557.   if(p==0)
  558.   {
  559.     lcd_pos(2,0);            
  560.     for(i=0;i<16;i++)
  561.     {
  562.       lcd_wdat(DIS3[i]);                                   //密碼正確      
  563.     }
  564.         delay(1000);
  565.         kaisuo();
  566.   }
  567.   else
  568.   {
  569.     lcd_pos(2,0);            
  570.     for(i=0;i<16;i++)
  571.     {
  572.       lcd_wdat(DIS14[i]);                                  //密碼錯誤      
  573.     }
  574.         delay(1000);
  575.   }
  576.   for(i=0;i<6;i++)
  577.   {
  578.     password1[i]=0;                                                //將密碼1寄存器置零
  579.   }
  580.   clr_screen();
  581. }

  582. //矩陣鍵盤
  583. void HSjzaj()
  584. {
  585.   uchar c=10;                                                                                                                        ///
  586.   jzaj=0x0f;
  587.   if(jzaj!=0x0f)
  588.   {
  589.     delay(50);
  590.         if(jzaj!=0x0f)
  591.         {
  592.           switch(jzaj)
  593.           {
  594.             case (0x07): b=0;break;
  595.                 case (0x0b): b=1;break;
  596.                 case (0x0d): b=2;break;
  597.                 case (0x0e): b=3;break;
  598.           }
  599.           jzaj=0xf0;
  600.           switch(jzaj)
  601.           {
  602.             case (0xe0): b=b+0;break;
  603.                 case (0xd0): b=b+4;break;
  604.                 case (0xb0): b=b+8;break;
  605.                 case (0x70): b=b+12;break;
  606.           }
  607.       switch(b)
  608.           {
  609.                 case (0): c=1;break;
  610.                 case (1): c=2;break;
  611.                 case (2): c=3;break;
  612.                 case (3): Administrators=1;break;
  613.                 case (4): c=4;break;
  614.                 case (5): c=5;break;
  615.                 case (6): c=6;break;
  616.                 case (7): out=1;break;
  617.                 case (8): c=7;break;
  618.                 case (9): c=8;break;
  619.                 case (10): c=9;break;
  620.                 case (11): reset1=1;break;
  621.                 case (12): c='*';break;
  622.                 case (13): c=0;break;
  623.                 case (14): c='#';break;
  624.                 case (15): x=1;break;                                                 //確認
  625.           }
  626.           if((0<=c&&c<=9)||c=='*'||c=='#')                                        //只有C為0~9或#,*方可進入
  627.           {
  628.                 if(h==0)
  629.                 {
  630.                   password1[k]=c;
  631.                 }
  632.                 else
  633.                 {
  634.                   adminpassword1[k]=c;
  635.                 }
  636.                 lcd_pos(4,k);             //云部落指紋鎖
  637.         lcd_wdat('*');
  638.         delay(0);
  639.                 k++;
  640.                 if(k==7)
  641.                 {
  642.                   k=0;
  643.                   clr_screen();                         //顯示6個*后清屏
  644.                 }
  645.           }
  646.         }
  647.   }
  648.   delay(50);
  649. }
  650. //修改管理員密碼
  651. void HSadminpassword()
  652. {
  653.   uchar i=0;
  654.   x=0;
  655.   out=0;
  656.   h=1;
  657.   clr_screen();
  658.   while(out==0)
  659.   {
  660.     lcd_pos(1,0);             //請輸入新密碼
  661.     for(i=0;i<16;i++)
  662.     {
  663.       lcd_wdat(DIS18[i]);
  664.     }
  665.         HSjzaj();
  666.         lcd_pos(2,0);            
  667.     for(i=0;i<6;i++)
  668.     {
  669.       lcd_wdat(adminpassword1[i]+0x30);                                 
  670.     }
  671.         lcd_pos(3,0);            
  672.     for(i=0;i<16;i++)
  673.     {
  674.       lcd_wdat(DIS19[i]);
  675.     }
  676.         if(x==1)
  677.         {
  678.           for(i=0;i<6;i++)
  679.           {
  680.             adminpassword[i]=adminpassword1[i];
  681.           }
  682.           cc(0x2400); // 擦除第 3 個扇區
  683.       for(i=0;i<6;i++)
  684.           {
  685.             xcx(0x2400+i,adminpassword[i]);  // 對 EEPROM區 2400h 寫入
  686.           }
  687.           EA=1;
  688.           clr_screen();
  689.           lcd_pos(2,0);            
  690.       for(i=0;i<16;i++)
  691.       {
  692.         lcd_wdat(DIS20[i]);      
  693.       }
  694.           delay(1000);
  695.           out=1;
  696.         }
  697.   }
  698.   for(i=0;i<6;i++)
  699.   {
  700.     adminpassword1[i]=0;                                                //將密碼1寄存器置零
  701.   }
  702.   clr_screen();
  703. }

  704. //修改密碼
  705. void HSpassword()
  706. {
  707.   uchar i=0;
  708.   x=0;
  709.   out=0;
  710.   h=0;
  711.   clr_screen();
  712.   
  713.   while(out==0)
  714.   {
  715.     lcd_pos(1,0);             //請輸入新密碼
  716.     for(i=0;i<16;i++)
  717.     {
  718.       lcd_wdat(DIS18[i]);
  719.     }
  720.         HSjzaj();
  721.         lcd_pos(2,0);            
  722.     for(i=0;i<6;i++)
  723.     {
  724.       lcd_wdat(password1[i]+0x30);                                 
  725.     }
  726.         lcd_pos(3,0);            
  727.     for(i=0;i<16;i++)
  728.     {
  729.       lcd_wdat(DIS19[i]);
  730.       delay(0);
  731.     }
  732.         if(x==1)
  733.         {
  734.           for(i=0;i<6;i++)
  735.           {
  736.             password[i]=password1[i];
  737.           }
  738.           cc(0x2200); // 擦除第 2 個扇區
  739.       for(i=0;i<6;i++)
  740.           {
  741.             xcx(0x2200+i,password[i]);  // 對 EEPROM區 2200h 寫入
  742.           }
  743.           EA=1;
  744.           clr_screen();
  745.           lcd_pos(2,0);            
  746.       for(i=0;i<16;i++)
  747.       {
  748.         lcd_wdat(DIS20[i]);        
  749.       }
  750.           delay(1000);
  751.           out=1;
  752.         }
  753.   }
  754.   for(i=0;i<6;i++)
  755.   {
  756.     password1[i]=0;                                                //將密碼1寄存器置零
  757.   }
  758.   clr_screen();
  759. }                        
  760.         
  761. //管理員模式
  762. void HSAdministrators()
  763. {
  764.   uchar i,p=0;
  765.   h=1;  
  766.   clr_screen();                                                                                                                   ///
  767.   while(out==0)
  768.   {
  769.     lcd_pos(2,0);             //請輸入管理密碼
  770.     for(i=0;i<16;i++)
  771.     {
  772.       lcd_wdat(DIS6[i]);
  773.     }
  774.     HSjzaj();
  775.         if(x==1)
  776.         {         
  777.           x=0;
  778.           k=0;         
  779.       for(i=0;i<6;i++)
  780.       {
  781.         if(adminpassword1[i]==adminpassword[i])
  782.             {
  783.               delay(0);
  784.             }
  785.         else
  786.             {
  787.               p=1;
  788.             }
  789.       }
  790.           if(p==0)
  791.       {
  792.         clr_screen();
  793.                 lcd_pos(2,0);            
  794.         for(i=0;i<16;i++)
  795.         {
  796.           lcd_wdat(DIS3[i]);                                   //管理密碼正確         
  797.         }
  798.                 delay(1000);
  799.                 while(out==0)
  800.                 {
  801.                   clr_screen();
  802.                   lcd_pos(1,0);            
  803.           for(i=0;i<16;i++)
  804.           {
  805.             lcd_wdat(DIS7[i]);                                   //添加指紋
  806.             delay(0);
  807.           }
  808.                   lcd_pos(2,0);            
  809.           for(i=0;i<16;i++)
  810.           {
  811.             lcd_wdat(DIS8[i]);                                   //清空指紋
  812.             delay(0);
  813.           }
  814.                   lcd_pos(3,0);            
  815.           for(i=0;i<16;i++)
  816.           {
  817.             lcd_wdat(DIS9[i]);                                   //開鎖密碼
  818.             delay(0);
  819.           }
  820.                   lcd_pos(4,0);            
  821.           for(i=0;i<16;i++)
  822.           {
  823.             lcd_wdat(DIS10[i]);                                   //管理密碼
  824.             delay(0);
  825.           }
  826.                   b='*';
  827.                   HSjzaj();
  828.                   switch(b)
  829.                   {
  830.                     case (0): FPM10A_Add_Fingerprint();break;                                                                //添加指紋
  831.                         case (1): FPM10A_Delete_All_Fingerprint();break;                                                //刪除所有存貯的指紋庫
  832.                         case (2): HSpassword();break;                                                                                        //修改開鎖密碼
  833.                         case (4): HSadminpassword();break;                                                                                //修改管理員密碼
  834.                   }
  835.                 }
  836.           }
  837.       else
  838.       {
  839.         clr_screen();
  840.             lcd_pos(2,0);            
  841.         for(i=0;i<16;i++)
  842.         {
  843.           lcd_wdat(DIS14[i]);                                  //管理密碼錯誤         
  844.         }
  845.                 delay(1000);
  846.       }
  847.           for(i=0;i<6;i++)
  848.       {
  849.         adminpassword1[i]=0;                                                //將密碼1寄存器置零
  850.       }
  851.           clr_screen();
  852.     }
  853.   }
  854. }

  855. void kaisuo()
  856. {
  857.   kai=0;
  858.   kai1=0;
  859.   kai2=0;
  860.   delay(3000);
  861.   kai=1;
  862.   kai1=1;
  863.   kai2=1;
  864. }



  865. /*********************************************************
  866. *                                                        *
  867. * 主函數                                                 *
  868. *                                                        *
  869. *********************************************************/
  870. void main()
  871. {
  872.    uchar i;                                                                                                                                          ///
  873.    delay(100);                 //上電,等待穩定
  874.    lcd_init();                                  //初始化LCD
  875.    Uart_Init();                            //串口初始化
  876.    finger_id = dcx(0x2002);  // 開機讀取 EEPROM區 2002h 數據 ,還原關電前                    
  877.    while(1)
  878.    {
  879.      for(i=0;i<6;i++)
  880.      {
  881.        adminpassword[i]=dcx(0x2400+i);                                        //從6個扇區取出6位管理員密碼
  882.            password[i]=dcx(0x2200+i);                                                //從6個扇區取出6位開門密碼
  883.      }         
  884.          out=0;
  885.          lcd_pos(2,0);             //歡迎使用
  886.      for(i=0;i<16;i++)
  887.      {
  888.        lcd_wdat(DIS1[i]);
  889.      }
  890.          lcd_pos(3,0);             //云部落指紋鎖
  891.      for(i=0;i<16;i++)
  892.      {
  893.        lcd_wdat(DIS2[i]);
  894.      }
  895.          FPM10A_Find_Fingerprint();                 //對比指紋(重點)
  896.          HSjzaj();                                                                        //矩陣鍵盤輸入
  897.          if(x==1)                                                                        //“確認”標志位,按下進行輸入密碼后對比
  898.          {
  899.            x=0;
  900.            h=0;
  901.            confirm();
  902.            k=0;
  903.          }
  904.          if(Administrators==1)                                                //“管理員模式”標志位,按下進行管理員模式
  905.          {
  906.            Administrators=0;
  907.            HSAdministrators();
  908.          }
  909.          if(reset1==1)                                                                //“復位”標志位,按下后管理員密碼和開門密碼還原
  910.          {
  911.            clr_screen();
  912.            reset1=0;
  913.            wolegequ();
  914.            lcd_pos(3,0);            
  915.        for(i=0;i<16;i++)
  916.        {
  917.          lcd_wdat(DIS21[i]);
  918.        }
  919.            delay(1000);
  920.            clr_screen();
  921. ……………………

  922. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
成品2.zip (67.4 KB, 下載次數: 983)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:434175 發表于 2018-12-6 15:23 | 只看該作者
老哥老哥有原理圖嗎麻煩一下,我下了沒有原理圖不知道怎么接線。
回復

使用道具 舉報

板凳
ID:247778 發表于 2018-12-7 19:41 | 只看該作者
wxddxw111 發表于 2018-12-6 15:23
老哥老哥有原理圖嗎麻煩一下,我下了沒有原理圖不知道怎么接線。

程序里有注釋呀,AS608接P3.0和P3.1就行注意反接(3.3V供電),12864按程序里的分配接就行
回復

使用道具 舉報

地板
ID:144634 發表于 2018-12-11 14:11 | 只看該作者
老哥,請問下這個指紋模塊具體是怎么使用的呢?萌新第一次搞這種模塊不太認識。十分感謝!!
回復

使用道具 舉報

5#
ID:247778 發表于 2018-12-23 16:31 | 只看該作者
Johnny·JH 發表于 2018-12-11 14:11
老哥,請問下這個指紋模塊具體是怎么使用的呢?萌新第一次搞這種模塊不太認識。十分感謝!!

主要是串口調試,你先別管硬件,先捋一遍程序
回復

使用道具 舉報

6#
ID:265598 發表于 2018-12-25 13:08 | 只看該作者
老哥,你這個指紋模塊,單片機晶振用12M還是11.059M的?
回復

使用道具 舉報

7#
ID:413080 發表于 2019-1-3 20:55 來自手機 | 只看該作者
請問12864是帶字符的嗎?有沒有仿真圖
回復

使用道具 舉報

8#
ID:247778 發表于 2019-2-17 20:01 | 只看該作者
布魯斯。。。 發表于 2018-12-25 13:08
老哥,你這個指紋模塊,單片機晶振用12M還是11.059M的?

11.0592
回復

使用道具 舉報

9#
ID:247778 發表于 2019-2-17 20:02 | 只看該作者
1337173140 發表于 2019-1-3 20:55
請問12864是帶字符的嗎?有沒有仿真圖

帶字庫,沒有
回復

使用道具 舉報

10#
ID:247778 發表于 2019-3-13 20:32 | 只看該作者
77621516 發表于 2019-2-26 14:35
給個原理圖可以嗎,實在不會接線

程序初始化那塊有各個引腳的位定義,指紋模塊和串口反接就行
回復

使用道具 舉報

11#
ID:488047 發表于 2019-3-15 10:11 | 只看該作者
好東西,學習一下,謝謝!
回復

使用道具 舉報

12#
ID:435174 發表于 2019-3-17 09:39 | 只看該作者
畫塊底板和PCB吧,杜邦線看著我都替你慌
回復

使用道具 舉報

13#
ID:485674 發表于 2019-3-28 23:12 | 只看該作者
受益匪淺,感謝樓主
回復

使用道具 舉報

14#
ID:486097 發表于 2019-3-29 11:07 | 只看該作者
請問有沒有PCB電路原理圖呀
回復

使用道具 舉報

15#
ID:507630 發表于 2019-4-10 11:42 | 只看該作者
電磁鎖在哪買的,可以發下鏈接嗎?我一直找不到合適的
回復

使用道具 舉報

16#
ID:473121 發表于 2019-4-11 18:56 | 只看該作者
怎么獲取
回復

使用道具 舉報

17#
ID:508348 發表于 2019-4-12 01:07 | 只看該作者
想問一下 指紋模塊和pc能通訊 還可以獲得指紋 但是和單片機就通訊不了  這個問題出在哪里 應該怎么調試 希望樓主能給與指導 十分感激
回復

使用道具 舉報

18#
ID:247778 發表于 2019-4-12 17:38 | 只看該作者
zappp 發表于 2019-4-12 01:07
想問一下 指紋模塊和pc能通訊 還可以獲得指紋 但是和單片機就通訊不了  這個問題出在哪里 應該怎么調試 希 ...

看看AS608的通信協議,各個寄存器配置好,單片機串口配置好就行,你看看我的初始化流程
回復

使用道具 舉報

19#
ID:458662 發表于 2019-4-20 20:39 來自手機 | 只看該作者
你好,不是還要發送口令嗎?怎么你只要發送包頭而且還不要接收模塊發送過來的對比信息。
回復

使用道具 舉報

20#
ID:520900 發表于 2019-5-8 16:32 | 只看該作者
77621516 發表于 2019-2-28 21:48
AS608的WAK引腳接那里?

所以接在哪里解決了嗎類似課題能否+QQ1690474716探討探討
回復

使用道具 舉報

21#
ID:442414 發表于 2019-5-8 17:40 | 只看該作者
點贊!佩服佩服
回復

使用道具 舉報

22#
ID:564892 發表于 2019-6-17 20:04 | 只看該作者
本帖最后由 wojiaolisen.123 于 2019-6-17 21:02 編輯

你好請問顯示屏只能用12864的嗎,用別的是不是得修改程序
回復

使用道具 舉報

23#
ID:564892 發表于 2019-6-17 20:08 | 只看該作者
大神問一下那個只能用12864嗎,用別的是不是得修改程序
回復

使用道具 舉報

24#
ID:564892 發表于 2019-6-17 20:55 | 只看該作者
這個程序的矩陣用的是哪個接口,是p10-p17還是什么。
回復

使用道具 舉報

25#
ID:304358 發表于 2019-6-18 09:18 來自手機 | 只看該作者
可以記錄一下開門人員和時間嗎?拓展一下更好。
回復

使用道具 舉報

26#
ID:564892 發表于 2019-6-18 10:15 來自手機 | 只看該作者
我想問一下如果不用顯示屏和密碼解鎖怎么改程序
回復

使用道具 舉報

27#
ID:355082 發表于 2019-6-21 14:04 | 只看該作者
矩陣插接沒有反應啊
回復

使用道具 舉報

28#
ID:430746 發表于 2019-7-9 13:19 | 只看該作者
樓主有接線圖嗎?可以用LCD1602碼
回復

使用道具 舉報

29#
ID:473471 發表于 2019-7-21 22:22 | 只看該作者
謝謝樓主。好資料,踩一腳下次來取!
回復

使用道具 舉報

30#
ID:399179 發表于 2019-7-22 21:00 來自手機 | 只看該作者
樓主能不能給個原理圖啊?
回復

使用道具 舉報

31#
ID:128880 發表于 2019-7-31 14:01 | 只看該作者
剛好要學習這個 謝謝分享
回復

使用道具 舉報

32#
ID:74382 發表于 2019-8-23 15:43 | 只看該作者
矩陣插接在哪里呀。沒有注解
回復

使用道具 舉報

33#
ID:342975 發表于 2019-9-10 16:02 | 只看該作者
借鑒學習
回復

使用道具 舉報

34#
ID:613538 發表于 2019-9-19 13:56 | 只看該作者
學習學習 謝謝樓主
回復

使用道具 舉報

35#
ID:367428 發表于 2019-10-4 15:18 | 只看該作者
感謝大佬
回復

使用道具 舉報

36#
ID:611643 發表于 2019-10-8 21:32 | 只看該作者
您好,我問一下能給一下那個繼電器哪里的接線圖嗎?特別想學習一下
回復

使用道具 舉報

37#
ID:676417 發表于 2019-12-30 11:05 來自手機 | 只看該作者
不錯,研究中,感謝分享
回復

使用道具 舉報

38#
ID:380068 發表于 2020-1-22 23:09 | 只看該作者
源碼編譯報錯
回復

使用道具 舉報

39#
ID:380068 發表于 2020-1-22 23:10 | 只看該作者
下載完編譯失敗
回復

使用道具 舉報

40#
ID:208271 發表于 2020-1-23 16:00 | 只看該作者
a2569808500 發表于 2019-3-13 20:32
程序初始化那塊有各個引腳的位定義,指紋模塊和串口反接就行

51單片機需要串口通信時,晶振頻率一般選擇11.0592Mhz,這樣波特率算出來才是整數倍,通信才準確,如果用12MHZ的話,可能會出錯。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情视频 | 丁香一区二区 | 中文字幕在线看第二 | 精品视频一区二区三区在线观看 | 国产精品视频一区二区三 | 日韩黄a | 国产精品久久久久久吹潮日韩动画 | 一区二区三区视频 | 在线观看亚洲专区 | 欧美一区二区三区在线看 | 国产在线区 | 国产在线观看一区二区三区 | 中文字幕在线观看精品 | 九九热在线免费观看 | 欧美视频在线观看 | 一区二区日本 | 欧美日韩中文在线 | 亚洲精选一区二区 | 一区二区在线观看免费视频 | 国产精品一区二区视频 | 亚洲国产成人精品久久久国产成人一区 | 91久久久久久久 | 成人小视频在线观看 | 国产精品久久久久久久久久三级 | 国产粉嫩尤物极品99综合精品 | 精品免费观看 | 精品国产91乱码一区二区三区 | 久产久精国产品 | 久久国产精品一区 | 中文字幕第十页 | 欧美不卡一区 | 四虎在线观看 | 羞羞视频在线观看免费观看 | 欧美亚洲国产一区二区三区 | 欧美日韩1区2区3区 欧美久久一区 | 成人片免费看 | 亚洲a人 | 日韩成人精品一区 | 久久久久久九九九九 | 激情一区二区三区 | 成人国产精品免费观看 |