找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机AS608指纹密码锁C程序源码+原理图+PCB文件

[复制链接]
eng 发表于 2021-6-13 02:54:18 | 显示全部楼层 |阅读模式
这是一个基于AS608+STC89C52单片机的指纹识别和键盘密码锁。本文尾部有完成c语言程序,原理图,pcb文件附件。
3.png
原理图截图:
2.png
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币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-24 18:05

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表