一. 系统概述
智能门禁系统以STM32单片机为核心控制器,系统配备指纹识别模块,能够实现指纹的录入、删除及开锁功能。当正确的指纹被识别后,系统将进行开锁;若未能识别到有效的指纹,系统则会发出警报提醒用户。
二. 仿真概述
- 开锁状态及操作界面通过OLED显示屏进行展示,同时通过虚拟串口模拟指纹识别模块。若输入的指纹数据有效(如11、21、31等),则系统会实现开锁功能。使用的虚拟传感器助手的链接如下:
- 当输入不正确的指纹数据(如41)时,系统会立即报警,阻止开锁。
- 用户按下功能选择按键后,可以选择存储的第一个指纹ID。可通过加减按键选择不同的指纹ID,确认按键后将当前ID的指纹数据更新为新输入的数据。例如,在串口助手中输入41可将其录入ID1。
- 按下确认按键后,新的指纹数据将被保存至ID1,输入41后即可实现开锁。
- 如果再次输入11进行开锁,系统将报警,因为ID1的指纹数据已被更新为41,不再是之前的11。
- 在功能选择中,用户可以选择删除指纹数据,确认删除的是ID1后,点击确定即可删除该指纹。此时,如果再输入之前添加的指纹41,也无法开锁,并会发出警报。
三.程序设计
#include <main.h>
//
u8 Key;//按键检测
u8 s=0;
char Touch[]={0x11,0x21,0x31};
u8 ID=1;
u8 Rxdat;
u8 set=0;
//
//
void Init_Test(void);
void Test(void);
void Display(void);
//
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2:2
Init_Test();
while(1)
{
Key_Scan(&Key);
OLED_ShowString(1,1,"Touch wait");//等待触摸
OLED_ShowString(3,1,"ADD");//添加指纹
OLED_ShowString(4,1,"Delete");//删除指纹
if(Key==3)
{
OLED_ShowString(4,10," ");//删除指纹
set++;
if(set>2) set=0;
Key=0;
ID=1;
}
if(Key==4&&(set==0|set==1))
{
set=0;
Key=0;
}
if( (Key==1|Key==2)&&set!=0)
{
OLED_ShowString(4,10," ");//删除指纹
ID++;
if(ID>3) ID=1;
Key=0;
}
if(set!=0)
{
OLED_ShowString(3,10,"ID:");
OLED_ShowNum(3,13,ID,1);
}
switch(set)
{
case 0:
OLED_ShowString(3,8," ");//添加指纹
OLED_ShowString(4,8," ");//删除指纹
//串口收数据|识别指纹
break;
case 1:
OLED_ShowString(3,8,"<");//添加指纹
OLED_ShowString(4,8," ");
break;
case 2:
OLED_ShowString(3,8," ");
OLED_ShowString(4,8,"<");//删除指纹
//delete
if(Key==4&&set==2)
{
if(ID==1) Touch[0]=0;
else if(ID==2) Touch[1]=0;
else if(ID==3) Touch[2]=0;
OLED_ShowString(4,10,"OK");//删除指纹
Key=0;
}
break;
default: break;
}
if(Usart1_GetRxFlag()==1) //判断是否收到数据
{
Rxdat=Usart1_GetRxDat(); //存数据
printf("收到");
switch(set)
{
case 0:
//Touch wait
for(u8 i=0;i<3;i++)
{
if(Rxdat==Touch[i]) s=1;
}
if(s) { OLED_ShowString(2,1,"Right");LedC1_1; delay_ms(2000); LedC1_0;OLED_ShowString(2,1," ");}
else { OLED_ShowString(2,1,"Error");Beep_1; delay_ms(2000); Beep_0;OLED_ShowString(2,1," ");}
s=0;
Rxdat=0;
break;
case 1:
//ADD
if(ID==1) Touch[0]=Rxdat;
else if(ID==2) Touch[1]=Rxdat;
else if(ID==3) Touch[2]=Rxdat;
OLED_ShowString(4,10,"OK");//删除指纹
Rxdat=0;
break;
default: break;
}
}
}
}
24-32f-44