当前位置: 首页 > news >正文

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技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统&#xff08;一&#xff09;功能简介原理图设计程序设计 哔哩哔哩&#xff1a; https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…...

module ‘numpy‘ has no attribute ‘int‘

在 NumPy 中&#xff0c;如果遇到了错误提示 "module numpy has no attribute int"&#xff0c;这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始&#xff0c;numpy.int 已经不再是一个有效的属性&#xff0c;因为 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资源管理平台&#xff0c;重点是“资源”管理平台&#xff0c;不是API接口管理平台。 天天讯通推出的API资源管理平台&#xff0c;类似昆石的VOS系统&#xff0c;区别是VOS是SIP资源管理系统&#xff0c;我们的API资源管理平台是API资源管理系统&#xff08;AXB、AX、回拨AP…...

CentOS 7 安装python 3.7 需要必要的依赖。

在 CentOS 7 上部署 Python 3.7 可以通过源代码编译安装来实现。以下是大致的步骤&#xff1a; 安装必要的依赖&#xff1a; bashCopy Code sudo yum install gcc openssl-devel bzip2-devel libffi-devel 下载 Python 3.7 源代码并进行编译安装&#xff1a; bashCopy Code wg…...

美术馆设计方案优化布局与设施提升观众体验!

如今&#xff0c;美术馆不仅仅是作为展示艺术作品的平台&#xff0c;也是吸引公众参与和创造独特体验的数字艺术体验空间&#xff0c;因此许多传统美术馆在进行翻修改造时&#xff0c;都会更加注重用户体验&#xff0c;并在其中使用大量的多媒体互动&#xff0c;让参观者能够在…...

数据库基础原理

宏观 数据库的实现原理分为四个部分&#xff1a; 网络通信 网络协议 硬盘存储 内存分配 微观 硬盘存储 数据库是持久化的&#xff0c;而持久化如何实现的&#xff0c;我们不难想到磁盘可以持久化存储&#xff0c;所以数据库所有持久化的数据都是以文件形式存在磁盘中的…...

Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序

Pandas操作MultiIndex合并行列的excel&#xff0c;写入读取以及写入多余行及Index列处理&#xff0c;多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex&#xff0c;写的糊糊涂涂&#xff0c;晕晕乎乎。 是我呀… 记录下&#…...

工作总结5

1.taro框架使用map标签出现的错误 这个问题困扰很长时间&#xff0c;在频繁切换页面渲染的时候出现左边不显示&#xff0c;我理解的是变量没有到达map标签的属性上&#xff0c;那我就想是不是setState太慢了&#xff0c;然后又用了变量&#xff0c;本地缓存等&#xff0c;都没有…...

速通汇编(二)汇编mov、addsub指令

一&#xff0c;mov指令 mov指令的全称是move&#xff0c;从字面上去理解&#xff0c;作用是移动&#xff08;比较确切的说是复制&#xff09;数据&#xff0c;mov指令可以有以下几种形式 无论哪种形式&#xff0c;都是把右边的值移动到左边 mov 寄存器&#xff0c;数据&#…...

软考 - 系统架构设计师 - 构件组装技术

概念 构件组装是将库中的构件经修改后相互连接&#xff0c;或者将它们和当前开发项目中的软件元素进行连接&#xff0c;最终构成新的目标构件。 构件组装技术是基于构件的软件开发的核心技术&#xff0c;也是构件技术研究的重点和难点。构件组装的目的是利用现有的构件组装成新…...

2010年之前电脑ubuntu安装nvidia驱动黑屏处理

装好驱动 仿真fps直接到60Hz 陈旧设备 都是非常老旧的电脑&#xff0c;没钱换新电脑&#xff0c;就这么穷…… 电脑详细配置&#xff1a; 冲动 想装显卡驱动提升一下性能&#xff0c;结果……黑了 黑习惯了也无所谓&#xff0c;几分钟就能解决&#xff0c;关键还是太穷&…...

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的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&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…...

蚂蚁庄园3.31今日答案春季美食“雷竹笋”之所以得名是因为出笋与打雷有关吗?

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…...

零基础入门转录组数据分析——绘制差异火山图

零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…...

C++进阶,手把手带你学继承

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1.继…...

Java自带的线程池及调用、ThreadPoolExecutor类(线程池的7大参数)、任务队列及底层原理

day32 线程池 引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 注意&#xff1a;优化在Time1&#xff0c;Time3(创建销毁线程费时间) 为什么需要线程池 线程池技术正是关注如何缩短或调整Time1和Tim…...

ThreadPool-线程池使用及原理

1. 线程池使用方式 示例代码&#xff1a; // 一池N线程 Executors.newFixedThreadPool(int) // 一个任务一个任务执行&#xff0c;一池一线程 Executors.newSingleThreadExecutorO // 线程池根据需求创建线程&#xff0c;可扩容&#xff0c;遇强则强 Executors.newCachedThre…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...