#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(); // 全部清空指紋庫函數
} }
}
} |