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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3236|回復: 0
收起左側

基于avr單片機的ZAZ-010指紋識別電子密碼鎖設計資料

[復制鏈接]
ID:823420 發表于 2020-12-18 09:54 | 顯示全部樓層 |閱讀模式
本設計開發了一款基于單片機的指紋識別電子密碼鎖系統。該系統以ATmeg16單片機作為模塊核心,通過串口通信控制ZAZ-010指紋模塊實現錄取指紋并存儲指紋數據,并通過HS12864-15C液晶顯示比對流程及比對結果,輔以直流繼電器與發光二極管模擬開鎖的動作。本系統具有體積小、性價比高、傳輸速度快、適合家庭及單位使用。

程序的巡檢過程: 首先對各模塊進行初始化,檢測在有無按鍵按下,如果按下判斷是那一個按鍵,并作出判斷是否調用相應子程序;當按鍵1按下后,調用通信模塊子程序,錄入指紋并將其存入模塊緩沖區,同理當按鍵2按下后,效果相同。
依次當按鍵3按下時,將指紋模塊兩緩沖區中的指紋特征文件合成特征模板并存儲與指紋模板庫中,當4按鍵按下后搜索指紋并比對.當指紋模塊中有指紋存儲時直接按4鍵同樣也可進行比對。
程序關鍵的就是對指紋模塊的通信控制, 考慮到處理過程太過冗長,限于篇幅只能將其省略,如需查看,可以看附錄1。其它命令發送子函數因大部分的命令大體格式基本相同。

51hei.png

液晶鍵盤測試程序見附錄2:
液晶鍵盤測試程序結果如圖 4-3所示:
51hei.png
  1. #include<avr/io.h>
  2. #include<util/delay.h>
  3. //#include<avr/pgmspace.h>                 
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define key1 0x01
  7. #define key2 0x02
  8. #define key3 0x04
  9. #define key4 0x08
  10. static uchar k=0;
  11. uchar name00[]={"                "};
  12. uchar name01[]={"    歡迎使用    "};
  13. uchar name02[]={"單片機指紋密碼鎖"};
  14. uchar name03[]={"                "};
  15. uchar name04[]={"  指紋采集開始  "};
  16. uchar name05[]={"  指紋對比開始  "};
  17. uchar name06[]={"  指紋存儲開始  "};
  18. uchar name07[]={"    一次采集    "};
  19. uchar name08[]={"    二次采集    "};
  20. uchar name09[]={"    錄入成功    "};
  21. uchar name10[]={"    錄入失敗    "};
  22. uchar name11[]={"    收包有錯    "};
  23. uchar name12[]={"傳感器上無手指  "};
  24. uchar name13[]={"  生成特征成功  "};
  25. uchar name14[]={"圖想亂生不成特征"};
  26. uchar name15[]={"圖象正常特征點少"};
  27. uchar name16[]={"指紋模板合并成功"};
  28. uchar name17[]={"指紋模板合并失敗"};
  29. uchar name18[]={"  非同一手指    "};
  30. uchar name19[]={"    存儲成功    "};
  31. uchar name20[]={"  寫指紋庫出錯  "};
  32. uchar name21[]={"    指紋匹配    "};
  33. uchar name22[]={"  指紋不匹配    "};
  34. uchar name23[]={"    密碼正確    "};
  35. uchar name24[]={"    密碼不正確    "};
  36. uchar FP_1[6]={};
  37. uchar FP_2[6]={};
  38. uchar FP_Pack_Head[6]={0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
  39. uchar FP_Get_Img[6]={0x01,0x00,0x03,0x01,0x0,0x05};    //獲得指紋圖像
  40. uchar FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21}; //搜索0-9號指紋
  41. uchar FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; //將圖像放入到BUFFER1
  42. uchar FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; //將圖像放入到BUFFER2
  43. uchar FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09}; //將BUFFER1跟BUFFER2合成特征模版
  44. volatile uchar  FP_Save_Finger1[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置
  45. volatile uchar  FP_Save_Finger2[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0C,0x00,0x1A};//將BUFFER1中的特征碼存放到指定的位置
  46. volatile uchar  FP_Save_Finger3[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0D,0x00,0x1B};//將BUFFER1中的特征碼存放到指定的位置
  47. uchar yb=0x80;
  48. //初始化 UART 子程序
  49. void UART_Init(void)
  50. {
  51.     UCSRB  =  0x00;     //disable while setting baud rate
  52.     UCSRA  =  0x00;     //Bit1為1則倍速發送
  53.     UCSRC  =  0x06;     //傳送一楨數據位為8位
  54.     UBRRL  =  0x07;     //波特率:57600 Bps
  55.     UBRRH  =  0x00;     //誤差率:0.000%
  56.     UCSRB  =  0x18;     
  57. }
  58. //發送八位數據
  59. void UART_Send_Byte( uchar ucData)

  60. {
  61.   while(!(UCSRA&(1<<UDRE))); //等待緩沖區為空
  62.   UDR = ucData;
  63. }

  64. //接收八位數據
  65. uchar  UART_Receive_Byte(void)
  66. {

  67.   while(!(UCSRA&(1<<RXC)));//等待緩沖區為空
  68.    
  69. return UDR;
  70. }
  71. //_獲得指紋圖像命令
  72. void Cmd_Get_Img(void)
  73. {
  74.     uchar i,j;
  75.     for(i=0;i<6;i++) //發送包頭與模塊地址
  76.     UART_Send_Byte(FP_Pack_Head[i]);
  77.     for(i=0;i<6;i++) //發送命令 0x1d
  78.     UART_Send_Byte(FP_Get_Img[i]);
  79.     for(i=0;i<6;i++)
  80.     FP_1[i]=UART_Receive_Byte();
  81.         for(i=0;i<6;i++)
  82.     FP_2[i]=UART_Receive_Byte();
  83.     j=FP_2[3];
  84.    if (j==0x00)
  85.   {_delay_ms(100000);
  86.    reset ();
  87.    display6();}
  88.    if (j==0x01)
  89.    {reset();
  90.     wr_com(yb);
  91.    outChinese(0x90,8,name11);}
  92.    if (j==0x02)
  93.    {_delay_ms(100000);
  94.     reset();
  95.     display7();}
  96.         if (j==0x03)
  97.    { reset();
  98.     wr_com(yb);
  99.    outChinese(0x90,8,name10);}
  100. }
  101. //講圖像轉換成特征碼存放在Buffer1中
  102. void Cmd_Img_To_Buffer1(void)
  103. {
  104.                 uchar i,j;
  105.                for(i=0;i<6;i++)    //發送包頭與模塊地址
  106.                  {
  107.                    UART_Send_Byte(FP_Pack_Head[i]);   
  108.                         }
  109.            
  110.                         for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  111.              {
  112.                          UART_Send_Byte(FP_Img_To_Buffer1[i]);
  113.                         }
  114.             for(i=0;i<6;i++)
  115.             {
  116.                         FP_1[i]=UART_Receive_Byte();}
  117.                         for(i=0;i<6;i++)
  118.           {
  119.                     FP_2[i]=UART_Receive_Byte();}
  120.            j=FP_2[3];
  121.          if (j==0x00)
  122.     {_delay_ms(100000);
  123.       reset ();
  124.       display8();}
  125.            if (j==0x06)
  126.           {_delay_ms(100000);
  127.       reset ();
  128.       display9();}
  129.           if (j==0x07)
  130.           {_delay_ms(100000);
  131.       reset ();
  132.       display10();}
  133. }
  134. //將圖像轉換成特征碼存放在Buffer2中
  135. void Cmd_Img_To_Buffer2(void)
  136. {
  137.            uchar i,j;
  138.            for(i=0;i<6;i++)    //發送包頭
  139.                  {
  140.                    UART_Send_Byte(FP_Pack_Head[i]);   
  141.                         }
  142.            
  143.                       for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer2
  144.              {
  145.                          UART_Send_Byte(FP_Img_To_Buffer2[i]);
  146.                         }
  147.             for(i=0;i<6;i++)
  148.            {
  149.                         FP_1[i]=UART_Receive_Byte();}
  150.                         for(i=0;i<6;i++)
  151.           {
  152.                     FP_2[i]=UART_Receive_Byte();}  
  153.                   j=FP_2[3];
  154.          if (j==0x00)
  155.     {_delay_ms(100000);
  156.       reset ();
  157.       display8();}
  158.            if (j==0x06)
  159.           {_delay_ms(100000);
  160.       reset ();
  161.       display9();}
  162.           if (j==0x07)
  163.           {_delay_ms(100000);
  164.       reset ();
  165.       display10();}

  166. }

  167. //將BUFFER1 跟 BUFFER2 中的特征碼合并成指紋模版
  168. void Cmd_Reg_Model(void)
  169. {
  170.     uchar i,j;
  171.     for(i=0;i<6;i++) //發送包頭與模塊地址
  172.     {
  173.       UART_Send_Byte(FP_Pack_Head[i]);   
  174.     }

  175.     for(i=0;i<6;i++) //命令合并指紋模版
  176.     {
  177.       UART_Send_Byte(FP_Reg_Model[i]);   
  178.     }
  179.     for(i=0;i<6;i++)
  180.            {
  181.                         FP_1[i]=UART_Receive_Byte();}
  182.         for(i=0;i<6;i++)
  183.           {
  184.                     FP_2[i]=UART_Receive_Byte(); }
  185.                   j=FP_2[3];
  186. if (j==0x00)
  187. {_delay_ms(400000);
  188.       reset ();
  189.       display11();}
  190. if (j==0x0a)
  191. {_delay_ms(400000);
  192.       reset ();
  193.       display12();
  194.            while(1);}





  195. }
  196. //將并成后的指紋模版存儲到指紋模塊flash模板庫中
  197. void  Store_Char_Model(void)
  198. {   uchar i,j;
  199.     for(i=0;i<6;i++) //發送包頭與模塊地址
  200.     {
  201.       UART_Send_Byte(FP_Pack_Head[i]);   
  202.     }
  203.    if(k==0)
  204.   { for(i=0;i<9;i++) //命令存儲指紋模版
  205.     {
  206.       UART_Send_Byte( FP_Save_Finger1[i]  );
  207.        }
  208.     }
  209.         if(k==1)
  210.    { for(i=0;i<9;i++) //命令存儲指紋模版
  211.     {
  212.       UART_Send_Byte( FP_Save_Finger2[i]  );
  213.         }
  214.     }
  215.         if(k==2)
  216.    { for(i=0;i<9;i++) //命令存儲指紋模版
  217.     {
  218.       UART_Send_Byte( FP_Save_Finger3[i]  );
  219.   
  220.        }
  221.         }


  222.     for(i=0;i<6;i++)
  223.           {
  224.                         FP_1[i]=UART_Receive_Byte();}
  225.         for(i=0;i<6;i++)
  226.           {
  227.                     FP_2[i]=UART_Receive_Byte(); }
  228.                   j=FP_2[3];

  229. if(j==0x00)
  230. {_delay_ms(400000);
  231.       reset ();
  232.       display13();}
  233. if(j==0x18)

  234. {_delay_ms(300000);
  235.       reset ();
  236.       display14();}





  237. }



  238. //搜索與BUFFER1中特征碼相符合的指紋模版
  239. void  search_Char_Mode(void)   
  240. {   uchar i,j;
  241.     for(i=0;i<6;i++) //發送包頭與模塊地址
  242.     {
  243.       UART_Send_Byte(FP_Pack_Head[i]);   
  244.     }
  245.     for(i=0;i<11;i++) //命令搜索指紋模版
  246.     {
  247.       UART_Send_Byte(FP_Search_0_9[i]);
  248.   
  249.     }
  250. for(i=0;i<6;i++)
  251.            {
  252.                         FP_1[i]=UART_Receive_Byte();}
  253.         for(i=0;i<10;i++)
  254.           {
  255.                     FP_2[i]=UART_Receive_Byte(); }
  256.                   j=FP_2[3];
  257. if(j==0x00)
  258. {_delay_ms(100000);
  259.       reset ();
  260.       display15();}

  261. if(j==0x09)
  262. {_delay_ms(100000);
  263.       reset ();
  264.       display16();}


  265. void keyboard( void)
  266. {  unsigned char Keyvalue;//鍵盤值
  267. //端口初始化
  268. DDRC=~_BV(PC0)& ~_BV(PC1)& ~_BV(PC2)& ~_BV(PC3);
  269. while(1)
  270. {  Keyvalue=(PINC&0x0F);
  271. if (Keyvalue!=0x0f)
  272. {//有鍵按下
  273. _delay_ms(20);
  274. Keyvalue=(PINC&0x0F);
  275. if (Keyvalue==0X0F)
  276.   break;//如果延時去抖后,沒有檢測到鍵按下,退出本次循環
  277. //如果有按鍵
  278. if(! (Keyvalue& key1))
  279. {reset ();
  280. display2();
  281. UART_Init();
  282. Cmd_Get_Img();
  283. Cmd_Img_To_Buffer1();
  284. }//按鍵1的處理部分
  285. if(! (Keyvalue& key2))
  286. { reset ();
  287.   display3();
  288. UART_Init();
  289. Cmd_Get_Img();
  290. Cmd_Img_To_Buffer2();
  291. }//按鍵2的處理部分
  292. if(! (Keyvalue& key3))
  293. { reset ();
  294. display4();
  295. UART_Init();

  296. Cmd_Reg_Model();
  297. Store_Char_Model();
  298. k++;         }//按鍵3的處理部分
  299. if(! (Keyvalue& key4))
  300. { reset ();
  301. display5();
  302. UART_Init();
  303. Cmd_Get_Img();
  304. Cmd_Img_To_Buffer1();
  305. search_Char_Mode();


  306.           }//按鍵4的處理部分
  307.        }
  308. _delay_ms(20);

  309.      }
  310. }

  311. void check_busy (void)                  //讀取忙碌狀態
  312. {
  313.   DDRA=0;
  314.   PORTA=0xff;
  315.   PORTB&=0xfb;                          //RS=0
  316.   PORTB|=0x02;                          //RW=1;
  317.   PORTB|=0x01;PORTB|=0x01;              //E=1;
  318.   while((PINA&0x80)==0x80);
  319.   PORTB&=0xfe;
  320.                                         //E =0;
  321. }

  322. void wr_com(unsigned char value)        //寫指令,寫指令時必須為RS=0;RW=0;
  323. {check_busy();
  324. PORTB&=0xfe;                           //E=0;
  325. PORTB&=0xfb;                           //RS=0
  326. PORTB&=0xfd;                           //RW=0;
  327. DDRA=0xff;
  328. PORTA=value;
  329. PORTB|=0x01;                           //E=1;
  330. _delay_us(20);                          //如果沒有延時就必須要加查忙指令
  331. PORTB&=0xfe;
  332. DDRA=0x00;                            //E=0;
  333. }

  334. void wr_data(unsigned char sj)          //寫數據,寫數據時必須為 RS=1;RW=0;
  335. {check_busy();
  336. PORTB&=0xfe;                           //E=0;
  337. PORTB|=0x04;                           //RS=1;
  338. PORTB&=0xfd;                           //RW=0;
  339. DDRA=0xff;
  340. PORTA=sj;
  341. PORTB|=0x01;                           //E=1;
  342. _delay_us(20);                          //如果沒有延時就必須要加查忙指令
  343. PORTB&=0xfe;
  344. DDRA=0x00;                            ////E=0;
  345. }

  346. void reset (void)
  347. {
  348. wr_com(0x01);//清屏
  349. wr_com(0x08);//關顯示
  350. wr_com(0x03);//歸位
  351. wr_com(0x30);//功能設置
  352. wr_com(0x0f);//開顯示
  353. wr_com(0x01);//清屏
  354. }
  355. //******************************************************************/
  356. //outChinese 為函數名
  357. //place 為顯示地址的首地址
  358. //unit  字符長度
  359. //charcode[]  要顯示數據的內容
  360. void outChinese(unsigned char place,unsigned char unit,unsigned char charcode[] )
  361. {
  362. unsigned char i;
  363. wr_com(place);
  364. for(i=0;i<unit*2;i++)//一個漢字為兩個字符
  365. wr_data(charcode[i]);
  366. }
  367. void display1(void)
  368. {wr_com(yb);
  369. //ydgb();
  370. outChinese(0x80,8,name00);//第一行:80-87H
  371. outChinese(0x90,8,name01);//第二行:90-97H
  372. outChinese(0x88,8,name02);//第三行:88-8FH
  373. outChinese(0x98,8,name03);//第四行:98-9FH

  374. }
復制代碼
以上的Word格式文檔51黑下載地址:
設計文檔.doc (1.27 MB, 下載次數: 14)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产午夜 | 欧美色视频免费 | 久草影视在线 | 国产精品毛片一区二区三区 | 国产精品一区在线 | 国产精品毛片一区二区在线看 | 精品真实国产乱文在线 | 一级大片网站 | 天天插天天操 | 美国av片在线观看 | 午夜在线精品 | 欧美午夜影院 | 日日摸夜夜添夜夜添特色大片 | 精品久久视频 | 中文字幕国产一区 | 久久精品亚洲国产奇米99 | 91正在播放 | 久久在看 | www久久| 综合九九 | 91精品国产欧美一区二区 | 黄网站免费入口 | 日本电影韩国电影免费观看 | 91精品国产综合久久香蕉麻豆 | 中文字幕 欧美 日韩 | 精品视频一区二区三区 | 久久久久久久一区 | 国产成人av一区二区三区 | 亚洲成人精品一区 | 亚洲一区欧美一区 | 四色永久| 欧美一级片在线看 | 一区二区在线观看av | 欧美日韩高清一区二区三区 | 99精品一区二区三区 | 色永久| 欧美日韩一区二区在线观看 | 亚洲精品日韩综合观看成人91 | 中国黄色在线视频 | 欧美日韩网站 | 久久国产精品视频免费看 |