基于51单片机射频RFID卡考勤上课上班人数计数系统设计

1 系统功能介绍

本设计是一套基于 STC89C52 单片机 的射频 RFID 卡考勤与人数统计系统,可应用于教室、公司等需要考勤管理的场所。系统通过射频识别模块(RFID)读取预设卡片的身份信息,实现人员的自动识别与到勤统计,并结合液晶显示与蜂鸣器报警功能,能够快速判断到勤人数是否符合要求,从而提升管理效率。

系统主要功能如下:

  1. RFID 身份识别
    系统配备 3 张预设的射频卡,分别代表张三、李四、王二三位用户。当任意一张卡刷卡成功时,单片机能够识别其身份,并在 LCD 上对应位置显示 “有人”,未签到的显示为空格。

  2. 人数统计
    LCD 的第二行会实时显示已签到人数,实现到勤人数的动态统计。

  3. 上课(上班)检测功能
    按下按键进入上课模式,如果签到人数与总人数不一致,则蜂鸣器发出报警,提示有人员未到场。

  4. 声光提示
    当有新人员刷卡成功时,蜂鸣器发出短促提示音;上课模式下人数不全时蜂鸣器发出持续报警音。


2 系统电路设计

2.1 单片机最小系统

本系统核心为 STC89C52 单片机,其最小系统包括:

  • 时钟电路:外接 12MHz 晶振和 30pF 电容,保证 MCU 稳定运行。
  • 复位电路:采用按键和上拉电阻构成,上电自动复位,并支持人工复位。
  • 电源电路:DC 5V 供电,配合滤波电容降低干扰。

该模块负责 RFID 数据处理、LCD 显示控制、按键识别及蜂鸣器驱动。

2.2 RFID 模块电路

RFID 模块用于读取射频卡的 ID 号,本系统可使用 MFRC522 或兼容 125kHz/13.56MHz 的模块:

  • 天线部分:负责接收与发射射频信号。
  • 解码部分:将射频信号解调并输出卡片的唯一 ID 数据。
  • 接口部分:通过 SPI 或 UART 与单片机通信,数据传输速度快、稳定性高。

设计要点:

  1. 使用屏蔽线连接天线模块,减少外界干扰。
  2. 通信线加上上拉电阻,保证总线稳定。

2.3 LCD1602 显示模块

LCD1602 用于显示:

  • 第一行:三位用户的签到状态(空格或“有人”)
  • 第二行:已签到人数统计

LCD 通过 4 位并行方式与单片机连接,节省 IO 口。

2.4 按键输入模块

系统仅需一个按键:

  • 上课/上班键:按下后判断当前人数是否与总人数匹配。
    按键采用下拉或上拉电阻设计,配合软件去抖动处理,保证识别准确。

2.5 蜂鸣器报警模块

采用有源蜂鸣器与三极管驱动电路:

  • 短促音:刷卡成功提示
  • 持续音:人数不齐报警

2.6 电源电路

统一采用 DC 5V 稳压电源,为 MCU、RFID 模块、LCD、蜂鸣器供电。电源端加入滤波电容与 TVS 二极管以防止干扰和浪涌。


3 程序设计

3.1 主程序结构

程序结构分为初始化与主循环:

  1. 初始化:

    • 初始化 LCD、RFID、按键、蜂鸣器
    • 清空签到状态数组
  2. 主循环:

    • 读取 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 存储历史签到记录
  • 加入时钟模块记录签到时间
  • 增加无线通讯,将考勤数据上传到服务器进行统计分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值