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

【51单片机实验笔记】前篇(三) 模块功能封装汇总(持续更新)

文章目录

  • 通用函数
    • public.h
    • public.c
  • 延时函数
    • delay.h
    • delay.c
  • LED模块
  • 数码管模块
    • smg.h
    • smg.c
  • LED点阵模块
  • 独立按键模块
  • 矩阵按键模块
  • 外部中断模块
  • 定时器模块
  • 串口通讯模块
  • ADC模块
  • PWM模块


通用函数

包含常用头文件宏定义自定义类型函数工具等。

public.h

#ifndef _PUBLIC_H_
#define _PUBLIC_H_/*---------------------常用头文件---------------------------------*/
#include <REGX52.H>
#include <intrins.h>#include <stdio.h>
#include <math.h>
#include <string.h>#define false 0
#define true 1typedef unsigned char u8;
typedef unsigned int u16;void delay_10us(u16);
void delay_ms(u16);u8 * int2String(int, bit);
u8 * float2String(float, u8);#endif

public.c

#include "public.h"
/** **  @brief    通用函数**  @author   QIU**  @data     2023.09.03**//*-------------------------------------------------------------------*//****  @brief   延时函数(10us)**  @param   t:0~65535,循环一次约10us**  @retval  无**/
void delay_10us(u16 t){while(t--);
}/****  @brief   延时函数(ms)**  @param   t:0~65535,单位ms**  @retval  无**/
void delay_ms(u16 t){while(t--){delay_10us(100);}
}/****  @brief   整数转字符串**  @param   num:接受整型值**  @param   sign:是否带符号**  @retval  返回字符串指针**/
u8 * int2String(int num, bit sign){static u8 str[8];// 是否带符号if(sign){sprintf(str, "%d", num);}else{sprintf(str, "%u", num);}// 返回指针return str;
}/****  @brief   浮点数转字符串**  @param   num:接受浮点数**  @param   len:指定精度,小数点位数0~6(四舍五入)**  @retval  返回字符串指针**/
u8 * float2String(float num, u8 len){static u8 str[10];// 筛选switch(len){case 0: sprintf(str, "%.0f", num); break;case 1: sprintf(str, "%.1f", num); break;case 2: sprintf(str, "%.2f", num); break;case 3: sprintf(str, "%.3f", num); break;case 4: sprintf(str, "%.4f", num); break;case 5: sprintf(str, "%.5f", num); break;default: sprintf(str, "%f", num); break;  // 默认6位小数}// 返回指针return str;
}

延时函数

包含常用延时函数通用函数兼容延时函数

delay.h

#ifndef _DELAY_H_
#define _DELAY_H_#include <REGX52.H>#define false 0
#define true 1typedef unsigned char u8;
typedef unsigned int u16;void delay_10us(u16);
void delay_ms(u16);#endif

delay.c

#include "delay.h"
/** **  @brief    通用函数**  @author   QIU**  @data     2023.08.23**//*-------------------------------------------------------------------*//****  @brief   延时函数(10us)**  @param   t:0~65535,循环一次约10us**  @retval  无**/
void delay_10us(u16 t){while(t--);
}/****  @brief   延时函数(ms)**  @param   t:0~65535,单位ms**  @retval  无**/
void delay_ms(u16 t){while(t--){delay_10us(100);}
}

LED模块


数码管模块

主要实现了延时法刷新定时器法刷新两种方式。提供字符串写入函数

smg.h

#ifndef _SMG_H_
#define _SMG_H_#include "public.h"#define SMG_PORT P0 // 位选引脚,与38译码器相连
sbit A1 = P2^2;
sbit A2 = P2^3;
sbit A3 = P2^4;void smg_showString(u8*, u8);void smg_showString_Bytimer(u8*, u8);#endif

smg.c

#include "smg.h"
/** **  @brief    数码管封装**  		   1. 延时刷新**  		   2. 定时器刷新**  @author   QIU**  @date     2023.09.03**//*-------------------------------------------------------------------*///共阴极数码管字形码编码
u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66, //0 1 2 3 40x6d,0x7d,0x07,0x7f,0x6f, //5 6 7 8 90x77,0x7c,0x58,0x5e,0x79, //A b c d E0x71,0x76,0x30,0x0e,0x38, //F H I J L0x54,0x3f,0x73,0x67,0x50, //n o p q r0x6d,0x3e,0x3e,0x6e,0x40};//s U v y -  /****  @brief   指定第几个数码管点亮,38译码器控制位选(不对外声明)**  @param   pos:从左至右,数码管位置 1~8**  @retval  无**/
void select_38(u8 pos){u8 temp_pos = 8 - pos; // 0~7A1 = temp_pos % 2; //高位temp_pos /= 2;A2 = temp_pos % 2; temp_pos /= 2;A3 = temp_pos % 2; //低位
}/****  @brief   解析数据并取得相应数码管字形码编码**  @param   dat:想要显示的字符**  @retval  对应字形码编码值**/
u8 parse_data(u8 dat){switch(dat){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':return smgduan[dat-'0'];case 'a':case 'A':return smgduan[10];case 'b':case 'B':return smgduan[11];case 'c':case 'C':return smgduan[12];case 'd':case 'D':return smgduan[13];case 'e':case 'E':return smgduan[14];case 'f':case 'F':return smgduan[15];case 'h':case 'H':return smgduan[16];case 'i':case 'I':return smgduan[17];case 'j':case 'J':return smgduan[18];case 'l':case 'L':return smgduan[19];case 'n':case 'N':return smgduan[20];case 'o':case 'O':return smgduan[21];case 'p':case 'P':return smgduan[22];case 'q':case 'Q':return smgduan[23];case 'r':case 'R':return smgduan[24];case 's':case 'S':return smgduan[25];case 'u':case 'U':return smgduan[26];case 'v':case 'V':return smgduan[27];case 'y':case 'Y':return smgduan[28];case '-':return smgduan[29];default:return 0x00; //不显示}
}/****  @brief   根据输入的ASCII码,显示对应字符(1字节)**  @param   dat:字符数据,或其ASCII值**  @param   pos:显示位置 1~8**  @retval  无**/
void smg_showChar(u8 dat, u8 pos, bit flag){// 解析点亮哪一个数码管select_38(pos);// 解析数据SMG_PORT = parse_data(dat);// 加标点if(flag) SMG_PORT |= 0x80;
}/*-------------------------------------------------------------------*/
/*-----------------------延时法刷新----------------------------------*/
/*-------------------------------------------------------------------*//****  @brief   延时法刷新**  @param   dat:字符数组,需以'\0'结尾**  @param   pos:显示位置**  @param   dot:小数点位置**  @retval  无**/
void smg_flush_Bydelay(u8 dat[], u8 pos, u8 dot){u8 i;// 超出部分直接截断for(i=0;(i<9-pos)&&(dat[i]!='\0');i++){// 如果是小数点,跳过,往前移一位if(dat[i] == '.'){pos -= 1;continue;}// 显示smg_showChar(dat[i], pos+i, (dot == i+1)?true:false);// 延时1msdelay_ms(1);// 消影SMG_PORT = 0x00; }
}/****  @brief   显示字符串(动态显示)**  @param   dat:字符数组,需以'\0'结尾**  @param   pos:显示位置**  @retval  无**/
void smg_showString(u8 dat[], u8 pos){u8 i = 0, dot = 0;// 先判断是否存在小数点while(dat[i]!='\0'){if(dat[i] == '.') break;i++;}// 记录下标点位置if(i < strlen(dat)) dot = i;// 延时法刷新smg_flush_Bydelay(dat, pos, dot);
}/*-------------------------------------------------------------------*/
/*--------------------------定时器法刷新-----------------------------*/
/*-------------------------------------------------------------------*//****  @brief   数码管显示字符串(定时器法刷新)**  @param   dat:字符数组,需以'\0'结尾**  @param   pos:显示位置**  @retval  返回值**/
void smg_showString_Bytimer(u8 dat[], u8 pos){// 数码管计数器, 小数点位置static u8 smg_counter = 0, dot_counter = 0, dot_port[8];// 暂存当前位置u8 temp;// 先消影SMG_PORT = 0x00; // 如果是小数点,跳出。if(dat[smg_counter] == '.'){// 记录小数点位置,下一轮刷新dot_port[smg_counter-1] = true;// 计数器后移一位smg_counter++;// 小数点计数器自增dot_counter++;return;}// 计算当前位置temp = pos+smg_counter-dot_counter;// 判断是否加小数点(检测到小数点的后面几位整体前移)smg_showChar(dat[smg_counter], temp, dot_port[smg_counter]);// 如果是结束符,跳出(超出部分截断)if(temp == 8 | dat[smg_counter] == '\0'){// 重置smg_counter = 0;// 根据标志决定是否清除小数点if(dot_counter){// 清零dot_counter = 0;}else{// 清空strcpy(dot_port, "");}return;}else{smg_counter++;}
}

LED点阵模块


独立按键模块


矩阵按键模块


外部中断模块


定时器模块


串口通讯模块


ADC模块


PWM模块


相关文章:

【51单片机实验笔记】前篇(三) 模块功能封装汇总(持续更新)

文章目录 通用函数public.hpublic.c 延时函数delay.hdelay.c LED模块数码管模块smg.hsmg.c LED点阵模块独立按键模块矩阵按键模块外部中断模块定时器模块串口通讯模块ADC模块PWM模块 通用函数 包含常用头文件&#xff0c;宏定义&#xff0c;自定义类型&#xff0c;函数工具等。…...

Excel VSTO开发4 -其他事件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 4 其他事件 针对插件的事件主要有Startup、Shutdown这两个事件&#xff0c;在第2节中已经讲解。在开发窗口中&#xff0c;选择对象…...

语音识别数据的采集方法:基本流程数据类型

“人工智能是一种模仿人类功能的产品。数据采集的方法需要针对特定的场景需求。”—–Mark Brayan (澳鹏CEO) 我们一直说&#xff0c;对于一个高质量的人工智能产品离不开高质量的训练数据。对于不同的人工智能我们需要不同的数据对其训练。要采集正确的数据去训练特定的模型才…...

oracle数据库给用户授权DBA权限Oracle查看哪些用户具有DBA权限

oracle数据库给用户授权DBA权限 步骤一&#xff1a;以sysdba身份登录到Oracle数据库 在授予DBA权限之前&#xff0c;我们首先要以sysdba身份登录到Oracle数据库。使用以下命令登录&#xff1a; sqlplus / as sysdba步骤二&#xff1a;创建用户&#xff08;如有用户跳过&#…...

024-从零搭建微服务-系统服务(六)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…...

Arduino驱动TCS3200传感器(颜色传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清…...

基于Matlab实现多个数字水印案例(附上源码+数据集)

数字水印是一种在数字图像或视频中嵌入特定信息的技术&#xff0c;以保护知识产权和防止盗版。在本文中&#xff0c;我们将介绍如何使用Matlab实现数字水印。 文章目录 实现步骤源码数据集下载 实现步骤 首先&#xff0c;我们需要选择一个用于嵌入水印的图像。这可以是原始图像…...

C语言之指针进阶篇(2)

目录 函数指针 函数名和&函数名 函数指针的定义 函数指针的使用 函数指针陷阱 代码1 代码2 注意 函数指针数组定义 函数指针数组的使用 指向函数指针数组的指针 书写 终于军训圆满结束了&#xff0c;首先回顾一下指针进阶篇&#xff08;1&#xff09;主要是…...

C++ 进制转化入门知识(1)

一、什么是进制 进制是一种用来表示数值的系统或方法&#xff0c;它是基于一个特定的基数来工作的。在我们常见的几种进制中&#xff0c;有&#xff1a; 1. **二进制&#xff08;基数 2&#xff09;**&#xff1a; 二进制只用两个数字&#xff1a;0和1。这是计算机内部使用…...

【React】React学习:从初级到高级(四)

React学习[四] 4 应急方案4.1 使用ref引用值4.1.1 给组件添加ref4.1.2 ref和state的不同之处4.1.3 何时使用ref 4.2 使用ref操作DOM4.2.1 获取指向节点的ref4.2.3 使用 ref 回调管理 ref 列表4.2.4 访问另一个组件的DOM节点4.2.5 用 flushSync 同步更新 state 4.3 使用Effect同…...

微信小程序登录问题(思路简略笔记)

配置问题 这是小程序登录问题&#xff0c;必要的两个配置。 流程思路 1. 微信小程序端&#xff0c;会返回一个code。 2. 查看需要返回给微信小程序端的数据。 3. 既然需要返回三个数据&#xff0c;先看openid如何拿到 WX-Login https://api.weixin.qq.com/sns/jscode2ses…...

Go 锁扩展

文章目录 TryLock统计 goroutine数量读写锁读锁写锁常见死锁情况写锁重入写锁中调用读锁循环依赖 TryLock 源码中自带的(我的go是 1.20版本)TryLock 会尝试获取锁&#xff0c;如果获取不到返回false&#xff0c;并不会进行休眠阻塞(和 Lock的主要区别) func (m *Mutex) TryLo…...

Docker的简介及安装

[shouce]http://shouce.jb51.net/docker_practice/栾一峰菜鸟教程参考文献 1 环境配置的难题 软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户计算机的环境都不相同&#xff0c;你怎么知道自家的软件&#xff0c;能在那些机器跑起来&#xff1f; 用户必须保证两件事…...

安卓核心板的不同核心规格及架构介绍

安卓核心板是将核心功能封装的一块电子主板&#xff0c;集成芯片、存储器和功放器件等&#xff0c;并提供标准接口的芯片。 其特点&#xff1a; ● 能跑 Android 等操作系统 强大的功能及丰富的接口 支持 LCD/TP&#xff0c;Audio&#xff0c;Camera&#xff0c;Video&#…...

flume1.11.0安装部署

1、准备安装包apache-flume-1.11.0-bin.tar.gz&#xff1b; 上传&#xff1b; 2、安装flume-1.11.0&#xff1b; 解压&#xff1b; tar -zxvf apache-flume-1.11.0-bin.tar.gz -C /opt/server 进入conf目录&#xff0c;修改flume-env.sh&#xff0c;配置JAVA_HOME&#xff1b…...

通过wordpress 自定义主题的额外CSS删除指定区块

最近用wordpress建站&#xff0c;想要删除指定区块&#xff0c;发现相关的教程蛮少的&#xff0c;作为小白的我搜了相关教程&#xff0c;好像没找到&#xff0c;只能自己慢慢摸索了&#xff0c;看了很多&#xff0c;终于尝试实现了&#xff0c;特记录下&#xff0c;免得自己忘了…...

Rokid Jungle--Max pro

介绍和功能开发 YodaOS-Master操作系统&#xff1a;以交换计算为核心&#xff0c;实现单目SLAM空间交互&#xff0c;具有高精度、实时性和稳定性。发布UXR2.0SDK&#xff0c;为构建空间内容提供丰富的开发套件 多模态交互 算法原子化 多种开发工具协同 多生态支持 骁龙XR2…...

【LeetCode算法系列题解】第61~65题

CONTENTS LeetCode 61. 旋转链表&#xff08;中等&#xff09;LeetCode 62. 不同路径&#xff08;中等&#xff09;LeetCode 63. 不同路径 II&#xff08;中等&#xff09;LeetCode 64. 最小路径和&#xff08;中等&#xff09;LeetCode 65. 有效数字&#xff08;困难&#xff…...

MATLAB中fillmissing函数用法

目录 语法 说明 示例 包含 NaN 值的向量 由 NaN 值组成的矩阵 插入缺失数据 使用移动中位数方法 使用自定义填充方法 包含缺失端点的矩阵 包含多个数据类型的表 fillmissing函数的功能是填充缺失的条目。 语法 F fillmissing(A,constant,v) F fillmissing(A,meth…...

电脑同时连接有线和无线网络怎么设置网络的优先级

电脑同时连接有线和无线网络怎么设置网络的优先级&#xff1a; 我们知道在 笔记本电脑系统 中&#xff0c;可以通过有线或无线网络进行联网。如果电脑在有线网络和无线网络同时存在的情况&#xff0c;应该怎么设置有线网络优先连接呢?对此我们提供下面的方法可以让电脑在有Wi…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...