简介
上面一篇文章已经将指纹模块的驱动原理讲解明白,本文就详细介绍以下整个系统是如何实现的。
实现功能
系统要求如下:
1)使用RC522与指纹模块控制门的打开
2)添加IC卡和指纹数据
3)语音播报状态
4)显示屏显示状态
系统整体流程图
主函数流程图
模式切换的设计思路
如何实现模式的切换可以使用按键修改一个变量的数据,按键每次按下将此变量的值+1。本系统中的模式的切换实现代码如下所示:
//外部中断0的服务函数
void EXTI0_IRQHandler(void)
{
delay_ms(15);//按键消抖
if(KEY1==0) //PE0
{
MODE_AS608++;//模式标志位+1
if(MODE_AS608>=3)//限制模式为3种
{
MODE_AS608=0;
}
}
EXTI_ClearITPendingBit(EXTI_Line0); //清楚中断标志位
}
//外部中断1的服务函数
void EXTI1_IRQHandler(void)
{
delay_ms(15);//按键消抖
if(KEY2==0) //PE1
{
MODE_AS608--;//模式标志位-1
if(MODE_AS608<0||MODE_AS608>=3){//限制模式为3种
MODE_AS608=0;
}
}
EXTI_ClearITPendingBit(EXTI_Line1); //清楚中断标志位
}
三种模式的设计思路
首先需要明确采集部分,本系统的采集主要是RC522读取IC卡号以及指纹模块读取指纹。整个系统的运行模式一共分为3种模式:
1)匹配模式;RC522读取ID卡并判断卡号是否符合,指纹模块在其自带的Flash种搜索采集的指纹是否匹配。若符合其中任意一个就打开门;
2)指纹添加模式;就是添加指纹到其自带的Flash中;
3)IC卡号添加模式;添加已经存储过的IC卡号。
模式一的设计与实现
首先需要明确在该模式下需要执行读卡匹配以及控制指纹模块进行识别和匹配,为了使该模式执行的实时性所以需要将读卡匹配的代码放在定时器中断中,将控制指纹模块进行识别和匹配放在循环中执行。
1)读卡匹配
将读卡匹配的代码放在定时器中断中执行,定时器中断服务函数如下所示:
void TIM4_IRQHandler(void) //TIM4中断
{
char status;
char data[20];
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
//内容
status= PcdRequest(REQ_ALL,TagType); //寻卡
if(!status)
{
status = PcdAnticoll(SelectedSnr); //防碰撞
if(!status)
{
if((IT&0x40)==0x00){
sprintf(data,"%d%d%d%d",SelectedSnr[0],SelectedSnr[1],SelectedSnr[2],SelectedSnr[3]);//读到的值放入data数组中
if(strcmp(data,id[0].ID)==0||strcmp(data,id[1].ID)==0||strcmp(data,id[2].ID)==0||strcmp(data,id[3].ID)==0||strcmp(data,id[4].ID)==0){//查询成功
Gui_DrawFont_GBK16(0,60,BLUE,GRAY0," Open Door ");//显示
TIM_SetCompare2(TIM3,1950);//舵机开门
delay_ms(1000);//延时
}
else{
//查询失败
Gui_DrawFont_GBK16(0,60,BLUE,GRAY0," Find No ");//显示
TIM_SetCompare2(TIM3,1750);//舵机关门
delay_ms(1000);//延时
}
WaitCardOff(); //等待卡离开
Lcd_Clear(GRAY0);//显示屏清楚
delay_ms(1000);//延时
delay_ms(500);//延时
TIM_SetCompare2(TIM3,1750);//舵机转动关门
}
}
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除TIM4的中断待处理位:TIM 中断源
}
}
2)控制指纹模块进行识别和匹配
在主循环中加入指纹模块的控制代码,详细代码如下所示:
switch(MODE_AS608){
case 0:
//指纹搜索模式
Gui_DrawFont_GBK16(0,0,BLUE,GRAY0," Matching FR ");
IT&=0xBF;//打开IC卡搜索
if(AS_WAK){//检测到手指
Search_FingerMat();
}
break;
}
模式二的设计与实现
添加指纹的代码将放在主函数中,在添加指纹模式下,不能让IC卡的搜索还开着所以需要关闭IC卡的搜索。(IC卡的搜索在定时器中)
case 1:
//单次录入模式
IT|=0x40;//关闭IC搜索模式(这里可以直接关闭定时器)
Gui_DrawFont_GBK16(0,0,BLUE,GRAY0," One In F ");
if(AS_WAK){
Input_Fingerprint(Start_Address);//录入指纹
Start_Address++;//存储地址+1
if(Start_Address>10){//限制最大存储人数
Start_Address=1;
}
}
break;
模式三的设计与实现
添加IC卡号,也需要关闭在定时器中执行的IC卡搜索代码。详细代码如下:
case 2:
//IC卡号录入
IT|=0x40;//关闭IC搜索模式(这里可以直接关闭定时器)
Gui_DrawFont_GBK16(0,0,BLUE,GRAY0," In R ");//显示
status= PcdRequest(REQ_ALL,TagType); //寻卡
if(!status)
{
status = PcdAnticoll(SelectedSnr); //防碰撞
if(!status)
{
sprintf(data,"%d%d%d%d",SelectedSnr[0],SelectedSnr[1],SelectedSnr[2],SelectedSnr[3]);
// printf("%s",data);
Gui_DrawFont_GBK16(0,60,BLUE,GRAY0," Successfuly ");//存储数据成功
ID_Count++;//存储地址+1
memcpy(id[ID_Count].ID,data,sizeof(data));
if(ID_Count>10){//限制最大存储数量
ID_Count=1;
}
WaitCardOff(); //等待卡离开
Lcd_Clear(GRAY0);
}
}
break;
总结
在主函数中,主要是执行模式的切换任务。判断MODE_AS608的值系统进入不同的模式中,通过按键修改MODE_AS608的值。AS_WAK这是一个主要用来读取指纹模块的一个引脚状态,该引脚的功能是当有手指放在指纹模块上时会输出高电平。