|
采用RFID卡模塊RC522和正點(diǎn)原子探索者開發(fā)板
附件包含工程源碼
可以實(shí)現(xiàn)
1.通過觸摸屏添加、刪除人員,允許記錄10個(gè)人
2.記錄100條開門記錄
3.能通過串口讀到人員記錄和開門記錄
單片機(jī)源程序如下:
- /************************************************************/
- /* 基于stm32的門禁系統(tǒng) */
- /* 作者:劉昊鑫 */
- /************************************************************/
- // PB3: SCK
- // PB4: MISO
- // PB5: MOSI
- // PA1: RST
- // PA4: NSS
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "RC522.h"
- #include "task.h"
- #include "string.h"
- #include "malloc.h"
- #include "touch.h"
- #include "atk_ncr.h"
- #include "rtc.h"
- u8 CardType[2]; // 存儲(chǔ)卡片類型(0x0400表示卡類型為S50)
- u8 UID[4]; // 存儲(chǔ)卡片序列號(hào)
- u8 ReadBuf[16]; // 讀一個(gè)block數(shù)據(jù)緩沖
- u8 WriteBuf[16]="I Love You! "; // 寫一個(gè)block數(shù)據(jù)緩沖
- u8 DefaultKey[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 存儲(chǔ)卡扇區(qū)密碼
- u8 BlockNum=0;
- /**********************************************************/
- /* 尋卡 */
- /**********************************************************/
- u8 SearchCard()
- {
- // 尋卡,返回卡類型(2字節(jié))
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 尋天線區(qū)內(nèi)所有卡
- {
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 尋卡失敗,再次尋卡
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return SEARCH_ERR; // 再次尋卡失敗,返回尋卡錯(cuò)誤
- }
- }
-
- // 防沖撞,讀卡的序列號(hào)(4字節(jié))
- if( PcdAnticoll(UID) != MI_OK )
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return CRASH_ERR; // 防沖撞失敗,返回防沖撞錯(cuò)誤
- }
- // 命令I(lǐng)C卡進(jìn)入休眠
- PcdHalt();
- return MI_OK;
- }
- /**********************************************************/
- /* 讀卡/寫卡 */
- /**********************************************************/
- u8 ReadWriteCard(u8 RW, u8 BlockNum, u8* buf)
- {
- // 尋卡,返回卡類型(2字節(jié))
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 尋天線區(qū)內(nèi)所有卡
- {
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 尋卡失敗,再次尋卡
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return SEARCH_ERR; // 再次尋卡失敗,返回尋卡錯(cuò)誤
- }
- }
-
- // 防沖撞,讀卡的序列號(hào)(4字節(jié))
- if( PcdAnticoll(UID) != MI_OK )
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return CRASH_ERR; // 防沖撞失敗,返回防沖撞錯(cuò)誤
- }
- // 選卡
- if( PcdSelect(UID) != MI_OK )
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return SELECT_ERR; // 選卡失敗,返回選卡錯(cuò)誤
- }
- // 校驗(yàn)卡密碼
- if(PcdAuthState(PICC_AUTHENT1A, BlockNum, DefaultKey, UID) != MI_OK)
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return AUTHEN_ERR; // 校驗(yàn)卡密碼失敗,返回密碼錯(cuò)誤
- }
-
- if(RW==WRITE_CARD)
- {
- // 寫卡
- if(PcdWrite(BlockNum, buf) != MI_OK)
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return WRITE_ERR; // 寫失敗,返回寫錯(cuò)誤
- }
- }
- else if(RW==READ_CARD)
- {
- // 讀卡
- if(PcdRead(BlockNum, buf) != MI_OK)
- {
- PcdHalt(); // 命令I(lǐng)C卡進(jìn)入休眠
- return READ_ERR; // 讀失敗,返回寫錯(cuò)誤
- }
- }
-
- // 命令I(lǐng)C卡進(jìn)入休眠
- PcdHalt();
- return MI_OK;
- }
- /**********************************************************/
- /* 字符轉(zhuǎn)16進(jìn)制 */
- /**********************************************************/
- void CharToHex(char* dest, u8* src, u8 n)
- {
- u8 i;
- u8 temp;
- for(i=0; i<n; i++)
- {
- temp=(*src)>>4; // 換算高4位
- if(temp<10)
- *dest = 0x30 + temp; // 0~9
- else if(temp<16)
- *dest = 0x41 + temp - 10; // A~F
- else
- *dest = '&'; // 無效
-
- dest++;
- temp=(*src)&0x0F; // 換算低4位
- if(temp<10)
- *dest = 0x30 + temp; // 0~9
- else if(temp<16)
- *dest = 0x41 + temp - 10; // A~F
- else
- *dest = '&'; // 無效
-
- dest++;
- src++;
- }
- *dest='\0';
- }
- /**********************************************************/
- /* USMART組件測(cè)試函數(shù) */
- /**********************************************************/
- // 設(shè)置待讀寫扇區(qū)號(hào)
- void SetBlockNum(u8 NewVal)
- {
- BlockNum=NewVal;
- }
- // 設(shè)置待寫入內(nèi)容
- void SetString(u8* str)
- {
- u8 i;
- for(i=0; i<16; i++)
- *(WriteBuf+i)=*(str+i);
- }
- int main(void)
- {
- u8 KeyMapValue;
- int i;
- char ptr[9];
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(168); // 初始化延時(shí)函數(shù)
- uart_init(115200); // 串口初始化
- LED_Init(); // 初始化與LED連接的硬件接口
- LCD_Init(); // 初始化LCD
- KEY_Init(); // 按鍵初始化
- Init_RC522(); // RC522初始化
- tp_dev.init(); // 初始化觸摸屏
- my_mem_init(SRAMIN); //初始化內(nèi)部?jī)?nèi)存池
- my_mem_init(SRAMCCM); //初始化CCM內(nèi)存池
- alientek_ncr_init(); //初始化NCR識(shí)別函數(shù)
- Init_ID(); //初始化用戶表
- My_RTC_Init(); //初始化RTC時(shí)鐘
- POINT_COLOR=RED; //設(shè)置字體為紅色
- LCD_ShowString(20,40,200,16,16, "welcome to use the system");
- LCD_ShowString(20,70,200,16,16, "please put your card");
- POINT_COLOR=MAGENTA;
- LCD_ShowString(40,230,200,16,16, "Card S/N: 0x00000000");
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
門禁系統(tǒng).rar
(750.55 KB, 下載次數(shù): 132)
2018-1-24 02:02 上傳
點(diǎn)擊文件名下載附件
源碼
|
評(píng)分
-
查看全部評(píng)分
|