找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10436|回复: 5
收起左侧

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

  [复制链接]
ID:323102 发表于 2021-5-23 23:02 | 显示全部楼层 |阅读模式
这是一个基于AS608+STC89C52单片机的指纹识别和键盘密码锁。
里面包括程序,原理图,pcb图和实物图。
话不多说直接上图
制作出来的实物图如下:
51hei图片_20210523225053.jpg 51hei图片_20210523225102.jpg

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

单片机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, 下载次数: 294)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:323102 发表于 2021-5-23 23:10 | 显示全部楼层
补发pcb

电子密码锁pcb.zip

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

回复

使用道具 举报

ID:980315 发表于 2022-6-8 14:43 | 显示全部楼层
感谢分享,可以请问一下初始密码是多少吗
回复

使用道具 举报

ID:1004248 发表于 2022-6-10 08:16 | 显示全部楼层
请问指纹WAK和Vt端是不是一直接高电平
回复

使用道具 举报

ID:1062491 发表于 2023-4-17 00:56 | 显示全部楼层
如果要添加蓝牙模块,这里面的AS608收发校验数据包该怎么调节
回复

使用道具 举报

ID:291668 发表于 2023-4-23 11:42 | 显示全部楼层
51的东西还是要捡一捡了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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