国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

51單片機AS608指紋密碼鎖C程序源碼+原理圖+PCB文件

[復制鏈接]
樓主
eng 發表于 2021-6-13 02:54:18 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
這是一個基于AS608+STC89C52單片機的指紋識別和鍵盤密碼鎖。本文尾部有完成c語言程序,原理圖,pcb文件附件。
51單片機AS608指紋密碼鎖C程序源碼+原理圖+PCB文件 3.png
原理圖截圖:
51單片機AS608指紋密碼鎖C程序源碼+原理圖+PCB文件 2.png
pcb文件截圖:
51單片機AS608指紋密碼鎖C程序源碼+原理圖+PCB文件 1.png
部分源碼:
  1. /*********************************************************
  2. 函數名稱:bit Command(uchar *p,uchar MaxTime)
  3. 函數作用:命令解析,給模塊發送一個命令
  4. 參數說明:*p指令,MaxTime延時時長
  5. *********************************************************/
  6. bit Command(u8 *p,u8 MaxTime)
  7. {
  8.           u8 count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
  9.                  
  10.         bit result=0, start=0,stop=0;

  11.           UART_send_char(0xef);//數據包包頭識別碼
  12.            UART_send_char(0x01);//數據包包頭識別碼
  13.           i=p[0];//數組的第“0”個元素、里面存放了本數組的長度,把這個長度給變量i,方便進行操作

  14.         for(count=2; count<i;count++)//發送數據包
  15.             UART_send_char(p[count]);       //將數據發送出去
  16.          
  17.           result=TURE; //發送完成,結果為真 (真為1)         
  18.           FifoNumber=0;//清除接收的數據個數
  19.         for(count=0;count<=MAX_NUMBER;count++)//清空所有FIFO[]數組里面的內容,寫入0X00
  20.                  FIFO[count]=0x00;
  21.           if(result)   
  22.            {               
  23.              result=FALSE;
  24.               start =FALSE;
  25.                    stop  =FALSE;
  26.                count=0;
  27.                clk0=0;        //清零CL0計數
  28.                
  29.      do /////////////////////////////do的內容////////////////////////////////
  30.                 {      
  31.                         restart0:                              
  32.                  if (RI==1)//如果接收到數據
  33.                       {                                
  34.                                   tmpdat=SBUF;//先把接收到的數據放到tmpdat中
  35.                     RI=0;                //軟件清除接收標志
  36.                     if((tmpdat==0xef)&&(start==FALSE))//這個數據為第一個傳回來的數據,也就是“指令應答”的第一個字節
  37.                     {
  38.                                         count=0;
  39.                                     FIFO[0]=tmpdat;//讀入第一個應答字節(0XEF),存在第“0”個元素中   
  40.                                         flag=1;      
  41.                                         goto
  42.                                                 restart0;//可以用中斷方式進行                       
  43.                               
  44.                      }
  45.                                 if(flag==1)//第一個字節已經回來,所以flag==1成立
  46.                                 {  
  47.                                         if(tmpdat!=0x01)//接收數據錯誤,將重新從緩沖區接收數據
  48.                                         {         
  49.                                                 flag=0;//接收應答失敗
  50.                                                 result=FALSE;
  51.                                               start =FALSE;
  52.                                                    stop=FALSE;
  53.                                                count=0;
  54.                                                 goto
  55.                                                         restart0;                                       
  56.                                         }
  57.                                         //如果成功接收到0xef01,可以開始接收數據
  58.                                         flag=2;//flag=2;表示應答成功,可以開始接收數據了
  59.                                         count++;//現在count=1;
  60.                                         FIFO[count]=tmpdat;//讀入第二個應答字節(0X01),存在第“1”個元素中   
  61.                                         start=TURE;        //應答成功可以開始接收數據
  62.                                             goto
  63.                                                         restart0;      
  64.                                 }                  
  65.                      if((flag==2)&&(start==TURE))//flag=2;表示應答成功,可以開始接收數據了
  66.                      {                                                              
  67.                                            count++;//數據元素下標++
  68.                             FIFO[count]=tmpdat;//存入數據
  69.                                         if(count>=6)
  70.                                         {
  71.                                                 checksum=FIFO[count]+checksum;//計算校驗和
  72.                                         }
  73.                                         if(count==8)
  74.                                         {
  75.                                                 package=FIFO[7]*0X100+FIFO[8];//計算包長度                                                      
  76.                                                 stop= TURE;
  77.                                         }
  78.                                         if(stop)
  79.                                         {                                               
  80.                                                 if(count==package+8)
  81.                                                 {
  82.                                                         checksum=checksum-FIFO[count-1] - FIFO[count];
  83.                                                         if(checksum != (FIFO[count]&0xff))  
  84.                                                                 result=FALSE; //校驗失敗,置結果標志為0                                                      
  85.                                                         else
  86.                                                                 result=TURE;
  87.                                                         flag=0;
  88.                                                         break;
  89.                                                 }
  90.                                         }
  91.                      }
  92.                        }
  93.                 }
  94.                 while((clk0<=MaxTime)&&(count<=MAX_NUMBER));//由定時器以及最大接收數據來控制,保證不會在此一直循環
  95.                
  96.                 FifoNumber=count;//保存接收到的數據個數
  97.         }
  98.         return (result);//返回操作是否成功
  99. }

  100. /*********************************************************
  101. 函數名稱:uchar ImgProcess(uchar BUFID)
  102. 函數作用:發獲取圖像并生成特征文件,存入BUFID中
  103. 參數說明:BUFID為緩沖區號
  104. *********************************************************/
  105. u8 ImgProcess(u8 BUFID)
  106. {      
  107.     if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功  
  108.     {
  109.                 if(BUFID==1)     //生成指紋特征1      
  110.                 {                                 
  111.                       if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功                                                
  112.                                 return 1;
  113.                 else
  114.                                   return 0;
  115.                  }
  116.                 else if(BUFID==2)//生成指紋特征2
  117.                 {
  118.                           if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功                        
  119.                                 return 1;
  120.                 else
  121.                                   return 0;               
  122.                 }
  123.     }
  124.     else
  125.         return 0;  

  126.         return 0;            
  127. }
  128. /*********************************************************
  129. 函數名稱:uchar search()
  130. 函數作用:搜索指紋
  131. 參數說明:返回指紋序號
  132. *********************************************************/
  133. u8 search()
  134. {
  135.         u8 SearchBuf=0;

  136.         if (ImgProcess(1)==1)//首先讀入一次指紋  
  137.            {
  138.                 if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00))//進行指紋比對,如果搜索到,返回搜索到的指紋序號
  139.                         return FIFO[10]*0x100+FIFO[11];
  140.                 else
  141.                         return 255;            
  142.            }
  143.    return 0;
  144. }

  145. /*********************************************************
  146. 函數名稱:bit savefingure(uchar ID)
  147. 函數作用:保存指紋
  148. 參數說明:指定保存的序號
  149. *********************************************************/
  150. bit savefingure(u8 ID)
  151. {
  152.         u8 i;
  153.         //現在開始進行存儲指紋模板的操作
  154.         for (i=0;i<16;i++)            //獲取保存指紋信息指令
  155.         {
  156.                 FIFO[i]=STOR[i];
  157.         }  
  158.         FIFO[12]=ID;            //把指紋模板存放的PAGE_ID也就是FLASH的位置
  159.         FIFO[14]=FIFO[14]+ID;   //重新計算校驗和
  160.       
  161.         if (Command(FIFO,70)==1)//成功返回1        //此處進行存放指紋模板的命令
  162.                 {return(1);}
  163.         else
  164.                 {return(0);}        //不成功返回0
  165. }
  166. /*********************************************************
  167. 函數名稱:bit dellfingure(uchar ID)
  168. 函數作用:刪除指紋
  169. 參數說明:指定序號刪除
  170. *********************************************************/
  171. bit dellfingure(u8 ID)
  172. {
  173.         u8 i;
  174.         //現在開始進行存儲指紋模板的操作
  175.         for (i=0;i<16;i++)            //獲取刪除指紋信息指令
  176.         {
  177.                 FIFO[i]=DELE_one[i];
  178.         }  
  179.         FIFO[11]=ID;            //把指紋模板存放的PAGE_ID也就是FLASH的位置
  180.         FIFO[15]=FIFO[15]+ID;   //重新計算校驗和
  181.       
  182.         if (Command(FIFO,70)==1)//成功返回1//此處進行存放指紋模板的命
  183.                 {return(1);}
  184.         else
  185.                 {return(0);}        //不成功返回0
  186. }
  187. /*********************************************************
  188. 函數名稱:bit Clear_All()
  189. 函數作用:清空指紋庫
  190. 參數說明:返回1成功,返回0失敗
  191. *********************************************************/
  192. bit Clear_All()
  193. {                              
  194.         if(Command(DELE_all,50)==1)
  195.                 return(1);
  196.         else
  197.                 return(0);               
  198. }
  199. /*********************************************************
  200. 函數名稱:uchar enroll()
  201. 函數作用:采集兩次指紋,生成1個指紋模板
  202. 參數說明:
  203. *********************************************************/
  204. u8 enroll()
  205. {
  206.         u8 temp=0,count=0;
  207.           while(1)
  208.           {
  209.                    temp=ImgProcess(1);//生成特征1   
  210.                    if (temp==1)       //生成特征文件成功            
  211.               {                       
  212.                 break;
  213.                }
  214.              else                  
  215.                {
  216.                 if (temp==0)//采集指紋沒有成功
  217.                   {
  218.                                 count++;
  219.                     if (count>=40)//如果采集了40次,還不成功,直接采集失敗,直接退出enroll函數----返回0  
  220.                                         return(0);
  221.             }
  222.         }
  223.            }
  224.         //采集第一個特征成功
  225.            count=0;  
  226.         delay1ms(500);//延時0.5S開始采集下一個特征

  227.         //開始采集第二個特征
  228.         while(1)
  229.           {
  230.                    temp=ImgProcess(2);//生成特征2   
  231.                    if (temp==1)       //生成特征文件2成功
  232.               {
  233.                 if((Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0) //合并不成功返回0,成功返回1
  234.                         {
  235.                                 return 0;
  236.                         }      
  237.                         else//特征文件合并生成模板,結果存于ModelBuffer
  238.                         {
  239.                      return 1;
  240.                         }      
  241.         }
  242.               else      
  243.                {      
  244.                 if (temp==1)//采集指紋沒有成功
  245.                 {
  246.                                 count++;
  247.                               
  248.                                 if (count>=25)
  249.                               
  250.                                 return(0);
  251.                        }
  252.              }
  253.            }
  254. }
復制代碼
pcb和原理圖工程文件.zip (1.09 MB, 售價: 3 E幣)
指紋密碼鎖完整C源碼.zip (113.33 KB, 售價: 5 E幣)
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 01:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表