找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5061|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机的AS608指纹锁源程序

  [复制链接]
跳转到指定楼层
楼主
AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。      

制作出来的实物图如下:


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define MAIN_Fosc 11059200//宏定义主时钟频率
  4. #define LINE1         0x80                        //1602屏地址定义 第一行地址
  5. #define LINE2         0xc0                        //1602屏地址定义 第二行地址
  6. #define DataPort P0          //LCD1602操作位定义

  7. typedef unsigned char INT8U;
  8. typedef unsigned char uchar;
  9. typedef unsigned int INT16U;
  10. typedef unsigned int uint;

  11. sbit EN = P3^4;     //读写数据使能   0:停止 1:启动
  12. sbit RS = P3^5;     //寄存器选择 0:指令寄存器 1:数据寄存器
  13. sbit RW = P3^6;     //读写控制 0:写  1:读
  14. sbit KEY_DOWN=P2^4;
  15. sbit KEY_OK=P2^2;
  16. sbit KEY_CANCEL=P2^0;
  17. sbit beep=P2^6;

  18. uchar flag=0;
  19. extern char local_date=0;  //全局变量,当前箭头位置
  20. extern unsigned int finger_id = 0;

  21. //uart 函数
  22. void Uart_Init(void)
  23. {
  24.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允许接收
  25.     PCON=0x00;   //SMOD=0:波特率不加倍
  26.     TMOD=0x20;   //T1方式2,用于UART波特率
  27.     TH1=0xFD;
  28.     TL1=0xFD;   //UART波特率设置:FDFD,9600;FFFF,57600
  29.     TR1=1;         //允许T1计数
  30.     EA=1;         //开总中断
  31. }

  32. void Uart_Send_Byte(unsigned char c)//UART Send a byte
  33. {
  34.         SBUF = c;
  35.         while(!TI);                //发送完为1
  36.         TI = 0;
  37. }

  38. unsigned char Uart_Receive_Byte()//UART Receive a byteg
  39. {        
  40.         unsigned char dat;
  41.         while(!RI);         //接收完为1
  42.         RI = 0;
  43.         dat = SBUF;
  44.         return (dat);
  45. }
  46. //延时函数
  47. void Delay_us(int i)
  48. {
  49.         while(--i);
  50. }

  51. void Delay_ms(INT16U ms)
  52. {
  53.      INT16U i;
  54.          do{
  55.               i = MAIN_Fosc / 96000;
  56.                   while(--i);   //96T per loop
  57.      }while(--ms);
  58. }

  59. //蜂鸣器函数
  60. void Beep_Times(unsigned char times)
  61. {
  62.         unsigned char i=0;
  63.         for(i=0;i<times;i++)
  64.         {
  65.                  beep=0;
  66.                  Delay_ms(200);
  67.                  beep=1;
  68.                  Delay_ms(200);
  69.         }
  70. }

  71. //按键操作函数
  72. void Key_Init(void)
  73. {
  74.     //定义按键输入端口
  75.         KEY_DOWN=1;                // 下一项
  76.         KEY_OK=1;                // 确认
  77.         KEY_CANCEL=1;        // 取消
  78. }

  79. // 1602液晶函数
  80. //写指令
  81. void LCD1602_WriteCMD(unsigned char cmd)  
  82. {
  83.           EN=0;
  84.           RS=0;
  85.           RW=0;
  86.           Delay_us(10);
  87.           EN=1;
  88.           Delay_us(10);
  89.           DataPort=cmd;
  90.           Delay_us(10);
  91.           EN=0;
  92. }
  93. //写数据
  94. void LCD1602_WriteDAT(unsigned char dat)
  95. {
  96.           EN=0;
  97.           RS=1;
  98.           RW=0;
  99.           Delay_us(10);
  100.           EN=1;
  101.           Delay_us(10);
  102.           DataPort=dat;
  103.           Delay_us(10);
  104.           EN=0;
  105. }
  106. //液晶繁忙检测
  107. void LCD1602_CheckBusy(void)
  108. {
  109.         
  110.         uchar busy;
  111.         DataPort=0xff;
  112.         RS=0;
  113.         RW=1;
  114.         do
  115.         {
  116.                 EN=1;
  117.                 busy=DataPort;
  118.                 EN=0;
  119.         }while(busy&0x80);
  120.         
  121. }
  122. //液晶初始化函数
  123. void LCD1602_Init(void)  
  124. {
  125.         Delay_ms(15);                      //上电延时15ms
  126.           LCD1602_WriteCMD(0x38); //写显示指令(不检测忙信号)
  127.           Delay_ms(5);
  128.           LCD1602_CheckBusy();
  129.           LCD1602_WriteCMD(0x38); //写显示指令
  130.           LCD1602_CheckBusy();
  131.           LCD1602_WriteCMD(0x01); //清屏
  132.           LCD1602_CheckBusy();
  133.           LCD1602_WriteCMD(0x06); //显示光标移动设置
  134.           LCD1602_CheckBusy();
  135.           LCD1602_WriteCMD(0x0c); //显示开及光标设置  
  136. }

  137. //液晶显示函数                入口参数:addr起始地址,pointer指针地址,index下标,num个数
  138. void LCD1602_Display(unsigned char addr,unsigned char* pointer,unsigned char index,unsigned char num)
  139. {
  140.           unsigned char i;
  141.           LCD1602_CheckBusy();        //判断忙信号
  142.           LCD1602_WriteCMD(addr);        //写入地址
  143.           for(i=0;i<num;i++)                //写入数据
  144.           {
  145.              LCD1602_CheckBusy();                           //判断忙信号
  146.              LCD1602_WriteDAT(pointer[index+i]);//写入数据     
  147.           }
  148. }

  149. //AS608指纹模块
  150. volatile unsigned char AS608_RECEICE_BUFFER[32]; //volatile:系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据

  151. //FINGERPRINT通信协议定义
  152. code unsigned char AS608_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令验证
  153. code unsigned char AS608_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //协议包头
  154. code unsigned char AS608_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //获得指纹图像
  155. code unsigned char AS608_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数
  156. code unsigned char AS608_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指纹搜索范围0 - 999,使用BUFFER1中的特征码搜索
  157. code unsigned char AS608_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9号指纹
  158. code unsigned char AS608_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //将图像放入到BUFFER1
  159. code unsigned char AS608_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //将图像放入到BUFFER2
  160. code unsigned char AS608_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //将BUFFER1跟BUFFER2合成特征模版
  161. code unsigned char AS608_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//删除指纹模块里所有的模版
  162. volatile unsigned char  AS608_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置
  163. //code unsigned char AS608_num_of_finger_in_lib1[7]={0x01,0x00,0x04,0x1F,0x00,0x00,0x24};//查看指纹库的命令
  164. //code unsigned char AS608_num_of_finger_in_lib2[7]={0x01,0x00,0x04,0x1F,0x01,0x00,0x25};
  165. //code unsigned char AS608_num_of_finger_in_lib3[7]={0x01,0x00,0x04,0x1F,0x02,0x00,0x26};
  166. //code unsigned char AS608_num_of_finger_in_lib4[7]={0x01,0x00,0x04,0x1F,0x03,0x00,0x27};

  167. //发送包头
  168. void AS608_Cmd_Send_Pack_Head(void)
  169. {
  170.         int i;        
  171.         for(i=0;i<6;i++) //包头
  172.         {
  173.                 Uart_Send_Byte(AS608_Pack_Head[i]);   
  174.         }               
  175. }

  176. //发送指令
  177. void AS608_Cmd_Check(void)
  178. {
  179.         int i=0;
  180.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  181.         for(i=0;i<10;i++)
  182.         {               
  183.                 Uart_Send_Byte(AS608_Get_Device[i]);
  184.         }
  185. }

  186. //接收反馈数据缓冲
  187. void AS608_Receive_Data(unsigned char ucLength)
  188. {
  189.         unsigned char i;                                 
  190.         for (i=0;i<ucLength;i++)
  191.                 AS608_RECEICE_BUFFER[i] = Uart_Receive_Byte();
  192. }

  193. //FINGERPRINT_获得指纹图像命令
  194. void AS608_Cmd_Get_Img(void)
  195. {
  196.     unsigned char i;
  197.     AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  198.     for(i=0;i<6;i++) //发送命令 0x1d
  199.         {
  200.        Uart_Send_Byte(AS608_Get_Img[i]);
  201.         }
  202. }

  203. //将图像转换成特征码存放在Buffer1中
  204. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  205. {
  206.          unsigned char i;
  207.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头      
  208.            for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  209.         {
  210.                 Uart_Send_Byte(AS608_Img_To_Buffer1[i]);
  211.         }
  212. }
  213. //将图像转换成特征码存放在Buffer2中
  214. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  215. {
  216.         unsigned char i;
  217.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  218.         for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  219.         {
  220.                 Uart_Send_Byte(AS608_Img_To_Buffer2[i]);
  221.         }
  222. }

  223. //搜索全部用户999枚
  224. void AS608_Cmd_Search_Finger(void)
  225. {
  226.         unsigned char i;                       
  227.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  228.         for(i=0;i<11;i++)
  229.         {
  230.                 Uart_Send_Byte(AS608_Search[i]);   
  231.         }
  232. }

  233. //转换成特征码
  234. void AS608_Cmd_Reg_Model(void)
  235. {
  236.         unsigned char i;                              
  237.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  238.         for(i=0;i<6;i++)
  239.         {
  240.                 Uart_Send_Byte(AS608_Reg_Model[i]);   
  241.         }
  242. }

  243. //删除指纹模块里的所有指纹模版
  244. void FINGERPRINT_Cmd_Delete_All_Model(void)
  245. {
  246.         unsigned char i;   
  247.     AS608_Cmd_Send_Pack_Head(); //发送通信协议包头   
  248.     for(i=0;i<6;i++) //命令删除指纹模版
  249.         {
  250.               Uart_Send_Byte(AS608_Delete_All_Model[i]);   
  251.         }        
  252. }

  253. //保存指纹
  254. void AS608_Cmd_Save_Finger( unsigned int storeID )
  255. {
  256.         unsigned long temp = 0;
  257.         unsigned char i;
  258.         AS608_Save_Finger[5] =(storeID&0xFF00)>>8;
  259.         AS608_Save_Finger[6] = (storeID&0x00FF);
  260.         for(i=0;i<7;i++)   //计算校验和
  261.                 temp = temp + AS608_Save_Finger[i];
  262.         AS608_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据
  263.         AS608_Save_Finger[8]= temp & 0x0000FF;                  
  264.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头        
  265.         for(i=0;i<9;i++)  
  266.                 Uart_Send_Byte(AS608_Save_Finger[i]);      //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  267. }

  268. //查看当前指纹库中指纹模板数
  269. int AS608_number_of_fingers()
  270. {
  271.          int num=1;//默认模板库中有一个模板
  272.         uchar i=0;
  273.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  274.         for(i=0;i<6;i++)
  275.         {
  276.                   Uart_Send_Byte(AS608_Get_Templete_Count[i]);
  277.         }
  278.         AS608_RECEICE_BUFFER[9]=1;//方便后续判断是否接收成功
  279.         AS608_Receive_Data(14);//接收数据
  280.         if(AS608_RECEICE_BUFFER[9]==0) //接收成功
  281.         {
  282.                  num=AS608_RECEICE_BUFFER[10]*256+AS608_RECEICE_BUFFER[11];//拼接模板总个数                        
  283.         }
  284.         return num;
  285. }
  286. //另一种方法查看指纹库中是否有模板 //本来应该查看所有1000个模板位置是否存在模板,但一般只用得到前256个,故从简
  287. /*
  288. uchar AS608_notEmpty()
  289. {
  290.          uchar exist=0;
  291.         char i=0;
  292.         AS608_Cmd_Send_Pack_Head(); //发送通信协议包头
  293.         for(i=0;i<7;i++)
  294.         {
  295.                   Uart_Send_Byte(AS608_num_of_finger_in_lib1[i]);
  296.         }
  297.         AS608_Receive_Data(10);//接收前10byte数据,除第10字节的确认码外,其余全部丢弃
  298.         if(AS608_RECEICE_BUFFER[9]==0) //接收成功
  299.         {
  300.         AS608_Receive_Data(32);//接收后续32byte数据,此即0~255个模板为是否存在指纹模板的数据
  301.         for(i=0;i<32;i++)//查看这32byte数据,任何一个位置存在模板则返回值为真,否则为假
  302.         {
  303.                  if(AS608_RECEICE_BUFFER[i])
  304.                         exist=1;
  305.         }
  306.         return exist;
  307.         }
  308. }
  309. */
  310. //添加指纹
  311. void AS608_Add_Fingerprint()
  312. {
  313.         unsigned char id_show[]={0,0,0};
  314.         LCD1602_WriteCMD(0x01); //清屏  
  315.         while(1)
  316.         {
  317.                 LCD1602_Display(0x80,"   Add  finger  ",0,16);
  318.                 LCD1602_Display(0xc0,"    ID is       ",0,16);
  319.                 //按返回键直接回到主菜单
  320.                 if(KEY_CANCEL == 0)
  321.                 {
  322.                          Delay_ms(5);
  323.                          if(KEY_CANCEL == 0)
  324.                          {
  325.                                  while(KEY_CANCEL==0);
  326.                                  break;
  327.                          }         
  328.                 }

  329.                 //按切换键指纹iD值加1
  330.                 if(KEY_DOWN == 0)
  331.                 {
  332.                         Delay_ms(5);
  333.                         if(KEY_DOWN == 0)
  334.                         {
  335.                                 while(KEY_DOWN==0);
  336.                                 if(finger_id == 1000)
  337.                                 {
  338.                                         finger_id = 1;
  339.                                 }
  340.                                 else
  341.                                         finger_id = finger_id + 1;
  342.                         }               
  343.                 }

  344.                  //指纹iD值显示处理
  345.                  LCD1602_WriteCMD(0xc0+10);
  346.                  LCD1602_WriteDAT(finger_id/100+48);
  347.                 LCD1602_WriteDAT(finger_id%100/10+48);
  348.                  LCD1602_WriteDAT(finger_id%100%10+48);

  349.                  //按确认键开始录入指纹信息                                          
  350.                  if(KEY_OK == 0)
  351.                  {
  352.                  Delay_ms(5);
  353.                  if(KEY_OK == 0)
  354.                   {        
  355.                                 while(KEY_OK==0);
  356.                                   LCD1602_Display(0x80," Please  finger ",0,16);
  357.                                   LCD1602_Display(0xc0,"                ",0,16);
  358.                                 while(KEY_CANCEL == 1)
  359.                                   {
  360.                                           //按下返回键退出录入返回fingerID调整状态   
  361.                                         if(KEY_CANCEL == 0)
  362.                                          {
  363.                                                   Delay_ms(5);
  364.                                                 if(KEY_CANCEL == 0)
  365.                                                 {
  366.                                                         while(KEY_CANCEL==0);
  367.                                                           break;
  368.                                                 }
  369.                                                 
  370.                                           }
  371.                                         AS608_Cmd_Get_Img(); //获得指纹图像
  372.                                         AS608_Receive_Data(12);
  373.                                         //判断接收到的确认码,等于0指纹获取成功
  374.                                         if(AS608_RECEICE_BUFFER[9]==0)
  375.                                          {
  376.                                                 Delay_ms(100);
  377.                                                 FINGERPRINT_Cmd_Img_To_Buffer1();
  378.                                             AS608_Receive_Data(12);
  379.                                                 LCD1602_Display(0x80,"Successful entry",0,16);
  380.                                                 Beep_Times(1);
  381.                                                 Delay_ms(1000);
  382.                                                 LCD1602_Display(0x80," Please  finger ",0,16);
  383.                                                   LCD1602_Display(0xc0,"                ",0,16);
  384.                                                 while(1)
  385.                                                 {
  386.                                                         if(KEY_CANCEL == 0)
  387.                                                          {
  388.                                                                   Delay_ms(5);
  389.                                                                 if(KEY_CANCEL == 0)
  390.                                                                 {
  391.                                                                         while(KEY_CANCEL==0);
  392.                                                                           break;
  393.                                                                 }
  394.                                                           }
  395.                                                          AS608_Cmd_Get_Img(); //获得指纹图像
  396.                                                          AS608_Receive_Data(12);
  397.                                                         //判断接收到的确认码,等于0指纹获取成功
  398.                                                         if(AS608_RECEICE_BUFFER[9]==0)
  399.                                                         {
  400.                                                         Delay_ms(200);
  401.                                                         LCD1602_Display(0x80,"Successful entry",0,16);
  402.                                                         LCD1602_Display(0xc0,"    ID is       ",0,16);
  403.                                                          //指纹iD值显示处理
  404.                                                          LCD1602_WriteCMD(0xc0+10);
  405.                                                          LCD1602_WriteDAT(finger_id/100+48);
  406.                                                          LCD1602_WriteDAT(finger_id%100/10+48);
  407.                                                          LCD1602_WriteDAT(finger_id%100%10+48);
  408.                                                         FINGERPRINT_Cmd_Img_To_Buffer2();
  409.                                                           AS608_Receive_Data(12);
  410.                                                         AS608_Cmd_Reg_Model();//转换成特征码
  411.                                                  AS608_Receive_Data(12);
  412.                                                           AS608_Cmd_Save_Finger(finger_id);                                         
  413.                                                   AS608_Receive_Data(12);
  414.                                                         Beep_Times(1);
  415.                                                         Delay_ms(1000);
  416.                                                         finger_id=finger_id+1;
  417.                                                     break;
  418.                                                           }
  419.                                                    }
  420.                                                    break;
  421.                                         }
  422.                                 }
  423.                 }
  424.                 }
  425.         }
  426. }

  427. //搜索指纹
  428. void AS608_Find_Fingerprint()
  429. {
  430.         unsigned int find_fingerid = 0;
  431.         unsigned char id_show[]={0,0,0};
  432.         do
  433.         {
  434.                 LCD1602_Display(0x80," Please  finger ",0,16);
  435.                 LCD1602_Display(0xc0,"                ",0,16);
  436.                 AS608_Cmd_Get_Img(); //获得指纹图像
  437.                 AS608_Receive_Data(12);               
  438.                 //判断接收到的确认码,等于0指纹获取成功
  439.                 if(AS608_RECEICE_BUFFER[9]==0)
  440.                 {                        
  441.                         Delay_ms(100);
  442.                         FINGERPRINT_Cmd_Img_To_Buffer1();
  443.                         AS608_Receive_Data(12);               
  444.                         AS608_Cmd_Search_Finger();
  445.                         AS608_Receive_Data(16);                        
  446.                         if(AS608_RECEICE_BUFFER[9] == 0) //搜索到  
  447.                         {
  448.                                 //解锁成功//
  449.                                 
  450.                                 LCD1602_Display(0x80," Search success ",0,16);
  451.                                 LCD1602_Display(0xc0,"    ID is       ",0,16);
  452.                                 Beep_Times(1);                                       
  453.                                 //拼接指纹ID数
  454.                                 find_fingerid = AS608_RECEICE_BUFFER[10]*256 + AS608_RECEICE_BUFFER[11];                                       
  455.                                  //指纹iD值显示处理
  456.                                  LCD1602_WriteCMD(0xc0+10);
  457.                                  LCD1602_WriteDAT(find_fingerid/100+48);
  458.                                  LCD1602_WriteDAT(find_fingerid%100/10+48);
  459.                                  LCD1602_WriteDAT(find_fingerid%100%10+48);
  460.                                 //配置IO口,执行开锁操作
  461.                                 if(flag)
  462.                                 {
  463.                                 P1=0xfe;                                                
  464.                                 Delay_ms(3800);
  465.                                 P1=0xff;        //电动机停止转动
  466.                                 Delay_ms(1000);
  467.                                 P1=0xfd;        //电动机反转复位
  468.                                 Delay_ms(3600);//电机正转阻力远大于反转,旋转相同角度时,正转需要更多时间        
  469.                                 P1=0xff;        //电动机停止转动
  470.                                 }
  471.                                 flag=1;        //允许后续相关操作:添加或删除指纹模板
  472.                                 break;                                                        
  473.                         }
  474.                         else //没有找到
  475.                         {
  476.                                         LCD1602_Display(0x80," Search  failed ",0,16);
  477.                                         LCD1602_Display(0xc0,"                ",0,16);
  478.                                          Beep_Times(3);
  479.                         }
  480.                         }               
  481.                 }while(KEY_CANCEL == 1);
  482. }
  483. //删除所有存贮的指纹库
  484. void AS608_Delete_All_Fingerprint()
  485. {
  486.                 unsigned char i=0;
  487.                                 LCD1602_Display(0x80,"   empty all    ",0,16);
  488.                                 LCD1602_Display(0xc0,"   Yes or no ?  ",0,16);
  489.                 do
  490.                  {
  491.                         if(KEY_OK==0)
  492.                         {
  493.                         Delay_ms(5);
  494.                         if(KEY_OK==0)
  495.                         {
  496.                                 while(KEY_OK==0);
  497.                                 LCD1602_Display(0x80,"   emptying     ",0,16);
  498.                                 LCD1602_Display(0xc0,"                ",0,16);
  499.                                 Delay_ms(300);
  500.                                 LCD1602_WriteCMD(0xc0);
  501.                                 for(i=0;i<16;i++)
  502.                                  {
  503.                                         LCD1602_WriteDAT(42);// 即'*'
  504.                                         Delay_ms(100);
  505.                                  }
  506.                                 FINGERPRINT_Cmd_Delete_All_Model();
  507.                                   AS608_Receive_Data(12);
  508.                                 LCD1602_Display(0x80,"   All empty    ",0,16);
  509.                                 LCD1602_Display(0xc0,"                ",0,16);
  510.                                 Beep_Times(3);
  511.                                 break;
  512.                         }
  513.                         }
  514.                  }while(KEY_CANCEL==1);
  515. }

  516. void Device_Check(void)
  517. {
  518.                 unsigned char i=0;
  519.                 AS608_RECEICE_BUFFER[9]=1;                                           //串口数组第九位可判断是否通信正常
  520.                 LCD1602_Display(0xc0,"Loading",0,7);                   //设备加载中界面                                                           
  521.                 for(i=0;i<8;i++)                                                           //进度条式更新,看起来美观
  522.                 {
  523.                         LCD1602_WriteDAT(42);                               //42对应ASIC码的 *
  524.                         Delay_ms(20);                                                           //控制进度条速度
  525.                 }                                                                        
  526.                 LCD1602_Display(0xc0,"Docking  failure",0,16);      //液晶先显示对接失败,如果指纹模块插对的话会将其覆盖        
  527.                 AS608_Cmd_Check();                                                                //单片机向指纹模块发送校对命令
  528.                 AS608_Receive_Data(12);                                                        //将串口接收到的数据转存
  529.                  if(AS608_RECEICE_BUFFER[9] == 0)                                        //判断数据低第9位是否接收到0
  530.                 {
  531.                         LCD1602_Display(0xc0,"Docking  success",0,16);        //符合成功条件则显示对接成功
  532.                 }
  533. }

  534. //主函数
  535. void main()
  536. {                                                        
  537.         finger_id=0;
  538.         LCD1602_Init();                        //初始化液晶
  539.         LCD1602_Display(0x80,"Fingerprint Test",0,16);         //液晶开机显示界面
  540.           Uart_Init();                        //初始化串口
  541.         Key_Init();                                //初始化按键
  542.          Delay_ms(200);          //延时500MS,等待指纹模块复位
  543.         Device_Check();                           //校对指纹模块是否接入正确,液晶做出相应的提示
  544.         Delay_ms(1000);                        //对接成功界面停留一定时间
  545.         while(1)
  546.         {
  547.             
  548.                 /**************进入主功能界面****************/
  549.                 LCD1602_Display(0x80,"  search finger ",0,16);         //第一排显示搜索指纹
  550.                 LCD1602_Display(0xc0,"  Add     delete",0,16);         //添加和删除指纹
  551.                 if(local_date==0)
  552.                 {
  553.                         LCD1602_Display(0x80,  " *",0,2);
  554.                         LCD1602_Display(0xc0,  "  ",0,2);
  555.                         LCD1602_Display(0xc0+8,"  ",0,2);        
  556.                 }
  557.                 else if(local_date==1)
  558.                 {
  559.                         LCD1602_Display(0x80,  "  ",0,2);
  560.                         LCD1602_Display(0xc0,  " *",0,2);
  561.                         LCD1602_Display(0xc0+8,"  ",0,2);        
  562.                 }
  563.                 else if(local_date==2)
  564.                 {
  565.                         LCD1602_Display(0x80,  "  ",0,2);
  566.                         LCD1602_Display(0xc0,  "  ",0,2);
  567.                         LCD1602_Display(0xc0+8," *",0,2);        
  568.                 }                        
  569.                 //确认键
  570.                 if(KEY_OK == 0)
  571.                 {
  572.                 Delay_ms(5);
  573.                 if(KEY_OK == 0)
  574.                 {         
  575.                          while(KEY_OK == 0);//等待松开按键                                                               
  576.                         switch(local_date)
  577.                         {
  578.                                         case 0:  //搜索指纹        
  579.                                         flag=1;                                       
  580.                                         AS608_Find_Fingerprint();                                                                                                                                                                                                
  581.                                         break;        
  582.                                        
  583.                                         case 1:         //添加指纹
  584.                                         flag=1;        //flag=1,若指纹库为空,则可以直接添加指纹                                
  585.                                         if(AS608_number_of_fingers())
  586.                                         {
  587.                                                 flag=0;//flag置0由两重作用:
  588.                                                 //1、指纹库中已有指纹,则需要搜索匹配成功,由AS608_Find_Fingerprint()将flag置1,才能添加指纹
  589.                                                 //2、flag=0,则在搜索指纹成功后不执行开锁操作
  590.                                                 AS608_Find_Fingerprint();
  591.                                         }
  592.                                         if(flag)
  593.                                         {
  594.                                                 AS608_Add_Fingerprint();
  595.                                         }
  596.                                         break;                                         
  597.                                        
  598.                                         case 2:        //清空指纹
  599.                                         flag=0;        //1、在搜索指纹成功后不执行开锁操作;2、若搜索不成功,不执行清空操作
  600.                                         AS608_Find_Fingerprint();//搜索匹配成功后,函数内部将flag置1,才能清空指纹库
  601.                                         if(flag)
  602.                                         {
  603.                                                 AS608_Delete_All_Fingerprint();
  604.                                           }
  605.                                         break;
  606.                         }
  607.                 }
  608.                 }
  609.                     //切换键
  610.                         if(KEY_DOWN == 0)
  611.                         {
  612.                         Delay_ms(5);
  613.                         if(KEY_DOWN == 0)
  614.                         {
  615.                                  while(KEY_DOWN == 0); //等待松开按键                                
  616.                                    if(local_date<=2)
  617.                                 {
  618.                                         local_date++;
  619.                                         if(local_date==3) local_date=0;                                                
  620.                                 }               
  621.                         }
  622.                         }                                                
  623.                         Delay_ms(100); //延时判断100MS检测一次               
  624.         }
  625. }
复制代码


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:968021 发表于 2023-2-20 23:36 | 只看该作者
实测有用
回复

使用道具 举报

板凳
ID:433219 发表于 2023-12-6 15:06 | 只看该作者
指纹打卡,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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