MCU--常用于单片机的接口适配器模式C语言实现

发布者:cwm6269310最新更新时间:2022-07-13 来源: csdn关键字:MCU  单片机  C语言 手机看文章 扫描二维码
随时随地手机看文章

前言

通俗的讲,适配器模式是将一个类的接口转换成客户希望的另外一个接口,在我们编写程序的时候,尤其是在我们使用到单片机做项目的时候,经常会用到。

图片

但是往往我们做项目写程序的时候,并没有想到那么多,如果在不带操作系统的情况下,想要整个框架易于移植,易于理解,那么我们真的需要好好想想这个设计模式怎么写了。


下面我根据自己的项目经验,来说说适用于单片机的接口适配器模式的实现。大佬勿扰,多多指教。


一般实现

在我们做项目的时候,一般的实现,可能我们会这样写代码

// FileName: test.c

// 来源:公众号【技术让梦想更伟大】

#include

#include “ExternModule.h”

 

int main(void)

{

 

  /*初始化*/

  vAllInit();

  

  while(1)

  {

  

    /*项目逻辑*/

    vLogicModule1();

    

    vLogicModule2();

    

  }

}


在其外部文件中,调用相对应的初始化函数以及逻辑函数,但是当我们项目很复杂的时候,逻辑关系也层层覆盖、交替的时候,这样的写法就有些不是很好看了。


接口适配器

首先我们还是要来定义数据结构,一般这样的项目分为这样几个步骤:

  1. 初始化

  2. 输入

  3. 处理

  4. 输出

我们把这四个步骤封装起来,再定义数据结构如下:


// FileName: test1.c

// 来源:公众号【技术让梦想更伟大】

/* 适配器类型定义 */

struct _ADAPTER 

{

    void (*Init    )( void );  //初始化函数

    void (*Input   )( void );  //输入转换函数

    void (*Process )( void );  //处理函数

    void (*Output  )( void );  //输出转换函数

};


那么初始化函数,我们先来这样定义

// FileName: test1.c

// 来源:公众号【技术让梦想更伟大】

/* 模块初始化 */

void moduleInit( ADAPTER *module )

{

    if( module->Init != NULL )

    {

        module->Init();

    }

}


模块的逻辑运行,我们可以这样使用

// FileName: test1.c

// 来源:公众号【技术让梦想更伟大】

/* 模块逻辑运行 */

void moduleRun( ADAPTER *module )

{

    // 模块输入适配接口不为空,则执行输入适配操作

    if( module->Input != NULL )

    {

        module->Input();

    }

 

    // 模块处理接口不为空,则执行处理操作   

    

    // 模块输出适配接口不为空,则执行输出适配操作

}


在定好了这些数据结构以及封装之后,我们在每个子模块中都只需要调用这个模式即可。例如有一个需求,需要点一个灯,我们建立独立文件,在文件中申明

// FileName: led.c

// 来源:公众号【技术让梦想更伟大】

/*led灯运行 */

ADAPTER LedModule = { vLedInit, NULL, vLedRunModule, NULL };


那么接下来只需要对初始化函数,逻辑运行函数进行描述就可以了。同理,我们需要一个按键的功能,在另一个独立文件申请

// FileName: key.c

// 来源:公众号【技术让梦想更伟大】

/*按键运行 */

ADAPTER KeyModule = { vKeyInit, NULL, vKeyRunModule, NULL };


这样的话就便于我们拆分需求,便于移植,同时程序也就模块化了,最后我们在main文件中做的就是调用这些函数就行。我们需要这样做。


// FileName: main.c

// 来源:公众号【技术让梦想更伟大】

/*主函数 */

void main( void )

{

 

    moduleInit( &LedModule         );

    moduleInit( &keyModule         );

    

    while( 1 )

    {

        moduleRun( &LedModule        );

        moduleRun( &keyModule        );

    }

    

}



 

最后

main函数就是这么简单了,整个架构也是很清晰,体现出编程之美。

关键字:MCU  单片机  C语言 引用地址:MCU--常用于单片机的接口适配器模式C语言实现

上一篇:MCU--新塘N76E003--创建工程
下一篇:MCU--时间片&分时轮询

推荐阅读最新更新时间:2024-11-17 04:16

AVR AD转换的C语言编程
#include io8535v.h #define uchar unsigned char #define uint unsigned int uchar Table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Da ta ={0,0,0,0}; void DelayMs(uint i) //0.25ms {uchar j; for(;i!=0;i--) {for(j=250;j!=0;j--) {;}} } void Display(uchar *p) //间隔5ms显示 {uchar i,sel=0x01; for(i=0;i 4;i++)
[单片机]
AT89C52单片机与PC机之间的无线数据传输设计
在一些特殊的应用场合,单片机通信不能采用有线数据传输方式,而需要采用短距离的无线数据传输方式。短距离的无线传输具有抗干扰能力强、可靠性高、安全性好、受地理条件限制少、安装灵活等优点,可以利用单片机和专用无线传输芯片实现简单的短距离无线传输方案,硬件部分包括单片机端和PC机端,实现单片机和PC机间的数据传输。 主要器件: 1、 单片机端:AT89C52单片机芯片,用于控制无线模块的发射和接受;PTR2000无线数据传输模块,使用了433MHz IGM频段,是真正的单片UHF无线收发一体芯片,可以和单片机的串口直接相连。 2、 PC端:PTR2000无线数据传输模块;TTL电平转换RS-232电平芯片MAX202。 试验流程图
[单片机]
AT89C52<font color='red'>单片机</font>与PC机之间的无线数据传输设计
基于ZigBee协议的红外入侵检测系统的设计
在研究无线传感器网络(WSN)及ZigBee协议的基础上,提出了一种基于ZigBee技术的红外入侵检测系统的设计方案。该方案借助ZigBee技术在短距离无线通信方面的优势,利用Microchip公司的射频芯片MFR24J40,采用主动红外入侵探测装置实现了对入侵物体的实时检测及报警。 近年来随着科技的发展和人们安全防范意识的提高,基于红外线技术的入侵检测及报警技术已开始应用到防盗系统中 。现有的红外入侵检测系统多采用有线技术进行联网。这类方案的缺点是扩展性能差,布线繁琐,当线路老化或遭到磨损时,误报警率高。采用无线传输方式构建的无线入侵检测网络则可以避免这些问题。相对而言,无线方式比较灵活,可以适应移动或变化的需要
[安防电子]
基于ZigBee协议的红外入侵检测系统的设计
采用ATmega16单片机的干式变压器智能控制器系统设计
1工作原理   温控仪由温度监测、信号处理、输出控制三部分组成。系统框图如图1所示,它通过预埋在 变压器三相绕组中的三只铂电阻传感器获取绕组温度值,经信号调理电路处理后直接送入控 制器的A/D转换输入端。微控制器根据信号数据及设定的各种控制参数,按照嵌入的软件控 制规律执行计算与处理,自动显示变压器绕组的温度值、输出相应的控制信号、控制风机的 启停,并根据当前状态输出正常、报警和跳闸信号等,同时将各种数据通过RS-485传到上 位机实现集中监控。   温控仪控制核心采用ATmegal6单片机,它是一款基于AVR RISC的低功耗CMOS 8位单片机,在 一个时钟周期内执行一条指令,可以取得1MIPS/MHz的性能,因此具有实时性。
[单片机]
采用ATmega16<font color='red'>单片机</font>的干式变压器智能控制器系统设计
单片机+CPLD结构体系在电子设计中的应用
  自20世纪80年代单片机引入我国以来,学习和应用单片机的热潮始终不减,特别是MCS51系列。这是由单片机的特点决定的。实际上,从单片机/CPLD应用通用数字集成电路系统,到广泛应用单片机,是我国电子设计在智能化应用水平上质的飞跃。据统计分析,单片机的销量单片机/CPLD到目前为止依然逐年递增,而且在很长一段的时间内,单片机依然会是电子设计的主角(虽然这一地址已经受到了CPLD的挑战)。 1 纯单片机系统优缺点 ①大量单片机/CPLD的外围芯片和接口电路使得单片机应用系统的设计变得简单而且快捷,新型单片机的上市和高级语言的支持(如C51)进一步延长了单片机的寿命。 ②长期稳定的发展和使单片机性价比非
[单片机]
<font color='red'>单片机</font>+CPLD结构体系在电子设计中的应用
利用MCU的内部振荡器为电源增加智能控制,
传统上,开关电源(SMPS)是用一个基本的模拟控制环路来实现的,但数字信号控制器(DSC)技术的最新发展使得采用全数字控制机制的设计变得非常实用和经济,但是,预计全数字控制技术将最初应用在高端产品中,因为在高端产品中,该技术得好处非常明显和直接。 然而,许多模拟电源应用也能从即使最小、最便宜的微控制器(MCU)所提供的可配置能力和智能中获得很多好处,实际上,在电源中最少可能有4个独立的数字控制阶段,它们是开/关控制,比例控制配置、控制数字反馈或全数字控制,其中开关控制阶段具有一些令人瞩目的优势。 通过使传统开关电源MOSFET驱动器输出无效的开关输入翻转,脉宽调制(PWM)技术可被用来控制电源的工作时间,即缓慢地从0%到100%增加
[电源管理]
2051的比较器模拟AD源程序(C语言)
2051的比较器模拟AD源程序(C语言) /* io分配: * ;* OUTPUT: * ;* P1.0 ...... 模拟量输入 * ;* P1.1 ...... DA输入比较基准 电压 * ;* P1.2~7..... R-2R DA 电阻 网络 * ;* P3.7 ...... LED 模拟亮度输出 * ;* CPU C LOC K EQU 6M */ //xiaoqi last edit in 2001.11 //#pragma SRC #i nclude AT89x0
[单片机]
你了解GD32 MCU的命名规则吗
下面为大家介绍GD32 MCU的通用命名规则,以GD32F303ZGT6为例,其中,GD32代表GD32 MCU,F代表通用系列产品类型,303代表303产品子系列,Z代表144引脚数,G代表1MB Flash容量,T代表LQFP封装,6代表-40-85°温度等级。 命名规则详细说明如下表所示。 字符 说明 列举 GD32 代表GigaDevice 32位MCU 无 F 代表产品类型 F:SIP通用系列;E:eFlash嵌入式增强系列;L:超低功耗系列;VF:RISC-V系列;W:Wi-Fi无线系列;H:H7高性能系列;A:车规系列。 303 代表产品子系列 GD32F10X、GD32F1X0、GD32F20X、GD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved