本设计是基于STC89C52单片机的指纹识别设计,采用AS608指纹模块做为传感器,LCD1602显示屏显示信息。具有指纹添加,指纹识别,删除指纹功能。是一款简单的指纹识别毕业设计设计,电路原理图和PCB以及程序完整。添加简单的电路可以拓展为其他的设计。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/144H6VtNfigvOPzfQlcunPQ?pwd=8888
部分代码展示
/*****************************************
基于单片机的指纹识别系统
AS608模块
STC89C52
******************************************/
#include<reg51.h>
#include"lcd.h"
sbit D3= P1^3;
sbit D4= P1^4;
sbit k3=P1^0;
sbit k4=P1^1;
sbit k5=P1^2;
#define FALSE 0
#define TURE 1
#define MAX_NUMBER 30
#define _Nop() _nop_()
unsigned char code jiemian[16] = "Fingerprint lock";
unsigned char code success[15] = "Add finger OK";
unsigned char code faild[16] = "Add finger faild";
unsigned char code shownum[12] = "Finger_NUM:";
unsigned char code MODE1[16] = "Add finger mode";
unsigned char code MODE2[16] = "Identify mode";
unsigned char code MODE3[16] = "Connection OK";
unsigned char code MODE4[16] = "Connection Faild";
unsigned char code shibie1[16] = "Identify OK";
unsigned char code shibie2[16] = "Identify Faild";
unsigned char code del[16] = "DEL success";
unsigned char strnum[3]={0};
unsigned char SaveNumber=0,searchnum=0;
unsigned int SearchNumber=0,clk0=0;
bit modeflag= 0 , clearallflag=0, changeflag=0;
unsigned char num_char[10]={'0','1','2','3','4','5','6','7','8','9'};
//定义密码,实际上密码需要存在eeprom中,可以通过程序更改。请用户自行添加
unsigned char FifoNumber=0;
unsigned char idata FIFO[MAX_NUMBER+1]={0};
//常用指令定义/
//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};
void dokey();
/*******************************************************************************
串口发送函数
*******************************************************************************/
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;//可以用中断方式进行
}
if(flag==1)//第一个字节已经回来,所以flag==1成立
{
if(tmpdat!=0x01) //接收数据错误,将重新从缓冲区接收数据
{
flag=0;//接收应答失败
result=FALSE;
start =FALSE;
stop=FALSE;
count=0;
goto
restart0;
}
//如果成功接收到0xef01,可以开始接收数据
flag=2;//flag=2;表示应答成功,可以开始接收数据了
count++;//现在count=1;
FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中
start=TURE; //应答成功可以开始接收数据
goto
restart0;
}
完整版 电路图和程序代码 下载地址