05节-51单片机-模块化编程

1.两种编程方式的对比

传统方式编程:
所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
模块化编程:
把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

2.模块化程序结构

要将Delay延时函数进行模块化,我们需要建立一个.c文件和.h文件,分别用于存放函数原型和函数声明。
在这里插入图片描述
注意事项:
.c文件:函数、变量的定义
.h文件:可被外部调用的函数、变量的声明

任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
使用到的自定义函数的.c文件必须添加到工程参与编译
使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
.h文件的存放位置:
情况1:和工程文件不在同一目录,则需要如图中所示位置,进行配置.h文件的路径:
在这里插入图片描述
情况2:和工程文件在同一目录,使用即可,为了方便查看,可以添加显示到keil中,如不添加也无妨。
在这里插入图片描述
在这里插入图片描述
这样我们在该处可以看到创建好的.h文件了,并在可方便的打开进行编辑

3.C预编译

C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)
在这里插入图片描述此外还有#ifdef,#if,#else,#elif,#undef等

4.实战

将上一节中的数码管显示,进行模块化
首先,新建Delay.c文件
在这里插入图片描述
Delay.c

void Delay(int ms)	//@12.000MHz
{unsigned char data i, j;while(ms--){i = 2;j = 239;do{while (--j);} while (--i);
}
}

然后,使用同样的方式建立Delay.h文件,并将.h文件添加到该处,在这里插入图片描述
在这里插入图片描述
并编写如下代码:
Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
unsigned char Delay(int ms);
#endif

同理处理Nixie函数,模块化为Nixie.c和Nixie.h
Nixie.c

#include <REGX52.H>  //该文件中需要用到P2,P0,所以需要包含void Nixie(unsigned char Location,unsigned char Number)
{unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77F,0x7C,0x39,0x5E,0x79,0x71,0x00};switch(Location){case 1:  P2_2=1;P2_3=1;P2_4=1;break;case 2:  P2_2=0;P2_3=1;P2_4=1;break;case 3:  P2_2=1;P2_3=0;P2_4=1;break;case 4:  P2_2=0;P2_3=0;P2_4=1;break;case 5:  P2_2=1;P2_3=1;P2_4=0;break;case 6:  P2_2=0;P2_3=1;P2_4=0;break;case 7:  P2_2=1;P2_3=0;P2_4=0;break;case 8:  P2_2=0;P2_3=0;P2_4=0;break;}P0=NixieTable[Number];
}

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned char Location,unsigned char Number);
#endif

main.c
其中< >的表示从keil安装目录寻找.h
" "则表示从当前目录寻找

使用<>:这种方式用于包含标准库文件或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找这些头文件。
例如:#include <REGX52.H>,REGX52.H应该是一个标准库或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找并包含该文件。
使用"":这种方式用于包含用户自定义的头文件或者当前目录下的头文件,编译器会首先在当前目录下查找这些头文件,如果找不到才会到标准库路径或者编译器指定的路径下查找。

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
void main()
{while(1){Nixie(1,1);Delay(1000); //Nixie(2,2);Delay(1000);Nixie(3,3);Delay(1000);Nixie(4,4);Delay(1000);Nixie(5,5);Delay(1000);Nixie(6,6);Delay(1000);Nixie(7,7);Delay(1000);Nixie(8,8);Delay(1000);}
}

补充:字体问题

在keil中编写代码,可能出现中文乱码等问题,因此需要改变编码格式:
通常采用的是UTF-8编码方式。
在这里插入图片描述

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

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

相关文章

STM32外设配置以及一些小bug总结

USART RX的DMA配置 这里以UART串口1为例&#xff0c;首先点ADD添加RX和TX配置DMA&#xff0c;然后模式一般会选择是normal&#xff0c;这个模式是当DMA的计数器减到0的时候就不做任何动作了&#xff0c;还有一种循环模式&#xff0c;是计数器减到0之后&#xff0c;计数器自动重…

Echats 引入地图(二) 之中国地图省份高亮

效果图&#xff1a; 代码&#xff1a; series: [{type: map,map: china,zoom: 1.2, // 地图放大aspectScale: 0.8, //地图宽高比例roam: true, //地图缩放、平移// 滚轮缩放的极限控制scaleLimit: {min: 0.5, //缩放最小大小max: 6, //缩放最大大小},itemStyle…

使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

从编译开始就开始出现错误&#xff0c;解决步骤&#xff1a; 1.降低graddle版本&#xff0c;7.2-bin --->>> 降低为 6.1.1-all #distributionUrlhttps\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrlhttps\://services.gradle.org/di…

5.HC-05蓝牙模块

配置蓝牙模块 注意需要将蓝牙模块接5v,实测接3.3v好像不太好使的样子 首先需要把蓝牙模块通过TTL串口模块接到我们的电脑,然后打开我们的串口助手 注意,我们现在是配置蓝牙模块,所以需要进入AT模式,需要按着蓝牙模块上的黑色小按钮再上电,这时候模块上的LED灯以一秒慢闪一次…

性能工具之emqtt-bench BenchMark 测试示例

文章目录 一、前言二、典型压测场景三、机器准备四、典型压测场景1、并发连接2、消息吞吐量测试2.1 1 对 1&#xff08;示例&#xff09;2.2 多对1&#xff08;示例&#xff09;2.3 1对多&#xff08;示例&#xff09; 五、遇到的问题client(): EXIT for {shutdown,eaddrnotava…

IDM2024破解版 IDM软件破解注册序列号 idm教程 idm序列激活永久授权 Internet Download Manager网络下载加速神器

你是不是感觉下载东西资源的时候&#xff0c;下载的非常慢&#xff0c;即便是五十兆的光纤依旧慢、是不是想下载网页上的视频但不知如何进行下载……这些问题是否一直在困扰着您&#xff0c;今日小编特意我大家带来了这款IDM 2024破解版。 众所周知&#xff0c;IDM是一款功能强…

ChatGPT实用指南2024

随着ChatGPT技术的演进&#xff0c;越来越多的人开始在工作中利用此工具。以下是关于ChatGPT的实用指南&#xff0c;适合不太熟悉此技术的朋友参考。 一、ChatGPT概述 1. ChatGPT是什么&#xff1f; ChatGPT是基于OpenAI开发的GPT大型语言模型的智能对话工具。它能够通过自然语…

1.8.5 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v4 和 Inception-ResNet

1.8.5 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v4 和 Inception-ResNet 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 1.8.3 卷积神经网络近…

oracle安装后报错ORA-01031: insufficient privileges

1.管理员身份打开CMD&#xff0c;输入net user查看计算机用户 2.键入"net localgroup ora_dba"查看ora_dba下的具体用户 3.键入"net localgroup ora_dba administrator /add"把本计算机用户都添加进ora_dba组下

接口测试——postman

一.下载与安装 https://www.getPostman.com/ 界面导航说明 二.get请求 第一个get请求 批量执行接口请求&#xff1a; 1. 右击run collection 2. 会出现runner标签页 携带参数的GET请求 所谓的查询参数&#xff0c;其实就是URL地址中问号&#xff08;?&#xff09;后面的部分…

使用Python进行自动化测试【第163篇—自动化测试】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

【C++】stack与queue(相关接口介绍、容器适配器、deque、模拟实现)

一、stack 1.1 stack介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供…

冯喜运:4.17昨日黄金完美区间多空通杀,今日黄金原油分析

【黄金走势分析 】&#xff1a;黄金昨日整体过山车&#xff0c;早盘黄金冲高2392一线后回落&#xff0c;价格在2379-2389区间震荡&#xff0c;午后区间下移&#xff0c;价格在2362-2380继续震荡&#xff0c;晚间价格再次触及2363支撑反弹&#xff0c;连阳上升突破早间高点&…

2024基于PHP开发的微信抖音小程序点餐系统开发源代码案例

最近新开发了一套小程序点餐系统&#xff0c;用户点餐之后可以选择堂食或者是外卖到家&#xff0c;这套系统主要功能有&#xff0c;产品展示&#xff0c;支付系统&#xff0c;外卖配送&#xff0c;用户系统&#xff0c;积分系统&#xff0c;商家管理系统&#xff0c;抽奖系统&a…

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考…

Python SQL解析和转换库之sqlglot使用详解

概要 Python SQLGlot是一个基于Python的SQL解析和转换库,可以帮助开发者更加灵活地处理和操作SQL语句。本文将介绍SQLGlot库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装SQLGlot库非常简单,可以使用pip命令进行安装: pip install sqlglot安装完成后…

【中级软件设计师】上午题08-UML(下):序列图、通信图、状态图、活动图、构件图、部署图

上午题08-UML 1 序列图2 通信图3 状态图3.1 状态和活动3.2 转换和事件 4 活动图5 构件图&#xff08;组件图&#xff09;6 部署图 UML图总和 静态建模&#xff1a;类图、对象图、用例图 动态建模&#xff1a;序列图&#xff08;顺序图&#xff0c;时序图&#xff09;、通信图&a…

Python爬虫入门教程!

什么是爬虫? 爬虫就是自动获取网页内容的程序&#xff0c;例如搜索引擎&#xff0c;Google&#xff0c;Baidu 等&#xff0c;每天都运行着庞大的爬虫系统&#xff0c;从全世界的网站中爬虫数据&#xff0c;供用户检索时使用。 爬虫流程 其实把网络爬虫抽象开来看&#xff0c;它…

数据相关术语、英文翻译以及定义汇总看这里!

随着数字化时代的快速发展&#xff0c;越来越多的小伙伴认识到了数据的作用性。今天我们小编就给大家汇总了部分数据相关术语以及定义&#xff0c;希望对大家有用哦&#xff01; 数据相关术语、英文翻译以及定义汇总看这里&#xff01;&#xff08;来源于网络&#xff0c;仅供参…

LeetCode 349.两个数组的交集(HashSet的使用)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums1 …