×
单片机 > 单片机程序设计 > 详情

单片机指纹识别程序

发布时间:2020-08-27 发布时间:
|

制作出来的实物图如下:
 

Altium Designer画的原理图和PCB图如下:
 

单片机源程序如下:

#include

#include

#include"lcd1602.h"



sbit buzzer=P2^0;  //蜂鸣器        低电平打开蜂鸣器


sbit red=   P1^0;  //红色灯 表示录入模式

sbit green= P1^1;  //绿色灯 表示识别模式


sbit k2=P3^4; //录入一次指纹

sbit k1=P3^3; //模式识别转换

sbit k3=P3^2; //清除所有指纹(10个指纹清除)


#define Max_User 10

#define error 2

   

unsigned char         SaveNumber=0,searchnum=0;

unsigned int          SearchNumber=0;                

unsigned int         clk0=0;


unsigned char str[3]={0,'',''};


unsigned char code Identify[16]="Lock:   Idenfity";

unsigned char code Input[16]   ="Lock:   Input   ";


bit modeflag=0,clearallflag=0,changeflag=0;


// modeflag=0 为识别模式 modeflag=1为录入指纹模式

//每成功录入一次指纹 SaveNumber++


//////////////////////////////////////常用指令定义/////////////////////////////


//Verify  Password   :验证设备握手口令

unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};         //回送12个


//设置设备握手口令

unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};         //回送12个


//GetImage           :探测手指并从传感器上读入图像

unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05};        //回送12个


//Gen Templet1        :根据原始图像生成指纹特征1

unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};        //回送12个


//Gen Templet2        :根据原始图像生成指纹特征2

unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12个        


        

//Search Finger      :以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库

unsigned char code SEAT[18]={17,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,8, 4,1,0,0,    0,0x65,  0x00,0x73};        //回送16个



//Merge Templet      ;将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModelBuffer。

unsigned char code MERG[14]={12,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,3,5 , 0x00,0x09};//回送12个        


//Store Templet      :将ModelBuffer中的文件储存到flash指纹库中

unsigned char code STOR[16]={15,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,6,6,2,     0x00,0x00,     0x00,0x0f}; //回送12个


//Read Note

unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19,  0, 0x00,0x1e};


//Clear Note

unsigned char code DENT[46]={45,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3d};


//DEL one templet

unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,7,  0x0c,    0x00,0x00, 0,1, 0x00,0x15};


//DEL templet      ;清空指纹库

unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,  0x0d,0x00,0x11};


//////////////////////////////////////常用指令定义-------结束///////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////宏定义////////////////////////////////////////////////////////////////////////

#define FALSE 0

#define TURE  1


//状态定义表

#define on            1

#define off           0


#define MAX_NUMBER    63 

#define _Nop()  _nop_()



//////////////////////////////////////宏定义------------结束////////////////////////////////////////////////////////


unsigned char                   FifoNumber=0; 

xdata unsigned char   FIFO[MAX_NUMBER+1]={0};


/*********1毫秒延时程序**********/

void delay1ms(unsigned int t)

{

        unsigned int i,j;

        for(i=0;i

           for(j=0;j<120;j++)

           ;

}



void TxdByte(unsigned char dat)//串口发送信息,通过查询方式发送一个字符

{

    TI = 0;                 //让TI=0

    SBUF = dat;         //读入数据

    while(!TI);         //等待发送完毕

    TI = 0;                 //清零

}


bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,给模块发送一个命令

{

          unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;

                  

        bit result=0, start=0,stop=0;


          TxdByte(0xef);//数据包包头识别码

           TxdByte(0x01);//数据包包头识别码

          i=*p;         //数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作

          p++; 

        p++;

          for (count=i-1; count!=1;count--)  //Sent command String

                  {

                         temp=*p++;//取第个“1”个元素的内容,然后发送 

                    TxdByte(temp);//将数据发送出去

                }  

          result=TURE;//发送完成,结果为真 (真为1)           

          FifoNumber=0;

          for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]数组里面的内容,写入0X00

                 FIFO[count-1]=0x00;  

        

          if (result)   

           {                

             result=FALSE;

              start =FALSE;

                   stop  =FALSE;

               count=0;

               clk0=0;        //清零CL0计数

                

               do /////////////////////////////do的内容////////////////////////////////

                {        

                        restart0:                                

                         if (RI==1)//如果接收到数据

                              {                                 

                                          tmpdat=SBUF;//先把接收到的数据放到tmpdat中

                            RI=0;

                            if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节

                                    { 

                                                        count=0;

                                                    FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中    

                                                        flag=1;        

                                                        goto 

restart0;//可以


关键字:单片机  指纹识别  蜂鸣器


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会