例程资料链接如下(群文件也可下载):
BD网盘链接:
https://pan.baidu.com/s/1lJbXZsBnEBjsz5bCfKRoQA?pwd=kq5a
提取码:kq5a
一、实验简介
基于CW32单片机的门禁综合系统是一款功能强大的智能门禁解决方案,它提供了三种开锁方式:密码开锁、指纹开锁和刷卡开锁,为用户提供方便、安全的门禁控制。该系统的核心控制器采用了CW32单片机,具备高性能和可靠性,能够稳定地运行门禁系统的各项功能。
密码开锁是最常见的开锁方式之一。用户可以通过系统提供的密码输入界面,输入正确的密码来解锁门禁系统。这种方式简单明了,适用于多种场景。指纹开锁是一种更加安全、个性化的开锁方式。系统可以保存多个用户的指纹信息,用户只需将手指放在指纹识别器上进行验证,合法的指纹即可解锁门禁系统。这种方式便于用户快速、准确地开锁,并且具有很高的安全性,因为指纹信息是独一无二的。刷卡开锁是另一种常见的开锁方式。系统配备了IC卡读卡器,用户只需通过刷卡即可进行开锁。IC卡可以根据实际需求进行添加和删除,非常方便管理和控制用户的权限。除了这三种开锁方式,该系统还提供了自主修改密码和添加删除指纹、IC卡的功能。管理员可以通过系统设置界面轻松地修改密码,添加或删除用户的指纹和IC卡信息,确保安全性。
二、实验器材
本实验使用到了CW32-48F大学计划开发板、RC522刷卡模块、AS608指纹模块、继电器、薄膜键盘及Keil5开发环境。
CW32-48F大学计划板
RC522刷卡模块
AS608指纹模块
继电器模块
薄膜键盘
实物图
三、接线
开发板上预留了矩阵键盘接口
【RC522刷卡模块与单片机接线】:
VCC -- 3.3V
GND -- GND
RST -- PB9
SCK -- PA11
SDA -- PA10
IRQ -- ×
MOSI -- PA12
MISO -- PA15
【AS608指纹模块与单片机接线】:
红线 -- 3.3V
黄线 -- PA3
黑线 -- GND
绿线 -- 3.3V
蓝线 -- PC15
【继电器模块与单片机接线】:
VCC -- 3.3V
GND -- GND
OUT -- PB1
四、核心代码
main.c:
/*函数声明*/
void KEY_Proc(void); //按键处理函数
void RC522_Proc(void); //刷卡处理函数
void AS608_Proc(void); //指纹处理函数
void System_Init(void); //系统初始化函数
void Passport_Proc(void); //密码处理函数
void System_Reload(void); //系统重置函数
void Mode_Interface(void); //模式切换界面
void Work_Interface(void); //工作界面
void Buzzer_Ring(uint8_t ms); //蜂鸣器函数
_Bool Indentity_Verify(void); //身份验证函数
void Init_MyStruct(id* mystructure); //结构体初始化函数
/*主程序*/
int main()
{
System_Init(); //系统初始化
Mode_Interface(); //上电进入模式选择界面
while(1)
{
KEY_Proc(); //按键处理
RC522_Proc(); //刷卡处理
AS608_Proc(); //指纹处理
Passport_Proc(); //密码处理
}
}
/*子程序*/
void System_Init(void) //系统初始化函数
{
__NVIC_SetPriority(BTIM2_IRQn,0); //BTIM2高优先级
__NVIC_SetPriority(BTIM1_IRQn,1); //BTIM1低优先级
Lcd_Init(); //屏幕初始化
BTIM1_Init(); //定时器初始化
BTIM2_Init();
Relay_Init(); //继电器初始化
RC522_Init(); //刷卡模块初始化
Matrix_Init(); //薄膜键盘初始化
Buzzer_Init(); //蜂鸣器初始化
Lcd_Clear(BLACK); //清屏
UART2_Init(57600); //AS608指纹模块串口初始化
Init_MyStruct(&card); //卡片结构体初始化
AS608_WAK_GPIO_Init(); //AS608手指感应初始化
}
void Mode_Interface(void) //用户管理模式界面
{
Lcd_Clear(BLACK);
TFT_User(); //用户模式界面
while(start==0)
{
if(Key_Scan()!='.')
{
KEY_Proc();
if(Mode==0)
TFT_User(); //用户模式界面
else if(Mode==1)
TFT_Administrator(); //管理模式界面
}
}
method=0; //解锁模式0:密码解锁
TFT_Passport(Mode); //进入用户模式的密码界面
}
void Work_Interface() //工作界面
{
if(method==3) //三种解锁模式循环显示
method=0;
else if(method >3)
method=2;
if(method==0)
TFT_Passport(Mode); //密码解锁
else if(method==1)
TFT_Fingerprint(Mode); //指纹解锁
else if(method==2)
TFT_Card(Mode); //刷卡解锁
}
void KEY_Proc(void) //按键处理函数
{
if(!exert_flag)
return;
temp=Key_Scan(); //读取键值
exert_flag=0;
if(temp=='.')
return;
switch(temp)
{
case 'F': if(start) return; Mode=0; break; //用户模式
case 'f': if(start) return; Mode=1; break; //管理模式
case '#': if(Mode==0) start=1; else {if(Indentity_Verify()==0) start=1;} break; //开始工作
case '*': if(!start) return; start=0; System_Reload(); break; //系统重置
case '(': if(!start) return; method-=1; Work_Interface(); break; //切换解锁方式
case ')': if(!start) return; method+=1; Work_Interface(); break; //切换解锁方式
case '+': if(start==0) Tips_Open=1; break; //打开信息提示
case '-': if(start==0) Tips_Open=0; break; //关闭信息提示
}
}
void Passport_Proc(void) //密码处理
{
uint8_t i=0;
uint8_t result=0;
char uc_temp='.';
if(method!=0) {idx=0; return;} //解锁模式0:密码解锁
if(Passport_Input(uc_passport,PASSPORT_LENGTH)==0) return; //判断密码输入是否完成
if(Mode==0) //用户模式
{
for(i=0;i< PASSPORT_LENGTH;i++)
result+=uc_passport[i]^passport[i]; //使用异或判断输入的密码与设置的密码是否一致
if(result==0) //密码正确
{
Relay_Flag=1; //继电器标识打开
PB01_SETHIGH(); //开锁
TFTShowString(7,0," ");
TFTShowString(8,4,"Unlocked");
}
else //密码错误
{
TFTShowString(7,0," ");
Gui_DrawFont_GBK16(5,128,WHITE,BLACK," Error ");
Buzzer_Ring(60); //错误提示音
Delay_ms(500);
TFTShowString(8,0," ");
}
}
else //管理模式
{
TFTShowString(5,2,"Esc: concel ");
TFTShowString(7,2,"Ent: comfirm");
while(1) //等待按键输入(确认/取消)
{
uc_temp=Key_Scan();
exert_flag2=0;
if(uc_temp=='R') //键入:取消
{
Buzzer_Ring(120); //操作提示音
TFTShowString(5,2," ");
TFTShowString(7,2," ");
TFTShowString(6,2," set concel ");
Delay_ms(500);
TFTShowString(6,2," ");
break;
}
else if(uc_temp=='E') //键入:确认
{
Buzzer_Ring(120); //操作提示音
TFTShowString(5,2," ");
TFTShowString(7,2," ");
memcpy(passport,uc_passport,sizeof(uc_passport)); //覆盖开锁密码
TFTShowString(6,2,"set succeed ");
Delay_ms(500);
TFTShowString(6,2," ");
break;
}
}
}
}
void AS608_Proc(void) //指纹处理
{
char uc_temp='.';
if(method!=1) return; //解锁模式1:指纹解锁
if(Mode==0) //用户模式
{
if(AS608_PressTest()==0) //按下
{
if(AS608_MatchTest()==0) //匹配
{
PB01_SETHIGH(); //开锁
Relay_Flag=1;
TFTShowString(8,4,"Unlocked");
}
else if(!Relay_Flag)
{
TFTShowString(7,0," ");
Gui_DrawFont_GBK16(3,128,WHITE,BLACK," Error ");
Buzzer_Ring(60); //错误提示音
Delay_ms(500);
TFTShowString(8,0," ");
}
}
}
else
{
TFTShowString(7,3,"Esc: Delet ");
if(!exert_flag2) return;
uc_temp=Key_Scan();
exert_flag2=0;
if(AS608_AddTest(Finger_ID)==0) //添加指纹
{
Buzzer_Ring(120); //执行成功提示音
TFTShowString(6,1," Add succeeded");
Delay_ms(500);
TFTShowString(6,0," ");
}
if(uc_temp<=validFinger_num) //键入:id
{
Finger_ID=uc_temp;
TFT_Fingerprint(MANAGE_MODE);
}
else if(uc_temp=='R') //键入:删除
{
if(PS_DeletOneChar(Finger_ID)==0) //删除
{
Buzzer_Ring(120); //执行成功提示音
TFTShowString(6,1,"Delet succeeded");
Delay_ms(500);
TFTShowString(6,0," ");
}
}
}
}
void RC522_Proc(void) //刷卡处理
{
char uc_temp='.';
uint8_t uc_uid[4]={0};
if(method!=2) return; //解锁模式2:刷卡解锁
if(Mode==0) //用户模式
{
if(RC522_ReadIDTest(uc_uid)==0) //识别到卡
{
if((memcmp(card.uid0,uc_uid,sizeof(uc_uid))==0) || //检索ic序列号
(memcmp(card.uid1,uc_uid,sizeof(uc_uid))==0) ||
(memcmp(card.uid2,uc_uid,sizeof(uc_uid))==0)
)
{
PB01_SETHIGH(); //开锁
Relay_Flag=1;
TFTShowString(8,4,"Unlocked");
}
else
{
TFTShowString(7,0," ");
Gui_DrawFont_GBK16(0,128,WHITE,BLACK," Error ");
Buzzer_Ring(60); //错误提示音
Delay_ms(500);
TFTShowString(8,0," ");
}
}
}
else
{
TFTShowString(7,3,"Esc: Delet ");
if(!exert_flag2) return;
uc_temp=Key_Scan();
exert_flag2=0;
if(uc_temp< validCard_num) //键入:id
{
Card_ID=uc_temp;
TFT_Card(MANAGE_MODE);
}
if(Card_ID==0)
{
if(uc_temp=='R') memset(card.uid0,0,sizeof(card.uid0)); //删除ic卡0序列号
else if(RC522_ReadIDTest(card.uid0)!=MI_OK) return; //添加ic卡0序列号
}
else if(Card_ID==1)
{
if(uc_temp=='R') memset(card.uid1,0,sizeof(card.uid1)); //删除ic卡1序列号
else if(RC522_ReadIDTest(card.uid1)!=MI_OK) return; //添加ic卡1序列号
}
else if(Card_ID==2)
{
if(uc_temp=='R') memset(card.uid2,0,sizeof(card.uid2)); //删除ic卡2序列号
else if(RC522_ReadIDTest(card.uid2)!=MI_OK) return; //添加ic卡2序列号
}
if(uc_temp=='R') TFTShowString(6,1,"Delet succeeded");
else TFTShowString(6,1," Add succeeded");
Buzzer_Ring(120);
Delay_ms(500); //执行成功提示音
TFTShowString(6,0," ");
}
}
void System_Reload(void) //重置系统,恢复到上电默认的状态
{
idx=0;
Mode=0;
start=0;
method=0;
while(Relay_Flag);
Lcd_Clear(BLACK);
Mode_Interface();
}
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !