1 系统功能介绍
本设计是一套基于 STC89C52 单片机 的射频 RFID 卡考勤与人数统计系统,可应用于教室、公司等需要考勤管理的场所。系统通过射频识别模块(RFID)读取预设卡片的身份信息,实现人员的自动识别与到勤统计,并结合液晶显示与蜂鸣器报警功能,能够快速判断到勤人数是否符合要求,从而提升管理效率。
系统主要功能如下:
-
RFID 身份识别
系统配备 3 张预设的射频卡,分别代表张三、李四、王二三位用户。当任意一张卡刷卡成功时,单片机能够识别其身份,并在 LCD 上对应位置显示 “有人”,未签到的显示为空格。 -
人数统计
LCD 的第二行会实时显示已签到人数,实现到勤人数的动态统计。 -
上课(上班)检测功能
按下按键进入上课模式,如果签到人数与总人数不一致,则蜂鸣器发出报警,提示有人员未到场。 -
声光提示
当有新人员刷卡成功时,蜂鸣器发出短促提示音;上课模式下人数不全时蜂鸣器发出持续报警音。
2 系统电路设计
2.1 单片机最小系统
本系统核心为 STC89C52 单片机,其最小系统包括:
- 时钟电路:外接 12MHz 晶振和 30pF 电容,保证 MCU 稳定运行。
- 复位电路:采用按键和上拉电阻构成,上电自动复位,并支持人工复位。
- 电源电路:DC 5V 供电,配合滤波电容降低干扰。
该模块负责 RFID 数据处理、LCD 显示控制、按键识别及蜂鸣器驱动。
2.2 RFID 模块电路
RFID 模块用于读取射频卡的 ID 号,本系统可使用 MFRC522 或兼容 125kHz/13.56MHz 的模块:
- 天线部分:负责接收与发射射频信号。
- 解码部分:将射频信号解调并输出卡片的唯一 ID 数据。
- 接口部分:通过 SPI 或 UART 与单片机通信,数据传输速度快、稳定性高。
设计要点:
- 使用屏蔽线连接天线模块,减少外界干扰。
- 通信线加上上拉电阻,保证总线稳定。
2.3 LCD1602 显示模块
LCD1602 用于显示:
- 第一行:三位用户的签到状态(空格或“有人”)
- 第二行:已签到人数统计
LCD 通过 4 位并行方式与单片机连接,节省 IO 口。
2.4 按键输入模块
系统仅需一个按键:
- 上课/上班键:按下后判断当前人数是否与总人数匹配。
按键采用下拉或上拉电阻设计,配合软件去抖动处理,保证识别准确。
2.5 蜂鸣器报警模块
采用有源蜂鸣器与三极管驱动电路:
- 短促音:刷卡成功提示
- 持续音:人数不齐报警
2.6 电源电路
统一采用 DC 5V 稳压电源,为 MCU、RFID 模块、LCD、蜂鸣器供电。电源端加入滤波电容与 TVS 二极管以防止干扰和浪涌。
3 程序设计
3.1 主程序结构
程序结构分为初始化与主循环:
-
初始化:
- 初始化 LCD、RFID、按键、蜂鸣器
- 清空签到状态数组
-
主循环:
- 读取 RFID 卡 ID
- 匹配用户信息
- 更新签到状态
- 显示人数与状态
- 按键检测并判断报警条件
3.2 RFID 数据读取与身份识别
unsigned char card_uid[5];
unsigned char user1_uid[5] = {0x12,0x34,0x56,0x78,0x90};
unsigned char user2_uid[5] = {0x98,0x76,0x54,0x32,0x10};
unsigned char user3_uid[5] = {0xAB,0xCD,0xEF,0x12,0x34};
bit user_state[3] = {0,0,0}; // 0未到 1已到
bit Compare_UID(unsigned char *id1, unsigned char *id2) {
for(int i=0;i<5;i++) {
if(id1[i] != id2[i]) return 0;
}
return 1;
}
void RFID_Check(void) {
if(RFID_ReadCard(card_uid)) {
if(Compare_UID(card_uid, user1_uid)) user_state[0] = 1;
else if(Compare_UID(card_uid, user2_uid)) user_state[1] = 1;
else if(Compare_UID(card_uid, user3_uid)) user_state[2] = 1;
Beep_Short();
}
}
3.3 LCD 显示签到状态与人数
void LCD_Update(void) {
unsigned char i;
char line1[17] = " ";
char line2[17];
unsigned char count = 0;
for(i=0;i<3;i++) {
if(user_state[i]) {
line1[i*5] = '有';
line1[i*5+1] = '人';
count++;
} else {
line1[i*5] = ' ';
line1[i*5+1] = ' ';
}
}
sprintf(line2, "人数:%d", count);
LCD_SetCursor(0,0);
LCD_Print(line1);
LCD_SetCursor(0,1);
LCD_Print(line2);
}
3.4 按键检测与上课模式判断
void Check_Class_Start(void) {
unsigned char count = 0;
for(int i=0;i<3;i++) {
if(user_state[i]) count++;
}
if(count < 3) {
Beep_Long();
}
}
void Key_Scan(void) {
if(KEY1 == 0) {
delay_ms(20);
if(KEY1 == 0) {
Check_Class_Start();
while(KEY1 == 0); // 等待松开
}
}
}
3.5 蜂鸣器控制
void Beep_Short(void) {
BEEP = 1;
delay_ms(100);
BEEP = 0;
}
void Beep_Long(void) {
BEEP = 1;
delay_ms(500);
BEEP = 0;
}
3.6 主循环程序
void main(void) {
System_Init();
while(1) {
RFID_Check();
LCD_Update();
Key_Scan();
}
}
4 总结
本系统通过 STC89C52 单片机 + RFID 模块 实现了考勤签到与人数统计功能,结合 LCD 实时显示与蜂鸣器报警,实现了小型教室或办公室的考勤自动化管理。系统结构简单、成本低廉,具有较好的实用性与可扩展性。未来可以加入以下功能:
- 通过 EEPROM 存储历史签到记录
- 加入时钟模块记录签到时间
- 增加无线通讯,将考勤数据上传到服务器进行统计分析