单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:11681|回复:9
打印上一主题下一主题

单片机AS608指纹密码锁电路原理图+源程序+PCB实物制作

 [复制链接]
跳转到指定楼层
楼主
ID:323102发表于 2021-5-23 23:02|只看该作者|只看大图回帖奖励
这是一个基于AS608+STC89C52单片机的指纹识别和键盘密码锁。
里面包括程序,原理图,pcb图和实物图。
话不多说直接上图
制作出来的实物图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机AS608源程序如下:
  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. }
复制代码


  1. #include "all.h"

  2. /************************引脚定义************************/
  3. sbit relay=P3^6;//继电器
  4. sbit buzz=P3^2;//蜂鸣器
  5. sbit led=P0^0;//LED指示灯

  6. /************************变量定义************************/
  7. #define MAX 6       //指纹最大数量
  8. #define ID_MAX 3//输入ID最大位数

  9. u16 T0_num=0;

  10. u8 mode=0;   //0正常打卡,1管理界面,2注册模式,3删除模式,4查询模式,5修改密码,6校准时钟,7工作时间

  11. u8 mode_num=0;

  12. u16 ID=0;             //存储输入编号ID
  13. u8 n=0;         //输入的位数
  14. bit zhiwen_f=0;       //1=标记进入指纹采集

  15. u8 shu;

  16. u8 a;                                         //存储按键值
  17. u8 num;                                         //记录输入的密码位数
  18. bit   in_f;                                         //输入密码的标志
  19. bit   reset_f;                                     //重设密码的标志
  20. bit   input_f;                                     //六位密码按完的标志
  21. u8 reset_num;                                 //标记修改密码阶段,=1输入旧密码,=2输入新密码,=3再次输入新密码

  22. u32 low_mima=0;//系统密码
  23. u32 in_mima=0; //暂存输入的密码
  24. u32 new_mima=0;//暂存输入新密码

  25. u8 set_f=0;
  26. u8 temp[5]="   \0";  
  27. /********************************************************
  28. 函数名称:void delayms(uint ms)
  29. 函数作用:毫秒延时函数
  30. 参数说明:
  31. ********************************************************/
  32. void delayms(u16 ms)
  33. {
  34.      u8 i=100,j;
  35.      for(;ms;ms--)
  36.      {
  37.          while(--i)
  38.          {
  39.              j=10;
  40.              while(--j);
  41.          }
  42.      }
  43. }

  44. /********************************************************
  45. 函数名称:void didi(uchar i)
  46. 函数作用:蜂鸣器鸣叫
  47. 参数说明:i为鸣叫次数
  48. ********************************************************/
  49. void didi(u8 i)
  50. {
  51.      u8 j;
  52.      for(j=0;j<i;j++)
  53.      {
  54.          led=0;
  55.          buzz=0;
  56.          delayms(20);
  57.          led=1;
  58.          buzz=1;
  59.          delayms(15);
  60.      }
  61. }
  62. /********************************************************
  63. 函数名称:void diaplay_mode0()
  64. 函数作用:显示打卡主界面
  65. 参数说明:
  66. ********************************************************/
  67. void diaplay_mode0()
  68. {
  69.      LCD12864_display_string(1,1,"指纹密码锁");
  70.      LCD12864_display_string(0,2,"编号: ");    
  71.      LCD12864_display_string(0,3,"状态: ");
  72. }
  73. /********************************************************
  74. 函数名称:void xunzhiwen()
  75. 函数作用:查找指纹
  76. 参数说明:
  77. ********************************************************/
  78. void xunzhiwen()
  79. {
  80.      searchnum=search();//搜索指纹
  81.      if((searchnum>=1&&searchnum<=MAX)||searchnum==255)//最多是MAX个指纹
  82.      {      
  83.          if(searchnum>=1&&searchnum<=MAX)//指纹识别成功
  84.          {
  85.              temp[0]=searchnum%1000/100+0x30;
  86.              temp[1]=searchnum%100/10+0x30;
  87.              temp[2]=searchnum%10+0x30;
  88.              temp[3]=' ';
  89.              LCD12864_display_string(3,2,temp);
  90.              LCD12864_display_string(3,3,"指纹解锁");
  91.              LCD12864_display_string(1,4,"         ");
  92.              in_mima=0;
  93.              num=0;
  94.              input_f=0;
  95.              relay=0;
  96.              T0_num=0;    
  97.          }
  98.          else//不正确的指纹
  99.          {
  100.              LCD12864_display_string(3,3,"无效指纹");
  101.              didi(3);
  102.          }
  103.          delay1ms(500);
  104.          LCD12864_display_string(3,2,"   ");
  105.          LCD12864_display_string(3,3,"       ");
  106.      }                                          
  107. }

  108. /********************************************************
  109. 函数名称:void cunchu()
  110. 函数作用:存储指纹
  111. 参数说明:
  112. ********************************************************/
  113. void cunchu()
  114. {
  115.      LCD12864_display_string(0,3,"状态: ");

  116.      if(ID>0&&ID<=MAX)
  117.      {
  118.          if(enroll()==1)//采集两次,生成1个指纹模板成功
  119.          {
  120.              if(savefingure(ID)==1)//保存也成功
  121.              {
  122.                  LCD12864_display_string(3,3,"录入成功");
  123.                  AT24C02_write_date(ID,1);
  124.              }
  125.              else
  126.                  LCD12864_display_string(3,3,"存储失败");    
  127.          }
  128.          else
  129.              LCD12864_display_string(3,3,"采集失败");    
  130.      }
  131.      else
  132.          LCD12864_display_string(3,3,"编号错误");

  133.      n=0;
  134.      ID=0;
  135.      zhiwen_f=0;
  136. }
  137. /********************************************************
  138. 函数名称:void shanchu()
  139. 函数作用:删除指纹
  140. 参数说明:
  141. ********************************************************/
  142. void shanchu()
  143. {
  144.      u16 i;
  145.      LCD12864_display_string(0,3,"状态: ");
  146.      if(ID>0&&ID<=MAX)
  147.      {
  148.          if(dellfingure(ID)==1)
  149.          {
  150.              LCD12864_display_string(3,3,"清空成功");
  151.              AT24C02_write_date(ID,0);
  152.          }
  153.          else
  154.              LCD12864_display_string(3,3,"1清空失败");    
  155.      }
  156.      else
  157.      {
  158.          if(ID==999)
  159.          {
  160.              if(Clear_All()==1)
  161.              {
  162.                  for(i=1;i<6;i++)
  163.                      AT24C02_write_date(i,0);
  164.                  LCD12864_display_string(3,3,"清空指纹");
  165.              }
  166.              else
  167.                  LCD12864_display_string(3,3,"清空失败");    
  168.          }
  169.          else
  170.              LCD12864_display_string(3,3,"编号错误");
  171.      }
  172.         
  173.      n=0;
  174.      ID=0;
  175.      zhiwen_f=0;                                      
  176. }

  177. /********************************************************
  178. 函数名称:void display_guanli()
  179. 函数作用:显示管理界面
  180. 参数说明:
  181. ********************************************************/
  182. void display_guanli()
  183. {
  184.      LCD12864_display_string(0,1,"  管理系统界面  ");
  185.      LCD12864_display_string(0,2,"   录入指纹   ");
  186.   LCD12864_display_string(0,3,"   清空指纹   ");
  187.      LCD12864_display_string(0,4,"   修改密码   ");
  188.      switch(mode_num)        
  189.      {
  190.        case 0: LCD12864_display_string(0,2," >> "); break;
  191.        case 1: LCD12864_display_string(0,3," >> "); break;
  192.        case 2: LCD12864_display_string(0,4," >> "); break;
  193.        default: break;
  194.      }
  195. }
  196. /*********************************************************
  197. 函数名称:void chuli()
  198. 函数作用:对所按下的按键进行处理
  199. 参数说明:
  200. *********************************************************/
  201. void chuli()
  202. {
  203.      if(key_f==1)     //先判断是否有按键按下
  204.      {      
  205.          if(a==11&&mode==0&&in_f==0)
  206.          {
  207.              shu++;
  208.              if(shu>=4)
  209.              {
  210.                  AT24C02_write_date(200,0);
  211.                  AT24C02_write_date(201,0);
  212.                  AT24C02_write_date(202,0);
  213.                  low_mima=0;
  214.                  shu=0;    
  215.              }
  216.          }    
  217.          else
  218.              shu=0;

  219.          if((mode==2||mode==3)&&a<10)  //如果输入ID状态,并且按下的是数字键
  220.          {
  221.              if(n<ID_MAX)//判断是否为输入状态,并且输入未满最大整数位数,才可以继续输入
  222.              {
  223.                  if(n==0)   //判断为编号第1位            
  224.                  {    
  225.                      LCD12864_display_string(3,2,"       ");
  226.                      LCD12864_display_string(0,3,"           ");                
  227.                  }
  228.                  LCD12864_display_char(3+n,2,a+0x30);//显示出输入的数字  ASCII[a]

  229.                  ID=ID*10+a;//编号计算
  230.                  n++;       //编号输入位数+1
  231.              }                                          
  232.          }

  233.          if((mode==0||mode==4)&&input_f==0&&a<10)//如果在in_f=1(输入密码状态),并且按下的是数字键
  234.          {            
  235.              if(in_f==1||mode==4)
  236.              {    
  237.                  if(num==0)             //清除显示后、显示输入新密码
  238.                      LCD12864_display_string(1,3,"         ");    
  239.                  if(reset_f==1&&reset_num>1)
  240.                      LCD12864_display_char(num+1,2,a+0x30);//ASCII[a]
  241.                  else
  242.                      LCD12864_display_char(num+1,2,'*');//显示“*”
  243.              }
  244.              else
  245.                  LCD12864_display_char(num+1,4,'*');//显示“*”
  246.              in_mima=in_mima*10+a;//读入密码    
  247.              num++;             //密码输入次数加一            
  248.              if(num==6)         //六位密码输入完成                                                                                      
  249.                  input_f=1;     //标记六位密码输入完成                          
  250.          }

  251.          if(a==10)
  252.          {
  253.              if(mode==0&&in_f==0)//输入密码
  254.              {
  255.                  num=0;
  256.                  in_f=1;
  257.                  in_mima=0;
  258.                  input_f=0;  //清除确定标志
  259.                  write_com(0x01);
  260.                  LCD12864_display_string(0,1,"请输入管理密码: ");//显示输入密码
  261.              }
  262.          }
  263.          if(a==15) //返回上一级菜单
  264.          {
  265.              if(mode>1)               //在管理操作中
  266.              {      
  267.                  write_com(0x01);
  268.                  LCD12864_clear12864();
  269.                  mode=1;         //回到管理选择界面
  270.             
  271. ……………………

  272. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有程序51hei提供下载,PCB在2楼:
指纹密码锁.zip(113.33 KB, 下载次数: 320)

评分

黑币 +100
收起理由
+ 100
共享资料的黑币奖励!

查看全部评分

沙发
ID:323102发表于 2021-5-23 23:10|只看该作者
补发pcb

电子密码锁pcb.zip

1.09 MB, 下载次数: 184, 下载积分: 黑币 -5

板凳
ID:980315发表于 2022-6-8 14:43|只看该作者
感谢分享,可以请问一下初始密码是多少吗
地板
ID:1004248发表于 2022-6-10 08:16|只看该作者
请问指纹WAK和Vt端是不是一直接高电平
5#
ID:1062491发表于 2023-4-17 00:56|只看该作者
如果要添加蓝牙模块,这里面的AS608收发校验数据包该怎么调节
6#
ID:291668发表于 2023-4-23 11:42|只看该作者
51的东西还是要捡一捡了
7#
ID:1055587发表于 2024-5-5 18:39|只看该作者
kiyoshimo_ 发表于 2022-6-8 14:43
感谢分享,可以请问一下初始密码是多少吗

他的代码里没有管理员密码
8#
ID:433219发表于 2024-5-6 09:10|只看该作者
AS608等 指纹模块,,,,现在陆续都被人脸识别替代了
9#
ID:1130355发表于 2024-8-9 14:04|只看该作者
drc1 发表于 2024-5-5 18:39
他的代码里没有管理员密码

所以代码能跑吗?
10#
ID:1130355发表于 2024-8-9 14:05|只看该作者
有兄弟知道这代码能跑吗

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网