STC15单片机-LED闪烁(面向对象程序结构)

news/2024/5/19 23:33:08/文章来源:https://blog.csdn.net/weixin_46251230/article/details/126634151

LED闪烁(面向对象程序结构)

将LED闪烁(延时等待)的程序修改为面向对象的程序结构,C语言面向对象主要由结构体函数指针实现

以后也都采用这种程序设计方法

面向对象知识

面向对象是软件开发方法,是相对于面向过程来讲的。通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模, 更贴近事物的自然运行模式 单片机 C 语言的面向对象编程,是利用结构体,将变量、指针、函数等进行封装,达到编程更加方便、程序可读性更好、方便移植等目的。

1、结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据 集合。 常用的定义方法:

typedef struct { 
变量;
指针; 
函数指针;
} 结构体名称_t;

2、指针

指针是地址,指向内存中的变量。 常用的定义方法:数据类型 * 指针名;

3、函数指针

函数指针是指向函数的指针变量。 常用的定义方法:返回值类型 ( * 指针变量名) ([形参列表]);

文件整体架构

在这里插入图片描述

main.c -> 主函数文件,包含 main 函数等;

main.h -> 包含工程的所有头文件,都用#include" "包含进来,其他.c文件只需要包含main.h即可;

Public.c -> 公共函数文件,包含 Delay 延时函数等;

Public.h -> 基本数据类型重命名,定义包含函数指针的结构体类型,用类型定义变量并声明为外部可引用;

Sys_Init.c -> 系统初始化函数,包含 GPIO 初始化函数、上电运行指示灯等;

Sys_Init.h -> 定义包含函数指针的结构体类型,用类型定义变量并声明为外部可引用;

LED.c -> LED 外设函数,包含 LED 打开、关闭、不断翻转函数等;

LED.h -> LED端口、打开和关闭宏定义,再定义包含函数指针的结构体类型,用类型定义变量并声明为外部可引用。

编写流程

1.先创建好工程文件夹,然后创建app、user、obj三个文件夹,打开keil新建工程,魔术棒里更改工程文件到obj文件夹,C51选项导入app、user文件夹路径,回本地删除 object 和 listing 文件夹

2.user目录下添加main.c和main.h文件,在main.c文件中添加源文件的架构注释,如下面代码注释所示,如果是在其他.c文件中,则把开头的工程说明删掉即可,可以在keil工具中添加自定义代码,把这些注释加进去就行,方便以后的代码编写

/******************************************************************************* @file    main.c * @author  xxx* @version V1.0* @date    2022-5-3* @Conpany * @project LED闪烁(面向对象程序结构)
*******************************************************************************//* Includes ------------------------------------------------------------------*/
#include <main.h>/* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*//* Public variables-----------------------------------------------------------*//* Private function prototypes------------------------------------------------*//** @name   main* @brief  主函数* @param  void	* @retval int      
*/
int main(void)
{	//系统初始化//系统主循环while(1){}
}
/********************************************************End Of File
********************************************************/

keil工具添加自定义代码方法:

1.从project面板切换到Templates面板,点击空白处,然后右键Configure Templates,跳到添加代码面板

在这里插入图片描述

2.在弹出的面板中添加自定义的代码块,新增后起个名字,在Text框内编写自定义代码块,也可提前写好复制进去,最后保存,重启一下keil软件,再次打开Templates面板就可以双击名字使用自己提前定义的代码块了

在这里插入图片描述

3.main.h头文件的架构如下所示,其他头文件也类似,如果没有需要引入的头文件则可以把Includes注释行删掉

#ifndef __MAIN_H_
#define __MAIN_H_/* Includes ------------------------------------------------------------------*/
#include <STC15.h>/* extern variables-----------------------------------------------------------*//* extern function prototypes-------------------------------------------------*/ #endif
/********************************************************End Of File
********************************************************/

4.代码的架构写好后,就要开始编写功能代码了,一个文件里函数声明、函数实现和变量定义等都根据注释的区域来写,所以多少源文件和头文件的风格都类似,举延时函数的例子,其他代码写法都相似,就靠多写多练了,写多了就熟悉了

5.在user文件夹中新建public.c文件,该文件是存放一些公共的定义或函数的,比如数据类型重定义,延时函数;然后再新建public.h文件,用来定义数据类型;

代码的编写顺序在下面程序注释中写好,可参考着编写,也不一定非得按这顺序,熟悉逻辑后,哪一步先写后写无所谓,在需要时知道在哪里补写就行。

public.c:

/* Includes ------------------------------------------------------------------*/
#include <main.h>								/*3.引入头文件,public.h被包含在了main.h头文件中*//* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*/
static void Delay_ms(uint16_t ms);				/*6.一个或多个函数的声明*/
/* Public variables-----------------------------------------------------------*/
Public_t Public = 							/*7.结构体变量的初始化,用函数指针指向函数*/
{Delay_ms
};
/* Private function prototypes------------------------------------------------*//*
* @name   Delay_ms
* @brief  毫秒延时函数
* @param  ms -> 要延时的时间
* @retval None
*/
static void Delay_ms(uint16_t ms)				/*2.在public.c文件中编写一个或多个函数实现*/
{unsigned char i, j;while(ms--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}
}/********************************************************End Of File
********************************************************/

public.h:

#ifndef __PUBLIC_H_
#define __PUBLIC_H_//数据类型重定义							/*1.先在public.h文件中重定义数据类型,因为后面的函数可能会用到*/
typedef signed char           sint8_t;
typedef signed short int      sint16_t;
typedef signed long int       sint32_t;typedef unsigned char          uint8_t;
typedef unsigned short int     uint16_t;
typedef unsigned long  int     uint32_t;//结构体定义
typedef struct 						/*4.定义结构体,里面是函数指针,有多少个函数实现,就定义多少个函数指针*/
{void (*Delay_ms)(uint16_t ms);
}Public_t;
/* extern variables-----------------------------------------------------------*/
extern Public_t Public;				/*5.用结构体类型定义一个变量后,用extern声明为外部可调用*/
/* extern function prototypes-------------------------------------------------*/ #endif
/********************************************************End Of File
********************************************************/

main.c:

最后在主函数中用结构体变量调用响应的函数就能实现相应的功能

/******************************************************************************* @file    main.c * @author  qzx* @version V1.0* @date    2022-xx-xx* @Conpany * @project STC15实战项目
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <main.h>/* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*//* Public variables-----------------------------------------------------------*//* Private function prototypes------------------------------------------------*//*
* @name   main
* @brief  主函数
* @param  void
* @retval int   
*/
int main(void)
{//系统主循环while(1){Public.Delay_ms(1000);			/*8.通过结构体变量调用Delay_ms函数,实现延时功能*/}
}
/********************************************************End Of File
********************************************************/

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

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

相关文章

Netty(12)自定义RPC框架的通信

在之前的聊天项目中&#xff0c;新增 Rpc 请求和响应消息 消息 新增消息 Data public abstract class Message implements Serializable {// 省略旧的代码public static final int RPC_MESSAGE_TYPE_REQUEST 101;public static final int RPC_MESSAGE_TYPE_RESPONSE 102;…

springboot系列(二十一):基于AOP实现自定义注解且记录接口日志|超级超级详细,建议收藏

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 &#x1f6ab;特别声明&#xff1a;原创不易&#xff0c;转载请附上原文出处链接和本文声明&#xff0c;谢谢配合。 &#x1f64f;版权声明&#xff1a;文章里可能部分文字或者图片来源于互联网或者百度百科&#xff0c;如有…

Scss--将node-sass切换为sass(原dart-sass)

原文网址&#xff1a;Scss--将node-sass切换为sass(原dart-sass)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍node-sass与sass&#xff08;原dart-sass&#xff09;&#xff0c;以及如何将node-sass切换为sass&#xff08;原dart-sass&#xff09;。 sass依赖原来是dart-s…

Alibaba之jvm-sandbox初体验

前言 在开始之前&#xff0c;我们先来模拟一下以下的场景&#xff1a; 小李&#xff1a;“小明&#xff0c;你的接口没有返回数据&#xff0c;麻烦帮忙看一下&#xff1f;” 小明&#xff1a;“我这边的数据也是从别人的服务器中拿到的&#xff0c;但是我不确定是因为逻辑处理…

alluxio简单使用

alluxio简单使用 本文是基于alluxio官网和自己实践整理。 Alluxio版本&#xff1a;1.8.1CDH 1.15.2 1、介绍 以内存为中心的分布式虚拟存储系统。Alluxio在上层计算框架和底层存储系统之间架起了桥梁&#xff0c;应用层只需要访问Alluxio即可以访问底层对接了的任意存储系统的…

Oracle索引详解

索引 类似于书的目录&#xff0c;提高查询效率。 创建索引语法&#xff1a; CREATE [UNIQUE] [BITMAP] INDEX 索引名称 ON 表名(字段,[字段,..,..]);名词解释&#xff1a;UNIQUE 唯一索引BITMAP 位图索引默认不写 UNIQUE 和 BITMAP 为普通索引表名后面写多个字段为复合索引在字…

activeMQ、rabbitMQ学习对比心得

一、activemq activemq工作模型比较简单。只有两种模式 queue、topics 。 queue就多对一&#xff0c;producer往queue里发送消息&#xff0c;消费者从queue里取&#xff0c;消费一条&#xff0c;就从queue里移除一条。如果一个消费者消费速度不够快怎么办呢&#xff1f;在act…

About-Flink

About-Flink 一、Flink简介 1.1、flink特点1.2、分层Api1.3、Flink vs Spark Streaming 二、Flink批处理应用 2.1、依赖的引入2.2、准备批处理文件2.3、wordCount编码2.4、自定义类 三、Flink流处理应用 3.1、wordCount编码3.2、设置并行度-默认为43.2、数据来源socket3.3、配…

通过 replace() 和正则实现 将文本中的所有数字颜色高亮

实现的效果&#xff1a; 用到的知识点&#xff1a; replace() 方法用于在字符串中用一些字符替换另一些字符&#xff0c;或替换一个与正则表达式匹配的子串。 repalce&#xff08; a, b &#xff09; 必须传两个值&#xff0c;其中a 是要替换的文本&#xff0c;或者满足条件…

javaweb JAVA JSP球鞋销售系统购物系统ssm购物系统购物商城系统源码(ssm电子商务系统)

JSP球鞋销售系统购物系统ssm购物系统购物商城系统源码&#xff08;ssm电子商务系统&#xff09;

生产和同城存储双活架构下,发生脑裂问题影响数据库读写,如何快速分析问题和解决问题?

数据中心脑裂问题,简单说就是两个数据中心间的网络和存储链路同时发生中断,导致两个数据中心内的应用、数据库或者操作系统同时抢占和利用共享的资源,造成资源的数据不一致,产生重大影响。如何避免脑裂是每个存储双活方案都需要尤为重视的问题,脑裂会带来长时间的存储读写…

linux上redis单机的安装

1. 官网下载 https://github.com/redis/redis/archive/7.0.4.tar.gz 2. 上传到虚拟机/data/目录下、解压 tar -xzvf redis-7.0.4.tar.gz 3. 进入redis-7.0.4此目录 cd redis-7.0.4;ll 4. 安装到指定目录中 a. mkdir /usr/local/redis b. make PREFIX/usr/local/redis inst…

沃尔玛、eBay、wish、新蛋等美系平台对于测评风控点有哪些?怎么解决

很多人把各大平台风控想得过于简单&#xff0c;以为注册一批买家账号配一个IP就能进行下单上评&#xff0c;这也是导致市面上的测评现象杂乱无章。但是一定要明白一点各大电商平台都是一家数据公司他的算法一定是根据市场的变化而不断调整的。 平台检测的方式有很多种 1、平台…

RabbitMQ入门(二)

1.概述 RabbityMQ整体上是一个生产者和消费者模式。生产者生产消息到消息中间件的服务节点&#xff08;Broker&#xff09;,服务节点中包含交换器&#xff08;Exchange&#xff09;和队列&#xff08;Queue&#xff09;&#xff0c;生产的消息首先经过交换器&#xff0c;再由交…

搭建vue3项目

搭建vue3项目搭建准备创建项目选择所需配置运行项目vue3已经被大众所熟悉&#xff0c;很多公司都在做vue2到vue3的升级。 介绍vue3项目的搭建过程 搭建准备 前端开发环境需要node.js&npm node下载地址:http://nodejs.cn/download/ 根据自己电脑环境下载就行 安装vue-cli3…

2022/08/31 day14:企业级解决方案

文章目录目录缓存预热缓存雪崩缓存击穿缓存穿透性能指标监控总结目录 面试问题 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EtBtkGNE-1661933471760)(en-resource://database/5507:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下…

抖音小程序模板全行业整理合集,抖音小程序制作平台分享

小弟我是来自第三方抖音小程序制作平台的打工人&#xff0c;给大家整合了一些我们平台的抖音小程序模板&#xff0c;大家可以根据需要来获取。 步骤就是点击下方的链接&#xff0c;选好自己的抖音小程序模板&#xff0c;在平台注册账号直接套用到自己的抖音小程序上&#xff0…

深入理解蓝牙BLE之“信道管理”

目录 一.BLE的调制解调&#xff1a; 二.BLE的信道&#xff1a; 三.BLE的广播信道&#xff1a; 四.BLE的数据信道&#xff1a; 五.BLE信道管理&#xff1a; 5.1广播信道的随机延时&#xff1a; 5.2数据信道的调频算法&#xff1a; 跳频算法1&#xff1a; 跳频算法2&…

02.Haoop 虚拟机 桥接与NAT之间区别 及桥接设置

首先说 我的硬件准备&#xff0c;1台windows系统&#xff0c;1台mac pro 。 在 物理机上使用了 VMWARE CENTOS 7 的 方式进行配置。 那么我希望能实现把 这2台机器连在一起&#xff0c;做Hadoop 的集群。 网络问题是首先需要解决的事情&#xff0c;主要不通物理主机之间一直…

02:入门及安装(狂神说RabbitMQ)

RabbitMQ入门及安装 https://www.bilibili.com/video/BV1dX4y1V73Gp27 概述 简单概述&#xff1a; RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写&#xff0c;支持多种客户端&#xff08;语言&#xff09;&#xff0c;用于在分布式系统中存储消息&#xff0…