本次分享的是⼀款基于51单⽚机的指纹识别电⼦密码锁系统,该系统以STC89C52单⽚机作为模块核⼼,通过串⼝通信控制指纹模块AS608实现录取指纹并存储指纹数据,并通过LCD12864液晶显⽰屏⽐对流程及效果,辅以直流继电器以发光⼆极管模拟开锁动作。 (1)整体硬件框图
硬件电路主要包括51单⽚机最⼩系统、指纹模块AS608电路、4*4矩阵键盘电路、LCD12864显⽰屏电路及系统电源。 股骨头仪(2)AS608指纹模块电路
AS608指纹模块采⽤串⼝或者USB进⾏数据通讯。本例程采⽤串⼝通讯的⽅式实现对指纹模块的控制。单⽚机可通过⼚家提供的控制指令集对指纹模块做相应的操作,详细可以参考AS608指纹模块⽤户⼿册。
(3)其他电路
由于其他硬件电路都是⽐较常⽤,就不⼀⼀介绍了。
软件流程:⾸先对各个模块进⾏初始化,检测有⽆按键按下,如果按下,则判断是哪⼀个按键,并作出判断,并调⽤相应的按键处理函数。主程序主要由液晶显⽰、串⼝通讯程序和按键程序组成。 (1)主函数
void main()
{
//PSB=0;
UART_Init(); //串⼝初始化
x24c02_init(); //24C02初始化
LcmInit(); //LCD12864初始化
LcmClearTXT(); //LCD12864清屏
while(1)
{
fan();
delay(100);
(2)指纹模块处理程序(部分代码)
点火模块因为源码⽐较⼤,我就不想全都贴出来了,如果需要详细了解源码可下载源码查看(下载链接在⽂章最后)
#define buffer1ID 0x01
#define buffer2ID 0x02
#define queren 0x88 //确认
#define tuichu 0x85 //退出
#define shanchu 0x82 //删除
#define User 1 //⽤户
void fan(); //主界⾯刷指纹管理员函数
sbit B0=B^0;
sbit B7=B^7;
sbit k2=P3^7; //指纹模块
sbit jidianqi=P3^6; //继电器
extern unsigned char times[];
uchar Member=0,sec;
uchar code buffer[User][6]=
{
{"000000"}
};
uchar dz[4];
uchar time[4];
uchar mima[6];
uchar mimag[6];
uchar mimaID[6]={1,2,3,4,5,6};
uchar Address1=20,tempx=20;
uchar Address2=20;
uchar data K;
uchar data Key;
uint PageID;
uchar data querenma=11;
uchar sum[2];
uchar sum[2];
int summaf,summas;
uchar xdata UserPassword[7]={0};//密码
uchar xdata DSY_BUFFER[16] ={0};//缓存
void Red_Init(void);
//检测脉冲宽度
unsigned char check(void);
unsigned char redchange(unsigned char rednum);
void delayms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
硫芥子气
for(y=110;y>0;y--);
}
/******************************************************************** * 名称 : Chack(uchar User_Number)
* 功能 : 单⼀⽤户密码检测
* 输⼊ : User_Number
* 输出 : 密码正确与错误,错误返回0,正确返回1
********************************************************************/ uchar Chack(uchar User_Number)
{
uchar flag, i,temp[6],Address;
Address=User_Number*10;
for(i=0;i<6;i++)
{
temp[i]=x24c02_read(Address);
delayms(10);
Address++;
}
for(i=0;i<6;i++)
{
if(temp[i]==UserPassword[i])
flag=1;
else
flag=0;
}
return flag;
}
/******************************************************************** * 名称 : PassWord_Chack()
* 功能 : 所有⽤户密码检测
* 输⼊ : ⽆
* 输出 : 密码正确与错误,错误返回0,正确返回1
********************************************************************/ uchar PassWord_Chack()
{
uchar i=0;
while(i<User)
{
if(Chack(i)==2)
{
Member=i+2;
return 1;
}
i++;
}
}
return 0;
}
void delay(uint tt)
{ uchar i;
横幅制作
while(tt--)
{
for(i=0;i<125;i++);
}
}
/********************************************************************
* 名称 : UART_Init()
* 功能 : 单⽚机串⼝初始化
* 单⽚机:晶振11.0592MHz 波特率为9600bps
* 指纹模块:波特率为9600bps,
********************************************************************/
void UART_Init()
{
云资源共享
SCON= 0x50; //串⼝⽅式1 //REN=1; 允许接收
PCON=0x01; //SMOD=0
TMOD= 0x01; //定时器1定时⽅式2
TH1= 0xFD; //11.0592MHz 模块默认波特率为9600bps
TL1= 0xFD;
TR0= 1; //启动定时器
EA=1;
}
unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为⾏线 P1.4--P1.7为列线{
unsigned char rcode, ccode;
P1 = 0xF0; // 发全0⾏扫描码,列线输⼊
if((P1&0xF0) != 0xF0) // 若有键按下
{
delay(1);// 延时去抖动
if((P1&0xF0) != 0xF0)
{
rcode = 0xef; // 逐⾏扫描初值
while((rcode&0x10) != 0)
{
P1 = rcode; // 输出⾏扫描码
if((P1&0xF0) != 0xF0) // 本⾏有键按下
{
ccode = (P1&0xF0)|0x0F;
//do{;}
while((P1&0xF0) != 0xF0); //等待键释放
return ((~rcode) + (~ccode)); // 返回键编码
}
else
rcode = (rcode<<1)|0x01; // ⾏扫描码左移⼀位
}
}
}
return 0; // ⽆键按下,返回值为0
}
void KeyDeal(unsigned char Key)
{ //unsigned char n;
if(Key!=0)
{
switch(Key)
{
case 0x12: K=1; break;
手写触摸屏
case 0x22: K=2; break;
case 0x42: K=3; break;
case 0x82: break;