BD網(wǎng)盤鏈接:
https://pan.baidu.com/s/1lJbXZsBnEBjsz5bCfKRoQA?pwd=kq5a
提取碼:kq5a
一、實驗簡介
基于CW32單片機的門禁綜合系統(tǒng)是一款功能強大的智能門禁解決方案,它提供了三種開鎖方式:密碼開鎖、指紋開鎖和刷卡開鎖,為用戶提供方便、安全的門禁控制。該系統(tǒng)的核心控制器采用了CW32單片機,具備高性能和可靠性,能夠穩(wěn)定地運行門禁系統(tǒng)的各項功能。
密碼開鎖是最常見的開鎖方式之一。用戶可以通過系統(tǒng)提供的密碼輸入界面,輸入正確的密碼來解鎖門禁系統(tǒng)。這種方式簡單明了,適用于多種場景。指紋開鎖是一種更加安全、個性化的開鎖方式。系統(tǒng)可以保存多個用戶的指紋信息,用戶只需將手指放在指紋識別器上進行驗證,合法的指紋即可解鎖門禁系統(tǒng)。這種方式便于用戶快速、準(zhǔn)確地開鎖,并且具有很高的安全性,因為指紋信息是獨一無二的。刷卡開鎖是另一種常見的開鎖方式。系統(tǒng)配備了IC卡讀卡器,用戶只需通過刷卡即可進行開鎖。IC卡可以根據(jù)實際需求進行添加和刪除,非常方便管理和控制用戶的權(quán)限。除了這三種開鎖方式,該系統(tǒng)還提供了自主修改密碼和添加刪除指紋、IC卡的功能。管理員可以通過系統(tǒng)設(shè)置界面輕松地修改密碼,添加或刪除用戶的指紋和IC卡信息,確保安全性。
二、實驗器材
本實驗使用到了CW32-48F大學(xué)計劃開發(fā)板、RC522刷卡模塊、AS608指紋模塊、繼電器、薄膜鍵盤及Keil5開發(fā)環(huán)境。
CW32-48F大學(xué)計劃板
RC522刷卡模塊
AS608指紋模塊
繼電器模塊
薄膜鍵盤
實物圖
三、接線
開發(fā)板上預(yù)留了矩陣鍵盤接口
【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:
/*函數(shù)聲明*/
void KEY_Proc(void); //按鍵處理函數(shù)
void RC522_Proc(void); //刷卡處理函數(shù)
void AS608_Proc(void); //指紋處理函數(shù)
void System_Init(void); //系統(tǒng)初始化函數(shù)
void Passport_Proc(void); //密碼處理函數(shù)
void System_Reload(void); //系統(tǒng)重置函數(shù)
void Mode_Interface(void); //模式切換界面
void Work_Interface(void); //工作界面
void Buzzer_Ring(uint8_t ms); //蜂鳴器函數(shù)
_Bool Indentity_Verify(void); //身份驗證函數(shù)
void Init_MyStruct(id* mystructure); //結(jié)構(gòu)體初始化函數(shù)
/*主程序*/
int main()
{
System_Init(); //系統(tǒng)初始化
Mode_Interface(); //上電進入模式選擇界面
while(1)
{
KEY_Proc(); //按鍵處理
RC522_Proc(); //刷卡處理
AS608_Proc(); //指紋處理
Passport_Proc(); //密碼處理
}
}
/*子程序*/
void System_Init(void) //系統(tǒng)初始化函數(shù)
{
__NVIC_SetPriority(BTIM2_IRQn,0); //BTIM2高優(yōu)先級
__NVIC_SetPriority(BTIM1_IRQn,1); //BTIM1低優(yōu)先級
Lcd_Init(); //屏幕初始化
BTIM1_Init(); //定時器初始化
BTIM2_Init();
Relay_Init(); //繼電器初始化
RC522_Init(); //刷卡模塊初始化
Matrix_Init(); //薄膜鍵盤初始化
Buzzer_Init(); //蜂鳴器初始化
Lcd_Clear(BLACK); //清屏
UART2_Init(57600); //AS608指紋模塊串口初始化
Init_MyStruct(&card); //卡片結(jié)構(gòu)體初始化
AS608_WAK_GPIO_Init(); //AS608手指感應(yīng)初始化
}
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) //三種解鎖模式循環(huán)顯示
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) //按鍵處理函數(shù)
{
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; //系統(tǒng)重置
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; //關(guān)閉信息提示
}
}
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]; //使用異或判斷輸入的密碼與設(shè)置的密碼是否一致
if(result==0) //密碼正確
{
Relay_Flag=1; //繼電器標(biāo)識打開
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) //等待按鍵輸入(確認(rèn)/取消)
{
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') //鍵入:確認(rèn)
{
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); //執(zhí)行成功提示音
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); //執(zhí)行成功提示音
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); //執(zhí)行成功提示音
TFTShowString(6,0," ");
}
}
void System_Reload(void) //重置系統(tǒng),恢復(fù)到上電默認(rèn)的狀態(tài)
{
idx=0;
Mode=0;
start=0;
method=0;
while(Relay_Flag);
Lcd_Clear(BLACK);
Mode_Interface();
}
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
455文章
50816瀏覽量
423663 -
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635353 -
門禁
+關(guān)注
關(guān)注
1文章
168瀏覽量
29718 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5050瀏覽量
97482 -
CW32
+關(guān)注
關(guān)注
1文章
203瀏覽量
645 -
武漢芯源
+關(guān)注
關(guān)注
1文章
66瀏覽量
256
發(fā)布評論請先 登錄
相關(guān)推薦
評論