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); 
    // 初始化串口,波特率为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;


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系列学习前端之第 6 章:一文掌握 jQuery(熟悉即可)

前言&#xff1a;为什么说 jQuery 熟悉即可&#xff0c;已日渐过时&#xff1f; 作为前端开发中常用的两个库或框架&#xff1a;Vue.js 和 jQuery。不少开发者想要学习 Vue.js 时&#xff0c;都会有一个疑惑&#xff1a;学习 Vue.js 是否一定要学习 jQuery&#xff1f; 从几个…

(五)图像的标准假彩色合成

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 GDAL(release-1928-x64-gdal-3-5-2-mapserver-8-0-0) OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff…

【测试开发学习历程】第一个Python程序(下)

6 Python的标识符&#xff0c;命名规则与规范 标识符&#xff1a;python中的标识符是用于识别变量、函数、类、模块以及其他对象的名字叫标识符。 命名规则&#xff1a;所有需要自己命名的地方都必须要遵守以下规则 可以包含数字、字母、_&#xff0c;但是不能以数字开头&…

<c语言学习>数据文件操作

数据文件 按文件功能讲&#xff0c;计算机的文件分为程序文件和数据文件&#xff0c;数据文件操作以下简称文件操作。 程序文件&#xff1a; 包括源程序文件&#xff08;后缀为.c&#xff09;,目标文件&#xff08;windows环境后缀为.obj&#xff09;,可执行程序&#…

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

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

2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现&#xff1a; 图形&#xff08;或图像&#xff09;在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形&#xff0c;位图则使用像素来描述图像。一般来说&#…

既有理论深度又有技术细节——深度学习计算机视觉

推荐序 我曾经试图找到一本既有理论深度、知识广度&#xff0c;又有技术细节、数学原理的关于深度学习的书籍&#xff0c;供自己学习&#xff0c;也推荐给我的学生学习。虽浏览文献无数&#xff0c;但一直没有心仪的目标。两周前&#xff0c;刘升容女士将她的译作《深度学习计…

爬虫实践(1)

这一篇只提登录模拟&#xff0c;主要介绍chrome开发者窗口的使用&#xff0c;实际上相关接口调用都是用到cookie&#xff0c;需要再加一篇从token到cookie&#xff0c;以保证实践的完整性 以migu登录为例&#xff0c;分析其登录过程&#xff0c;之后可以使用任意语言模拟登录&…

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

Linux实现m4a格式转换为wav格式

需要在linux上安装ffmpeg 参考博客 Linux上安装ffmpeg修改环境变量【这一点很重要&#xff0c;自己因为没有添加环境变量&#xff0c;捣鼓了很长时间】 将ffmpeg的绝对路径添加到 PATH 环境变量中&#xff0c;以让系统能找到ffmpeg的安装路径。 # /home//project/ffmpeg-6.1-a…

数据库安全性

背景&#xff1a;数据库的一大特性就是数据共享&#xff0c;这样我们就不能不考虑数据库的安全性问题。 1.数据库的不安全因素 1.1非授权用户对数据库的恶意存取和破坏 一些黑客&#xff08;Hacker&#xff09;和犯罪分子在用户存取数据库时猎取用户名和用户 口令&#xff0…

图像处理与视觉感知---期末复习重点(4)

文章目录 一、图像复原与图像增强1.1 概述1.2 异同点 二、图像复原/退化模型2.1 模型图简介2.2 线性复原法 三、彩色基础四、彩色模型五、彩色图像处理 一、图像复原与图像增强 1.1 概述 1. 图像增强技术一般要利用人的视觉系统特性&#xff0c;目的是取得较好的视觉效果&…

canvas跟随鼠标画有透明度的矩形边框

提示&#xff1a;canvas跟随鼠标画有透明度的矩形边框 文章目录 前言一、跟随鼠标画有透明度的矩形边框总结 前言 一、跟随鼠标画有透明度的矩形边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll

在php调用hana数据库的一个sql时报错了&#xff0c;查表结构的sql&#xff1a; select * from sys.table_columns where table_name VBAP SQLSTATE[SL009]: <<Unknown error>>: 0 [unixODBC][Driver Manager]No columns were bound prior to calling SQLFetch …

Kibana的安装(Linux版)

Kibana是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff0c;基于浏览器的用户界面可以快速创…

Eladmin-jpa基于SpringBoot和Vue的前后端分离后台管理系统​

在当今快速发展的软件开发领域&#xff0c;前后端分离的架构模式已经成为主流。这种架构模式不仅可以提高开发效率&#xff0c;还能使系统更加易于维护和扩展。Eladmin-jpa是一个基于Spring Boot 2.6.4、Spring Boot Jpa、JWT、Spring Security、Redis和Vue的前后端分离的后台管…

分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

目录 分布式系统面试全集通第一篇什么是分布式?和微服务的区别什么是分布式分布式与微服务的区别 什么是CAP?为什么不能三者同时拥有分区容错性一致性可用性 Base理论了解吗基本可用软状态最终一致性 什么是分布式事务分布式事务有哪些常见的实现方案?2PC&#xff08;Two Ph…

docker安装elasticseachkibana

1.docker安装es 创建本机挂载目录&#xff0c;与容器上目录映射 /Users/wangpei/2024/mydata/elasticsearch conf下创建yml文件 echo "http.host : 0.0.0.0" >> /Users/wangpei/2024/mydata/elasticsearch/config/elasticsearch.yml 安装容器&#xff1a; d…

【Effective Web】html/css优化和技巧

html/css优化和技巧 html/css可以做到一些js的功能&#xff0c;减少js操作dom的高昂成本。 巧用伪类 显示勾选时文案 checkbo勾选时触发&#xff0c;实现checkbox的简单选中事件处理 <template><input type"checkbox" /><span class"checkb…

谷粒商城——缓存——SpringCache

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