【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模块


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

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

相关文章

黑马JVM总结(三)

&#xff08;1&#xff09;栈内存溢出 方法的递归调用&#xff0c;没有设置正确的结束条件&#xff0c;栈会有用完的一天&#xff0c;导致栈内存溢出 可以修改栈的大小&#xff1a; 再次运行&#xff1a;减少了次数 案例二&#xff1a; 两个类的循环应用问题&#xff0c;导致Js…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…

如何使用聊天GPT自定义说明

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 OpenAI ChatGPT正在席卷全球。一周又一周&#xff0c;更新不断提高您可以使用这种最先进的语言模型做什么的标准。 在这里&#xff0c;我们深入研究了OpenAI最近在ChatGPT自定义指令上发布的公告。此功能最初以测试版…

第11篇:ESP32vscode_platformio_idf框架helloworld点亮LED

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

常见面试题记录

记录下java的常见面试题 文章目录 记录如下 记录如下 记录如下 hashmap原理lock原理synchronized锁优化过程线程状态以及创建方式线程池&#xff08;执行过程&#xff0c;参数&#xff0c;淘汰策略&#xff09;jvm&#xff08;gc优化和OOM&#xff09;volatile&#xff08;可见…

智慧公厕是对智慧城市“神经末梢”的有效激活,公共厕所实现可感知、可视化、可管理、可控制

在当今科技迅速发展的时代&#xff0c;智慧城市已经成为人们关注的热点话题。作为城市基础设施的重要组成部分&#xff0c;公共厕所也逐渐融入到智慧城市的建设中&#xff0c;成为城市管理的焦点之一。智慧公厕作为智慧城市的“神经末梢”&#xff0c;通过可感知、可视化、可管…

tcpdump 如何使用

tcpdump 是一个在Unix和类Unix系统上运行的网络抓包工具&#xff0c;它用于捕获网络流量并将其转储到文件中以供后续分析。tcpdump非常强大&#xff0c;可以用于监控、调试和分析网络通信&#xff0c;用于排查网络问题以及安全审计。以下是关于如何使用tcpdump的详细介绍&#…

单片机C语言实例:13、看门狗

一、看门狗溢出测试 程序实例1&#xff1a; #include<reg52.h>sfr WDTRST 0xA6; sbit key P3^1; /*------------------------------------------------喂狗 ------------------------------------------------*/ void Rst_Watchdog( void ) {WDTRST 0x1E…

【文末送书】Matlab科学计算

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

遥感图像应用:在低分辨率图像上实现洪水损害检测(迁移学习)

本文是上一篇关于“在低分辨率图像上实现洪水损害检测”的博客的延申。 代码来源&#xff1a;https://github.com/weining20000/Flooding-Damage-Detection-from-Post-Hurricane-Satellite-Imagery-Based-on-CNN/tree/master 数据储存地址&#xff1a;https://github.com/Jef…

CSS宽度问题

一、魔法 为 DOM 设置宽度有哪些方式呢&#xff1f;最常用的是配置width属性&#xff0c;width属性在配置时&#xff0c;也有多种方式&#xff1a; widthmin-widthmax-width 通常当配置了 width 时&#xff0c;不会再配置min-width max-width&#xff0c;如果将这三者混合使…

MySql 变量

1.系统变量 1.1 系统变量分类 变量由系统定义&#xff0c;不是用户定义&#xff0c;属于 服务器 层面。系统变量分为全局系统变量&#xff08;需要添加 global 关键字&#xff09;以及会话系统变量&#xff08;需要添加 session 关键字&#xff09;&#xff0c;有时也把全局系…

Web安全——Web安全漏洞与利用上篇(仅供学习)

SQL注入 一、SQL 注入漏洞1、与 mysql 注入的相关知识2、SQL 注入原理3、判断是否存在注入回显是指页面有数据信息返回id 1 and 114、三种 sql 注释符5、注入流程6、SQL 注入分类7、接受请求类型区分8、注入数据类型的区分9、SQL 注入常规利用思路&#xff1a;10、手工注入常规…

CSDN每日一练 |『小艺照镜子』『Ctrl+X,Ctrl+V』『括号上色』2023-09-11

CSDN每日一练 |『小艺照镜子』『Ctrl+X,Ctrl+V』『括号上色』2023-09-11 一、题目名称:小艺照镜子二、题目名称:Ctrl+X,Ctrl+V三、题目名称:括号上色一、题目名称:小艺照镜子 时间限制:1000ms内存限制:256M 题目描述: 已知字符串str。 输出字符串str中最长回文串的长度…

MySQL的权限管理与远程访问

MySQL的权限管理 1、授予权限 授权命令&#xff1a; grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名用户地址 identified by ‘连接口令’; 该权限如果发现没有该用户&#xff0c;则会直接新建一个用户。 比如 grant select,insert,delete,drop on atguigudb.…

驱动开发,stm32mp157a开发板的led灯控制实验

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2.LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&g…

文件操作(个人学习笔记黑马学习)

C中对文件操作需要包含头文件<fstream > 文件类型分为两种: 1.文本文件&#xff1a;文件以文本的ASCII码形式存储在计算机中 2.二进制文件&#xff1a;文件以文本的二进制形式存储在计算机中&#xff0c;用户一般不能直接读懂它们 操作文件的三大类: 1.ofstream: 写操作 …

SpringBoot项目启动时预加载

SpringBoot项目启动时预加载 Spring Boot是一种流行的Java开发框架&#xff0c;它提供了许多方便的功能来简化应用程序的开发和部署。其中一个常见的需求是在Spring Boot应用程序启动时预加载一些数据或执行一些初始化操作。 1. CommandLineRunner 和 ApplicationRunner Spri…

CentOS Python环境搭建

安装依赖 yum install -y libffi-devel wget gcc make zlib-devel openssl openssl-devel ncurses-devel openldap-devel gettext bzip2-devel xz-devel下载安装包 wget "https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz" 编译安装 # 3.1、解压安装包…

Python的常用函数有哪些,作用是什么?

Python是一种高级编程语言&#xff0c;广泛用于数据科学、人工智能、网络编程等领域。 Python提供了许多内置函数和标准库&#xff0c;可以完成各种任务&#xff1a; 1、print()函数&#xff1a;将文本输出到控制台。可以将字符串、数字和变量等输出到控制台。 2、input()函…