STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

news2024/11/19 17:52:11

文章目录

  • 一、简易刷卡式打卡考勤系统
      • (一)功能简介
      • 原理图设计
      • 程序设计

在这里插入图片描述
哔哩哔哩:
https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from=333.999.0.0&vd_source=e5082ef80535e952b2a4301746491be0

一、简易刷卡式打卡考勤系统

(一)功能简介

1、材料:STM32F103C8T6、MFR522、O.96寸OLED、4个按键

2、功能:
①初始化管理员卡片,请放入管理员卡片

②进入管理界面,按键可以选择录入新员工、删除员工、更换管理员卡片、设置时间、设置上下班时间、查看考勤信息、恢复出厂设置等功能

③管理界面可以查看考勤信息

④退出管理界面后到正常界面,正常界面显示时间,有员工刷卡显示“员工X 早上好\中午好\下午好\晚上好\辛苦了”等字样

原理图设计

采用最普遍的STM32F103C8T6便宜好用又稳定
在这里插入图片描述

下载接口用排针
在这里插入图片描述

这次用TYPEC来供电5V,一看充电器9V12V不要慌,接上没带协议的设备是通通都5V。只要能接就不会爆炸。
在这里插入图片描述

5V转3.3降压采用降压芯片AMS1117C33电流大稳定可靠
在这里插入图片描述

用RFID射频卡来刷卡打卡
在这里插入图片描述

采用7针SPI OLED显示 ,屏幕是单色128*64分辨率
在这里插入图片描述
按键用来设置信息
在这里插入图片描述
蜂鸣器用来提示打卡成功或者失败
在这里插入图片描述

程序设计

这段代码是主程序,包含了初始化和主循环部分。在初始化部分,
程序设置了延时函数、NVIC中断分组、串口、OLED显示屏、蜂鸣器和实时时钟(RTC)。
主循环中,程序根据系统标志位sysFlag.DisMain的值来执行不同的任务,如锁定界面、
管理员界面和解锁界面的任务。


#include "main.h"  // 包含主程序的头文件
#include <string.h>  // 包含字符串处理函数

// 系统参数结构体
SysTemPat sys;
// 系统标志位定义
SysflagTypedef sysFlag;

// 函数声明
void Display_Data(void);  // 显示时间的函数
void starting(void);     // 开机界面信息的函数
u8 MFRC522_lock(void);   // 刷卡功能的函数
u8 Add_Rfid(void);      // 录入RFID的函数
u8 Delt_Rfid(void);     // 删除RFID的函数
void Set_Time(void);     // 设置时间的函数
void Massige(void);      // 信息提示的函数
void SysPartInit(void);  // 系统参数初始化的函数

// 主函数
int main(void)
{
    //初始化延时函数
    delay_init();     
    // 设置NVIC中断分组为2:2位抢占优先级,2位响应优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
    // 初始化串口,波特率为115200
    uart_init(115200);	printf("串口功能正常\r\n"); 
    // 初始化按键
	KEY_Init();
    // 初始化OLED显示屏
    OLED_Init();  
    // 清除OLED显示屏
    OLED_Clear();  
    // 初始化蜂鸣器
    BEEP_Init();    
    // 显示开机信息
    starting();
    // 初始化RTC(实时时钟)
    RTC_Init();
    // 初始化系统参数
    SysPartInit();   
    // 主循环
    while(1)
    {
        // 根据系统标志位sysFlag.DisMain的值执行不同的任务
        switch(sysFlag.DisMain)
        {
            case DIS_MAIN:   main_task();  break;  // 执行锁定界面任务
            case DIS_MANAGE: manage_task();  break;  // 执行管理员界面任务
            case DIS_INFO:   info_task();  break;  // 执行解锁界面任务
        }
    }
}


使用删除数组并前移的方式来删除指定的员工



// 删除数组中的指定元素,并将后续元素前移
void deleteAndShift_card(int indexToDelete) {
    int i, j;
    if (indexToDelete >= 0 && indexToDelete <= sys.userNum) {
        // 从要删除的元素开始,将后续元素前移
        for ( i = indexToDelete; i < sys.userNum; i++) {
            memcpy(sys.cardid[i],sys.cardid[i+1],5);
        }
    } else {
        printf("索引无效。\n");
    }
}
// 删除数组中的指定元素,并将后续元素前移
void deleteAndShift_user(int indexToDelete) {
    int i, j;
    if (indexToDelete >= 0 && indexToDelete <= sys.userNum) {
        // 从要删除的元素开始,将后续元素前移
        for ( i = indexToDelete; i < sys.userNum; i++) {
            memcpy(&sys.user[i],&sys.user[i+1],sizeof(sys.user[0]));
        }
    } else {
        printf("索引无效。\n");
    }
}

主界面显示任务


void main_task(void)
{
#define DATA_TIME 100
#define KEY_TIME 10
#define RC522_TIME 300

    static u32 scan_time = 0;

    u8 key_num;

    scan_time++; //扫描计数

    if(scan_time % DATA_TIME == 1) {
        Display_Data();//时间显示:每1000ms更新一次显示数据
        if(sysFlag.DisFlag == 1)
        {
            sysFlag.DisFlag = 0;
            OLED_Refresh_Gram();//更新显示
        }
    }
    //MFRC522解锁
    if(scan_time % RC522_TIME == 1) {
        u8 ret =  MFRC522_lock();
        if(ret == 0)//MFRC522解锁
        {
            sysFlag.DisMain = DIS_MANAGE; //跳到管理界面
        }
    }

    key_num = KEY_Scan(0);
    if(key_num)
    {
        dis_info((u8*)"请刷卡打卡!",3000);
    }
    delay_ms(1);
}

管理员模式任务


void manage_task(void)
{
    static char arrow = 0; //箭头位子
    static u32 scan_time = 0;
    static u8 dis_first = 1;
    u8 key_num = 0;
    if(dis_first)
    {
        dis_first = 0;
        OLED_Clear_NOupdate();
        Dis_SysSetup(arrow);
    }
    //超时
    scan_time++;
    //功能选项选择
    key_num = KEY_Scan(0);
    if(scan_time > 30000 | key_num == KEY2_PRES) {
        scan_time = 0;
        sysFlag.DisMain = DIS_MAIN; //跳到锁定界面
        dis_first = 1;
    }
    if(key_num)
    {
        scan_time = 0;
        if(key_num == KEY0_PRES) {
            if(arrow > 0)arrow--;
        }
        if(key_num == KEY1_PRES) {
            if(arrow < MAX_SYS_PARA_NUM - 1)arrow++;
        }
        Dis_SysSetup(arrow);
        if(key_num == KEY3_PRES) {
            switch(arrow)
            {
            case ADD_RFID:
                Add_Rfid();
                break;//录入新员工
            case DEL_RFID:
                Delt_Rfid();
                break;//删除员工
            case MOD_MANG_PSWD:
                SetManage();
                break;//更换管理员卡片
            case MOD_TIMES:
                Set_Time();
                break;//设置时
            case MOD_WORK_TIMES:
                Set_WorkTime();
                break;  //设置上下班时间
            case READ_SYS_INFO:
                //查看考勤信息
                Read_ColokinInfo();
                break;
            case FACTORY_RESET:
                //恢复出厂设置
                set_facory_reset();
                break;
            }
            dis_first = 1;
        }
    }
    delay_ms(1);
}


系统参数结构体




typedef struct 
{
	u32 HZCFlag;
	u8  cardid[MAXRFIDNUM][CARID_LENGTH];
	u8  errCnt;//错误计数
	u8  errTime;//等待错误时间
    u16  userNum;//员工人数
    _time_obj sb_time;	//上班时间
    _time_obj xb_time;  //下班时间
	_user_obj user[MAXRFIDNUM];		
}SysTemPat;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1547703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4_旋转节点总结一

一、Roll、Pitch、Yaw Roll 围绕X轴旋转 飞机的翻滚角 Pitch 围绕Y轴旋转 飞机的俯仰角 Yaw 围绕Z轴旋转 飞机的航向角 二、Get Forward Vector理解 测试&#xff1a; 运行&#xff1a; 三、Get Actor Rotation理解 运行效果&#xff1a; 拆分旋转体测试一&a…

警惕垃圾邮件,伪造法院传真传播Sodinokibi勒索病毒

Sodinokibi勒索病毒在国内首次被发现于2019年4月份&#xff0c;2019年5月24日首次在意大利被发现&#xff0c;在意大利被发现使用RDP攻击的方式进行传播感染&#xff0c;这款病毒被称为GandCrab勒索病毒的接班人&#xff0c;在GandCrab勒索病毒运营团队停止更新之后&#xff0c…

Can‘t resolve ‘mockjs‘ in ‘......

问题场景&#xff1a; 未从根本目录打开项目在运行npm run serve 后报错&#xff1a;Parsing error: No Babel config file detected for...... 解决方法&#xff1a;在终端 cd ./含有package.json的文件夹/ npm run serve 此时在加载到70%之后报错 Cant resolve mockjs in .…

政安晨:【Keras机器学习实践要点】(四)—— 顺序模型

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 Keras是一个用于构建和训练深度学习模…

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作&#xff0c;本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以&#xff0c;还是引用一下百度百科吧&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以…

初探Notion安装与使用

笔记工具哪家强&#xff0c;有道云笔记&#xff0c;印象笔记&#xff0c;记事本&#xff0c;notion 第一步、下载与安装 本次选择是window版本&#xff0c;下载地址【Notion官网】 版本为Notion Setup 3.3.0&#xff0c;软件大小74.3M&#xff0c;官网如下图所示。 进入登录…

STM32之HAL开发——DMA转运串口数据

DMA功能框图&#xff08;F1系列&#xff09; 如果外设要想通过 DMA 来传输数据&#xff0c;必须先给 DMA 控制器发送 DMA 请求&#xff0c; DMA 收到请求信号之后&#xff0c;控制器会给外设一个应答信号&#xff0c;当外设应答后且 DMA 控制器收到应答信号之后&#xff0c;就会…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现四

【简单介绍】 经过精心设计和深度整合&#xff0c;我们成功推出了这款融合了先进目标检测算法YOLOv8与高效PyQt5界面开发框架的目标检测GUI界面软件。该软件在直观性、易用性和功能性方面均表现出色&#xff0c;为用户提供了高效稳定的操作体验。 在界面设计方面&#xff0c;…

1.5T数据惨遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件93起&#xff0c;近三周攻击数量呈现持平状态。 本周Lockbit3.0是影响最严重的勒索家族&#xff0c;Blacksuit和Ransomhub恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。 …

MT6762_联发科MTK6762安卓核心板规格参数

MTK6762核心板是一款集成了蓝牙、fm、wlan和gps模块的高度集成基带平台&#xff0c;为LTE/LTE-A和C2K智能手机应用程序提供支持。该安卓核心板集成了ARM Cortex-A53处理器&#xff0c;工作频率可达2.0GHz&#xff0c;并且还集成了功能强大的多标准视频编解码器。除此之外&#…

如何区分模型文件是稳定扩散模型和LORA模型

区分模型文件是否为稳定扩散模型&#xff08;Stable Diffusion Models&#xff09;或LORA模型&#xff08;LowRank Adaptation&#xff09;通常需要对模型的结构和内容有一定的了解。以下是一些方法来区分这两种模型文件&#xff1a; 1. 文件格式和结构 稳定扩散模型&#xff1…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;6&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…

使用npm仓库的优先级以及.npmrc配置文件的使用

使用npm仓库的优先级以及.npmrc配置文件的使用 概念如何设置 registry&#xff08;包管理仓库&#xff09;1. 设置项目配置文件2. 设置用户配置文件3. 设置全局配置文件4. .npmrc文件可以配置的常见选项 概念 npm&#xff08;Node Package Manager&#xff09;是一个Node.js的…

PanTools v1.0.17 多网盘批量管理 批量分享、转存、复制...

软件介绍 一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有…

CSS 实现毛玻璃效果 | backdrop-filter与filter的区别

CSS 毛玻璃效果是一种使用 CSS 创建的视觉效果&#xff0c;可以使元素或区域呈现出模糊或半透明的外观&#xff0c;就像毛玻璃一样。 示例&#xff1a; <div class"container"><div class"textHolder"><p>glass</p></div>…

gitee多用户配置

一、引言 在工作的时候我们有时候会自己创建项目Demo来实现一些功能&#xff0c;但是又不想把自己的Demo代码放到公司的仓库代码平台&#xff08;gitee&#xff09;中管理&#xff0c;于是就是想自己放到自己的Gitee中管理&#xff0c;于是就需要配置Git多用户。 本文将配置分别…

论文篇05-论文范文-论数据访问层设计技术及其应用(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

试题:论数据访问层设计技术及其应用 在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清晰,便于提高复用能力和产品维护能力。一种常见的层次划分模型是将信息系统分…

谷粒商城——缓存——SpringCache

1. 配置使用 首先需要导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 随后在配置文件中进行配置&#xff1a; spring:cache:t…

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺&#xff08;repeat&#xff09; ③、背景位置(position) ④、背景附着&#xff08;attachment&#xff09; ⑤、背景透明(CSS3) ⑥、背景图片缩放大小&#xff08;size&#xff09;&#xff1a; ⑦、背景简写 2、标签显…

Netty源码剖析——ChannelHandlerContext 篇(三十七)

ChannelHandlerContext 作用及设计 ChannelHandlerContext 继承了出站方法调用接口和入站方法调用接口 ChannelOutboundInvoker 和 ChannelInboundInvoker 部分源码 这两个invoker就是针对入站或出站方法来的&#xff0c;就是在入站或出站 handler 的外层再包装一层&#xff0c…