例程資料鏈接如下(群文件也可下載):
BD網(wǎng)盤鏈接:
https://pan.baidu.com/s/1lJbXZsBnEBjsz5bCfKRoQA?pwd=kq5a
提取碼:kq5a
一、實(shí)驗(yàn)簡(jiǎn)介
基于CW32單片機(jī)的門禁綜合系統(tǒng)是一款功能強(qiáng)大的智能門禁解決方案,它提供了三種開鎖方式:密碼開鎖、指紋開鎖和刷卡開鎖,為用戶提供方便、安全的門禁控制。該系統(tǒng)的核心控制器采用了CW32單片機(jī),具備高性能和可靠性,能夠穩(wěn)定地運(yùn)行門禁系統(tǒng)的各項(xiàng)功能。
密碼開鎖是最常見的開鎖方式之一。用戶可以通過系統(tǒng)提供的密碼輸入界面,輸入正確的密碼來解鎖門禁系統(tǒng)。這種方式簡(jiǎn)單明了,適用于多種場(chǎng)景。指紋開鎖是一種更加安全、個(gè)性化的開鎖方式。系統(tǒng)可以保存多個(gè)用戶的指紋信息,用戶只需將手指放在指紋識(shí)別器上進(jìn)行驗(yàn)證,合法的指紋即可解鎖門禁系統(tǒng)。這種方式便于用戶快速、準(zhǔn)確地開鎖,并且具有很高的安全性,因?yàn)橹讣y信息是獨(dú)一無二的。刷卡開鎖是另一種常見的開鎖方式。系統(tǒng)配備了IC卡讀卡器,用戶只需通過刷卡即可進(jìn)行開鎖。IC卡可以根據(jù)實(shí)際需求進(jìn)行添加和刪除,非常方便管理和控制用戶的權(quán)限。除了這三種開鎖方式,該系統(tǒng)還提供了自主修改密碼和添加刪除指紋、IC卡的功能。管理員可以通過系統(tǒng)設(shè)置界面輕松地修改密碼,添加或刪除用戶的指紋和IC卡信息,確保安全性。
二、實(shí)驗(yàn)器材
本實(shí)驗(yàn)使用到了CW32-48F大學(xué)計(jì)劃開發(fā)板、RC522刷卡模塊、AS608指紋模塊、繼電器、薄膜鍵盤及Keil5開發(fā)環(huán)境。
CW32-48F大學(xué)計(jì)劃板
RC522刷卡模塊
AS608指紋模塊
繼電器模塊
薄膜鍵盤
實(shí)物圖
三、接線
開發(fā)板上預(yù)留了矩陣鍵盤接口
【RC522刷卡模塊與單片機(jī)接線】:
VCC -- 3.3V
GND -- GND
RST -- PB9
SCK -- PA11
SDA -- PA10
IRQ -- ×
MOSI -- PA12
MISO -- PA15
【AS608指紋模塊與單片機(jī)接線】:
紅線 -- 3.3V
黃線 -- PA3
黑線 -- GND
綠線 -- 3.3V
藍(lán)線 -- PC15
【繼電器模塊與單片機(jī)接線】:
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); //身份驗(yàn)證函數(shù)
void Init_MyStruct(id* mystructure); //結(jié)構(gòu)體初始化函數(shù)
/*主程序*/
int main()
{
System_Init(); //系統(tǒng)初始化
Mode_Interface(); //上電進(jìn)入模式選擇界面
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)先級(jí)
__NVIC_SetPriority(BTIM1_IRQn,1); //BTIM1低優(yōu)先級(jí)
Lcd_Init(); //屏幕初始化
BTIM1_Init(); //定時(shí)器初始化
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); //進(jìn)入用戶模式的密碼界面
}
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)識(shí)打開
PB01_SETHIGH(); //開鎖
TFTShowString(7,0," ");
TFTShowString(8,4,"Unlocked");
}
else //密碼錯(cuò)誤
{
TFTShowString(7,0," ");
Gui_DrawFont_GBK16(5,128,WHITE,BLACK," Error ");
Buzzer_Ring(60); //錯(cuò)誤提示音
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); //錯(cuò)誤提示音
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) //識(shí)別到卡
{
if((memcmp(card.uid0,uc_uid,sizeof(uc_uid))==0) || //檢索ic序列號(hào)
(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); //錯(cuò)誤提示音
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序列號(hào)
else if(RC522_ReadIDTest(card.uid0)!=MI_OK) return; //添加ic卡0序列號(hào)
}
else if(Card_ID==1)
{
if(uc_temp=='R') memset(card.uid1,0,sizeof(card.uid1)); //刪除ic卡1序列號(hào)
else if(RC522_ReadIDTest(card.uid1)!=MI_OK) return; //添加ic卡1序列號(hào)
}
else if(Card_ID==2)
{
if(uc_temp=='R') memset(card.uid2,0,sizeof(card.uid2)); //刪除ic卡2序列號(hào)
else if(RC522_ReadIDTest(card.uid2)!=MI_OK) return; //添加ic卡2序列號(hào)
}
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)注
459文章
52172瀏覽量
436130 -
單片機(jī)
+關(guān)注
關(guān)注
6063文章
44916瀏覽量
646913 -
門禁
+關(guān)注
關(guān)注
1文章
173瀏覽量
30036 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5514瀏覽量
102260 -
CW32
+關(guān)注
關(guān)注
1文章
242瀏覽量
1093 -
武漢芯源
+關(guān)注
關(guān)注
1文章
67瀏覽量
427
發(fā)布評(píng)論請(qǐng)先 登錄
祝賀武漢芯源半導(dǎo)體CW32生態(tài)社區(qū)榮獲立創(chuàng)開源硬件平臺(tái)&quot;優(yōu)質(zhì)合作社區(qū)&quot;榮譽(yù)!

武漢芯源半導(dǎo)體CW32L010在兩輪車儀表的應(yīng)用介紹
【CW32模塊使用】0.96寸IIC單色屏

【CW32模塊使用】SG90舵機(jī)

代碼+案例+生態(tài):武漢芯源半導(dǎo)體CW32嵌入式開發(fā)實(shí)戰(zhàn)正式出版

代碼+案例+生態(tài):武漢芯源半導(dǎo)體CW32嵌入式開發(fā)實(shí)戰(zhàn)正式出版
CW32模塊使用 紅外接收模塊

如何選擇合適的人臉門禁系統(tǒng)?人臉打卡門禁哪款好?

基于CW32模塊的火焰?zhèn)鞲衅髟O(shè)計(jì)


武漢芯源半導(dǎo)體CW32芯片重慶地區(qū)線下技術(shù)交流會(huì)成功舉辦
認(rèn)識(shí)機(jī)器人與CW32四足機(jī)器人控制項(xiàng)目
CW32模塊使用 指紋識(shí)別傳感器

評(píng)論