#include < at89x51.h>
#define uchar unsigned char
#define uint unsigned int
void rs232_init();
uchar key=0; //接收计数器
int i=0;
uchar data table1[15];
sbit K2=P2^1;
sbit K1=P2^0;
sbit led= P3^7;
sbit p1=P0^0;
sbit cumo=P1^4; //触摸输入信号
sbit fmp=P3^2; //蜂鸣器控制脚低电平响
uchar flag=0; //触摸标志 0是有效 1为无效
uchar zcid=0; //指纹注册标志1为有效0无效
void delay1ms(uint x)
{
uchar q=124;
while(x--)
while(q--);
}
void rs232_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1; //先设定号工作方式,在打开允许接收
EA=1;
ES=1;
TI=0;
RI=0;
for( i=0;i<15;i++) //初始化table1[]数组
{
table1[i]=0xFF;
}
}
void ser()interrupt 4
{
RI=0;
table1[key++]=SBUF; //存数据到接收缓存
}
void GR_Enroll() // 自动注册模板
{
uchar sendbuffer[]={0xef,0x01,0xff,0xff,0xff,0x0ff,0x01,0x00,0x03,0x33,0x00,0x37};
uchar j=0;
ES=0; //禁止中断
for(j=0;j<12;j++)
{
SBUF=sendbuffer[j];
while(!TI);
TI=0; }
ES=1; //允许中断
while(key<13); //等待发送到0-13即14位数据
if(table1[9]==0x00) //判断命令数组10位返回0x00即指纹验证通过返回其它数就不通过
{
fmp=0; //蜂鸣器响
delay1ms(200);
fmp=1; //停止蜂鸣器响
delay1ms(500);
}
else
{
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
delay1ms(80);
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
}
for( i=0;i<13;i++) //接收完数据把数据置为0xFF
{
table1[i]=0xff;
}
key=0; //接收完毕把数据个数标志清零
zcid=0; //清空指纹注册标志
}
void GR_Identity() // 自动验证指纹
{
uchar j=0;
uchar sendbuffer[]={0xef,0x01,0xff,0xff,0xff,0x0ff,0x01,0x00,0x03,0x34,0x00,0x38}; //指纹验证数组命令
if(cumo==0 && flag==0) //满足指纹感应有手指并且感应标志为0时候才执行指纹验证程序
{
ES=0; //禁止中断
for(j=0;j<12;j++) //发送指纹验证数组命令
{
SBUF=sendbuffer[j];
while(!TI);
TI=0; }
ES=1; //允许中断
while(key<15) ; //等待发送到0-14个数据即15位数据接收完毕
if(table1[9]==0x00) //判断命令数组10位返回0x00即指纹验证通过返回其它数就不通过
{
if( table1[10]==0x00 && table1[11]==0x00) //如果指纹库里0个指纹那就启动注册新指纹函数
{
zcid=1;
fmp=0; //蜂鸣器响
delay1ms(200);
fmp=1; //停止蜂鸣器响
delay1ms(500);
}
else
{ p1=0; //验证通过p1指示灯亮 不通过即灭
fmp=0; //蜂鸣器响
delay1ms(200);
fmp=1; //停止蜂鸣器响
delay1ms(500);
p1=1; //1秒时间到关闭
}
}
else
{ p1=1;
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
delay1ms(80);
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
}
for( i=0;i<15;i++) //接收完数据把数据置为0xFF
{
table1[i]=0xff;
}
flag=1; //标志置1待重新拿出手指置0指纹验证才起效
delay1ms(250);//延时等待
}
key=0; //接收完毕把数据个数标志清零
}
void GR_Empty() // 全部清空指纹库函数
{
uchar sendbuffer[]={0xef,0x01,0xff,0xff,0xff,0x0ff,0x01,0x00,0x03,0x0D,0x00,0x11};
uchar j=0;
ES=0; //禁止中断
for(j=0;j<12;j++)
{
SBUF=sendbuffer[j];
while(!TI);
TI=0; }
ES=1; //允许中断
while(key<11); //等待发送到0-11即12位数据
if(table1[9]==0x00) //判断命令数组10位返回0x00即指纹验证通过返回其它数就不通过
{
fmp=0; //蜂鸣器响
delay1ms(200);
fmp=1; //停止蜂鸣器响
delay1ms(500);
}
else
{
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
delay1ms(80);
fmp=0; //蜂鸣器响
delay1ms(80);
fmp=1; //停止蜂鸣器响
}
for( i=0;i<11;i++) //接收完数据把数据置为0xFF
{
table1[i]=0xff;
}
key=0; //接收完毕把数据个数标志清零
}
main()
{
led=0;
P0 = 0xFF;
fmp=1;
zcid=0;
delay1ms(550); //开机等待模块延时函数
rs232_init(); //初始化函数
delay1ms(1000);//开机等待模块延时函数
while(1)
{
key=0; //接收完毕把数据个数标志清零
if(cumo==1) flag=0; //待放开手指后标志重新置0
GR_Identity(); // 自动验证指纹
if(K1==0 || zcid==1 ) //按下按键k1
{
delay1ms(20); //防抖动延时
if(K1==1 ||zcid==1) //松开k1按键
{
GR_Enroll(); // 自动注册模板
} }
if(K2==0) //按下按键k2
{
delay1ms(20); //防抖动延时
if(K2==1) //松开k1按键
{
GR_Empty(); // 全部清空指纹库函数
} }
}
}