采用RFID卡模块RC522和正点原子探索者开发板
附件包含工程源码
可以实现
1.通过触摸屏添加、删除人员,允许记录10个人
2.记录100条开门记录
3.能通过串口读到人员记录和开门记录
单片机源程序如下:
- /************************************************************/
- /* 基于stm32的门禁系统 */
- /* 作者:刘昊鑫 */
- /************************************************************/
- // 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]; // 存储卡片类型(0x0400表示卡类型为S50)
- u8 UID[4]; // 存储卡片序列号
- u8 ReadBuf[16]; // 读一个block数据缓冲
- u8 WriteBuf[16]="I Love You! "; // 写一个block数据缓冲
- u8 DefaultKey[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 存储卡扇区密码
- u8 BlockNum=0;
- /**********************************************************/
- /* 寻卡 */
- /**********************************************************/
- u8 SearchCard()
- {
- // 寻卡,返回卡类型(2字节)
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 寻天线区内所有卡
- {
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 寻卡失败,再次寻卡
- {
- PcdHalt(); // 命令IC卡进入休眠
- return SEARCH_ERR; // 再次寻卡失败,返回寻卡错误
- }
- }
-
- // 防冲撞,读卡的序列号(4字节)
- if( PcdAnticoll(UID) != MI_OK )
- {
- PcdHalt(); // 命令IC卡进入休眠
- return CRASH_ERR; // 防冲撞失败,返回防冲撞错误
- }
- // 命令IC卡进入休眠
- PcdHalt();
- return MI_OK;
- }
- /**********************************************************/
- /* 读卡/写卡 */
- /**********************************************************/
- u8 ReadWriteCard(u8 RW, u8 BlockNum, u8* buf)
- {
- // 寻卡,返回卡类型(2字节)
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 寻天线区内所有卡
- {
- if( PcdRequest(PICC_REQALL, CardType) != MI_OK ) // 寻卡失败,再次寻卡
- {
- PcdHalt(); // 命令IC卡进入休眠
- return SEARCH_ERR; // 再次寻卡失败,返回寻卡错误
- }
- }
-
- // 防冲撞,读卡的序列号(4字节)
- if( PcdAnticoll(UID) != MI_OK )
- {
- PcdHalt(); // 命令IC卡进入休眠
- return CRASH_ERR; // 防冲撞失败,返回防冲撞错误
- }
- // 选卡
- if( PcdSelect(UID) != MI_OK )
- {
- PcdHalt(); // 命令IC卡进入休眠
- return SELECT_ERR; // 选卡失败,返回选卡错误
- }
- // 校验卡密码
- if(PcdAuthState(PICC_AUTHENT1A, BlockNum, DefaultKey, UID) != MI_OK)
- {
- PcdHalt(); // 命令IC卡进入休眠
- return AUTHEN_ERR; // 校验卡密码失败,返回密码错误
- }
-
- if(RW==WRITE_CARD)
- {
- // 写卡
- if(PcdWrite(BlockNum, buf) != MI_OK)
- {
- PcdHalt(); // 命令IC卡进入休眠
- return WRITE_ERR; // 写失败,返回写错误
- }
- }
- else if(RW==READ_CARD)
- {
- // 读卡
- if(PcdRead(BlockNum, buf) != MI_OK)
- {
- PcdHalt(); // 命令IC卡进入休眠
- return READ_ERR; // 读失败,返回写错误
- }
- }
-
- // 命令IC卡进入休眠
- PcdHalt();
- return MI_OK;
- }
- /**********************************************************/
- /* 字符转16进制 */
- /**********************************************************/
- 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组件测试函数 */
- /**********************************************************/
- // 设置待读写扇区号
- void SetBlockNum(u8 NewVal)
- {
- BlockNum=NewVal;
- }
- // 设置待写入内容
- 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);//设置系统中断优先级分组2
- delay_init(168); // 初始化延时函数
- uart_init(115200); // 串口初始化
- LED_Init(); // 初始化与LED连接的硬件接口
- LCD_Init(); // 初始化LCD
- KEY_Init(); // 按键初始化
- Init_RC522(); // RC522初始化
- tp_dev.init(); // 初始化触摸屏
- my_mem_init(SRAMIN); //初始化内部内存池
- my_mem_init(SRAMCCM); //初始化CCM内存池
- alientek_ncr_init(); //初始化NCR识别函数
- Init_ID(); //初始化用户表
- My_RTC_Init(); //初始化RTC时钟
- POINT_COLOR=RED; //设置字体为红色
- 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");
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
门禁系统.rar
(750.55 KB, 下载次数: 131)
|