STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案
文章目录
- 一、简易刷卡式打卡考勤系统
- (一)功能简介
- 原理图设计
- 程序设计
哔哩哔哩:
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); // 初始化串口,波特率为115200uart_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 300static 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;相关文章:
STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案
文章目录 一、简易刷卡式打卡考勤系统(一)功能简介原理图设计程序设计 哔哩哔哩: https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…...
module ‘numpy‘ has no attribute ‘int‘
在 NumPy 中,如果遇到了错误提示 "module numpy has no attribute int",这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始,numpy.int 已经不再是一个有效的属性,因为 NumPy 不再推荐使用…...
MFC(一)搭建空项目
安装MFC支持库 创建空白桌面程序 项目相关设置 复制以下代码 // mfc.h #pragma once #include <afxwin.h>class MyApp : public CWinApp { public:virtual BOOL InitInstance(); };class MyFrame : public CFrameWnd { public:MyFrame();// 消息映射机制DECLARE_…...
OKCC的API资源管理平台怎么用?
API资源管理平台,重点是“资源”管理平台,不是API接口管理平台。 天天讯通推出的API资源管理平台,类似昆石的VOS系统,区别是VOS是SIP资源管理系统,我们的API资源管理平台是API资源管理系统(AXB、AX、回拨AP…...
CentOS 7 安装python 3.7 需要必要的依赖。
在 CentOS 7 上部署 Python 3.7 可以通过源代码编译安装来实现。以下是大致的步骤: 安装必要的依赖: bashCopy Code sudo yum install gcc openssl-devel bzip2-devel libffi-devel 下载 Python 3.7 源代码并进行编译安装: bashCopy Code wg…...
美术馆设计方案优化布局与设施提升观众体验!
如今,美术馆不仅仅是作为展示艺术作品的平台,也是吸引公众参与和创造独特体验的数字艺术体验空间,因此许多传统美术馆在进行翻修改造时,都会更加注重用户体验,并在其中使用大量的多媒体互动,让参观者能够在…...
数据库基础原理
宏观 数据库的实现原理分为四个部分: 网络通信 网络协议 硬盘存储 内存分配 微观 硬盘存储 数据库是持久化的,而持久化如何实现的,我们不难想到磁盘可以持久化存储,所以数据库所有持久化的数据都是以文件形式存在磁盘中的…...
Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序
Pandas操作MultiIndex合并行列的excel,写入读取以及写入多余行及Index列处理,多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex,写的糊糊涂涂,晕晕乎乎。 是我呀… 记录下&#…...
工作总结5
1.taro框架使用map标签出现的错误 这个问题困扰很长时间,在频繁切换页面渲染的时候出现左边不显示,我理解的是变量没有到达map标签的属性上,那我就想是不是setState太慢了,然后又用了变量,本地缓存等,都没有…...
速通汇编(二)汇编mov、addsub指令
一,mov指令 mov指令的全称是move,从字面上去理解,作用是移动(比较确切的说是复制)数据,mov指令可以有以下几种形式 无论哪种形式,都是把右边的值移动到左边 mov 寄存器,数据&#…...
软考 - 系统架构设计师 - 构件组装技术
概念 构件组装是将库中的构件经修改后相互连接,或者将它们和当前开发项目中的软件元素进行连接,最终构成新的目标构件。 构件组装技术是基于构件的软件开发的核心技术,也是构件技术研究的重点和难点。构件组装的目的是利用现有的构件组装成新…...
2010年之前电脑ubuntu安装nvidia驱动黑屏处理
装好驱动 仿真fps直接到60Hz 陈旧设备 都是非常老旧的电脑,没钱换新电脑,就这么穷…… 电脑详细配置: 冲动 想装显卡驱动提升一下性能,结果……黑了 黑习惯了也无所谓,几分钟就能解决,关键还是太穷&…...
类与对象中C++
加油!!! 文章目录 前言 一、类的6个默认成员函数 编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…...
k8s 集群重启报错:The connection to the server 192.168.92.26:6443 was refused
[rootk8s-master ~]# kubectl get node The connection to the server 192.168.92.26:6443 was refused - did you specify the right host or port?查到是kubelet进程没有启动 [rootk8s-master ~]# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes …...
国内好用的chatGPT和AI绘图工具
分享一个比较好用的AI 分享一个比较好用的AI,只是需要开通会员,目前官网的价格是:298,开通之后可以使用chatgpt4、AI绘画、图片融合等等!不开通的话是可以免费使用15次的,下面是一些介绍图片!链…...
蚂蚁庄园3.31今日答案春季美食“雷竹笋”之所以得名是因为出笋与打雷有关吗?
蚂蚁庄园是一款爱心公益游戏,用户可以通过喂养小鸡,产生鸡蛋,并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料,使用鸡饲料喂鸡之后,会可以获得鸡蛋,可以通过鸡蛋来进行爱心捐赠。其中&#…...
零基础入门转录组数据分析——绘制差异火山图
零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…...
C++进阶,手把手带你学继承
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 【本节目标】 1.继…...
Java自带的线程池及调用、ThreadPoolExecutor类(线程池的7大参数)、任务队列及底层原理
day32 线程池 引入 一个线程完成一项任务所需时间为: 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 注意:优化在Time1,Time3(创建销毁线程费时间) 为什么需要线程池 线程池技术正是关注如何缩短或调整Time1和Tim…...
ThreadPool-线程池使用及原理
1. 线程池使用方式 示例代码: // 一池N线程 Executors.newFixedThreadPool(int) // 一个任务一个任务执行,一池一线程 Executors.newSingleThreadExecutorO // 线程池根据需求创建线程,可扩容,遇强则强 Executors.newCachedThre…...
I3C协议学习总结
I3C可以使用推挽式,节省功耗,速度更快SDR 单数据传输速率, SCL时钟频率可达到12.5MHz所有符合I3C标准的设备都必须要拥有一个总线特性寄存器1. I3C 协议模式概览 (Section 5)文档首先列出了 I3C 支持的几种主要通信模式:SDR (Sing…...
手把手教你用QGIS加载并可视化2025年北京OSM路网SHP数据(WGS84坐标系)
零基础实战:QGIS加载OSM路网数据的完整可视化流程 第一次打开QGIS时,面对满屏的工具栏和菜单选项,很多初学者都会感到无从下手。特别是当手头有一份刚下载的SHP格式路网数据时,如何正确加载、设置坐标系并进行基础可视化ÿ…...
自动化测试框架选型:Selenium vs Cypress深度对比
在快速迭代的软件开发周期中,自动化测试框架的选型直接影响产品质量与交付效率。Selenium与Cypress作为当前主流工具,分别代表了传统与现代化的技术路线。本文将从架构设计、核心特性、适用场景及未来趋势等维度,为测试从业者提供深度对比分析…...
自动送料装车系统PLC控制的设计——24页
自动送料装车系统作为工业自动化领域的关键环节,其核心作用在于通过PLC(可编程逻辑控制器)实现物料输送、定位、装载等流程的精准控制。传统人工操作易受疲劳、环境等因素影响,导致效率波动与安全隐患。而PLC控制通过预设逻辑程序…...
Engram:解锁AI潜能,系统优化新高度!
Engram是一种基于LLM的智能体研究者架构,旨在解决系统优化中AI的两个关键局限:进化邻域偏差和连贯性上限。通过将长时程探索与单一上下文窗口解耦,Engram组织一系列智能体迭代设计、测试和分析机制。每次运行结束时,智能体将代码快…...
Unity 2021/2019 项目里用 NModbus4.dll 搞定 Modbus TCP 通信(附测试工具和避坑指南)
Unity工业通信实战:用NModbus4实现Modbus TCP全流程开发指南 当游戏引擎遇上工业协议,会碰撞出怎样的火花?三年前接手一个智能制造培训项目时,我首次尝试在Unity中集成Modbus通信。原以为简单的协议对接,却因线程冲突导…...
破局MIDI控制困境:SendMIDI让命令行成为音乐创作的神经中枢
破局MIDI控制困境:SendMIDI让命令行成为音乐创作的神经中枢 【免费下载链接】SendMIDI Multi-platform command-line tool to send out MIDI messages 项目地址: https://gitcode.com/gh_mirrors/se/SendMIDI 在数字音乐制作的世界里,MIDI&#x…...
告别复杂状态机:用C语言结构体数组为STM32设计可维护的多级菜单
用结构体数组重构STM32菜单系统:从状态机到模块化设计的进阶之路 在嵌入式开发中,菜单系统是许多产品不可或缺的交互界面。传统的状态机或switch-case实现方式虽然直接,但随着功能迭代,代码往往会变得臃肿难维护。我曾接手过一个使…...
搜索时代的命名战略:如何在亚马逊规避“品牌失语症”
在亚马逊这个由算法与关键词统治的商业世界里,一个名字的恰当与否,直接决定了品牌是“响亮宣言”还是“沉默失语”。许多名字如同《时代》或《财富》杂志,在传统语境中或许优雅,但在需要极致精准的数字货架上,却可能因…...
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力 1. 引言:为什么选择这段30秒视频 今天我要带大家近距离观察Chord视频理解工具的实际表现。不同于传统的技术参数罗列,我们将通过一段精心挑选的30秒视频&#x…...
