单片机C语言分层思想,干货单片机程序的分层思想讲解

单片机设计中的分层思想实际上并不是什么高深的技术,有过项目经验的工程师基本上都了解单片机的分层。但是对于新手来说,单片机的分层就不那么令人理解了。单片机的分层结构能够帮助设计者对于电路有进一步的理解,本文就将为大家介绍单片机程序中的分层思想。

对于单片机的分层思想,有两个设计思想是非常重要的。一个就是“时间片轮的设计思想”,这个对实际中解决多任务问题非常有用,通常可以用这个东西来判断一个人是单片机学习者,还是一个单片机工程师。这个必须掌握。由于网上介绍这个的帖子也不少,所以这里就不多说了。

第二个就是“分层屏蔽的设计思想”。下面用扫描键盘程序例子作为引子,引出今天说的东西。

问题的提出:单片机学习板一般为了简单起见,将按键分配的很好,例如整个4*4的键盘矩阵分配到P1口上面,8条控制线,刚好。这样的话程序也非常好写。只需要简单的

KEY_DAT=P1;

端口的数据就读进来了。诚然,现实中没有这么好的事情。在实际的项目应用当中,单片机引脚的复用相当厉害,这跟那些所谓的单片机学习板就有很大的差别了。

另外一个原因,一般设计来说,是“软件配合硬件”的设计流程,简单点说就是,先确定好硬件原理图,硬件布线,最后才是软件的开发,因为硬件修改起来比较麻烦,相对来说软件修改的时候比较好改。这个就是中国传统的阴阳平衡哲学原理。硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得。方便了硬件设计,很可能给写软件带来很大的麻烦。反过来说,方便了软件设计,硬件设计也会相当的麻烦。如果硬件设计和软件设计同时方便了,那只有两种可能,一是这个设计方案非常简单,二是设计师已经达到了一个非常高的境界。我们不考虑那么多情况,单纯从常用的实际应用的角度来看问题。硬件为了布线的方便,很多时候会可能将IO口分配到不同的端口上面,例如上面说的4*4键盘,8根线分别分配到P0P1P2P3上面去了。那么,开发板的那些扫描键盘程序可以去见鬼了。怎么扫按键?

我们引入初中数学学的“映射”的概念来解决问题。基本思想就是,将不同端口的按键映射到相同端口上面。

这样按键扫描程序就分成3个层次了。

1)最底层的是硬件层,完成端口扫描,20ms延时消抖,将端口的数据映射到一个KEY_DAT寄存器上面,KEY_DAT作为对上层驱动层的一个接口。

2)中间的一层是驱动层,驱动层只对KEY_DAT寄存器的数值进行操作。简单点说,我们无论底层的硬件是怎么接线的,在驱动层都不需要关心,只需要关心KEY_DAT这个寄存器的数值是什么就可以了。这样出来的间接效果就是“屏蔽了底层硬件的差异”,所以驱动层写的程序就可以通用了。驱动层的另外一个功能是为了上层提供消息接口。我们用了类似window程序的消息的概念。这里可以提供一些按键消息,例如:按下消息,松开消息,长按键消息,长按键的时候的步进消息,等等。

3)应用层。这里就是根据项目的不同分别写按键功能程序,属于最上层的程序。它使用的是驱动层提供的消息接口。在应用层写程序的思想就是,不管下层是怎么工作的,只关心按键消息。有按键消息来的时候我就执行功能,没有消息来的时候,我就什么也不做。

下面用一个简单的常用的例子,说明我们这个设计思想的用法。秒表调整时间的时候,要求按着某个按键不放,时间能连续的向上增加。这个东西很实用,实际的家电中用途很广泛。在看下面的东西之前,大家可以想一下,这东西难吗?相信大家都会很响亮的回答,“不难!!”,然而再问:“这东西麻烦吗?”相信很多人肯定会说“很麻烦!!”

项目要求:两个按键,分别分配在P10和P20,分别是“加”“减”按键,要求长按键的时候实现连续加和连续减的功能。

实战:假设:按键上拉,没有按键的时候高电平,有按键的时候低电平,另外,为了突出问题,这里没有将延时消抖的程序写上去,在实际项目中应该加上。C语言函数参数的传递多种多样,这里作为例子,用了最简单的全局变量来传递参数,当然你也可以用unsignedcharReadPort(void)返回一个读键结果,甚至还可以voidReadPort(unsignedchar*pt)用一个指针变量传递地址而达到直接修改变量的目的。方法是多种多样的,这个决定于每个人的程序风格。

1)开始写硬件层程序,完成映射

#defineKYE_MIN0X01

#defineKEY_PLUS0X01

unsignedcharKeyDat;

voidReadPort(void)

{

if(P1&KEY_PLUS==0){

KeyDat|=0x01;

}

if(P2&KEY_MIN==0){

KeyDat|=0x02;

}

}

C语言应该很容易看懂吧?如果KEY_PLUS按下,P10口读到低电平,则P1&KEY_PLUS的结果为0,满足if的条件,进入KeyDat|=0x01是将KeyDat的bit0置一,也就是说,将KEY_PLUS映射到KeyDat的bit0

KEY_MIN是同样的道理映射到KeyDat的bit1

如果KeyDat的bit0为1,则说明KEY_PLUS按下,反则亦然。

不需要想的很神秘,映射就是这么一回事。如果还有其他按键的话,用同样办法,将他们全部映射到KeyDat上面。

2)驱动层程序编写

如果将KeyDat想象成P1口,那么这个跟学习板那标准的扫描程序不就是一样了吗?对的,这个就是底层映射的目的了。

3)应用层程序编写

根据消息,硬件层是必须分离出来,然而驱动层和应用层的要求就不那么严格了,事实上一些简单的项目没有必要将这两层分离开来,根据实际应用灵活应对就可以了。其实这样写程序是很方便移植的,根据板子的不同而适当的修改一下硬件层那个ReadPort函数就完成了,驱动层和应用层很多代码可以不经过修改直接用,很能提高开发效率的。当然这个按键程序会存在一定的问题,特别是遇到常闭按键和点触按键的混合使用的场合。这个留给大家自己去想了,反正问题总是能找到解决办法的,尽管方法有好有坏。

以按键为媒介,介绍了程序设计当中的“分层屏蔽”的思想的原理和应用,按键只是一个例子,其实分层的思想普遍存在着程序设计当中。细心留意一下的话发现其实window,linux,网络的tcp/ip结构全部都是分层的。这东西不是绣花枕头,而是实际用在工程上面的,只是平时不多见帖子介绍,或者没有人特意这样来总结,又或者是有经验的工程师作为藏在心中的法宝吧,这个就不得而知了。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单片机分层思想是指将程序设计分为不同的层次,以实现模块化和清晰的代码结构。例如: - 低层:硬件驱动层,负责控制单片机与外部硬件的交互。 - 中层:核心层,负责实现主要的控制逻辑。 - 高层:用户层,负责实现用户界面和人机交互。 这样的分层思想可以使得代码更易于维护和扩展。 ### 回答2: 当谈到单片机分层思想时,可以用一个计算器的例子来解释。 假设我们要设计一个简单的计算器,包含加法和减法功能。首先,我们需要将整个计算器系统分为两个层级:硬件层和软件层。 在硬件层,我们需要设计并实现处理器、存储器和输入输出接口等。处理器负责执行操作指令,存储器用于存储数据和指令,输入输出接口用于接收用户的输入和显示计算结果。 在软件层,我们需要编写程序来实现计算器的功能。我们可以将功能分解成更小的模块,例如加法模块和减法模块。在每个模块中,我们可以进一步分解成更小的子功能,例如加法模块可能包括加法操作、数据读取和结果输出等子功能。 在分解每个模块时,我们需要考虑模块之间的接口和依赖关系。例如,加法模块需要从用户输入中获取两个加数并将结果传递给显示器模块。 这种分层思想的好处是可以降低系统的复杂度,增强系统的可维护性和可扩展性。例如,如果我们想要添加一个新的功能,比如乘法,我们只需要在软件层添加一个新的乘法模块,而不需要改变硬件层。 总结来说,分层思想单片机的设计中起到了重要的作用。通过将系统划分为不同的层级,我们可以更好地组织和管理系统的功能模块,使得整个系统更加易于理解、开发和维护。 ### 回答3: 当我们谈到单片机分层思想时,可以把它比作一个多层的蛋糕。每一层蛋糕的功能和责任都不同,但它们协同工作,共同完成最终的目标。 首先是底层硬件层,它对应于单片机的底层电路和引脚,负责与外设和外部环境进行交互。就像蛋糕的底底一样,它提供了一个稳定的基础,确保整个系统的运行。 接下来是驱动层,它负责与硬件层进行交互,控制和操作硬件资源。就像蛋糕的奶油层一样,它是我们与蛋糕本身进行交互的界面,同时也提供了一种保护硬件的屏障。 在驱动层之上是操作系统层,它提供了一系列的功能和服务,例如任务调度、内存管理和设备驱动程序等。就像蛋糕的蓝莓层一样,它给整个系统增添了一些额外的功能和便利。 最后是应用层,它是整个系统的顶层,负责实现特定的功能和业务逻辑。就像蛋糕上的草莓一样,它是整个系统最引人注目的部分,为用户提供了具体的价值和体验。 这种分层思想的好处在于,每一层都有明确的职责和功能,并且它们可以相互独立地开发和维护。例如,如果我们需要修改硬件层的某个功能,我们只需要关注底层硬件层,而不需要考虑上层的任何变化。这也提高了系统的可维护性和可扩展性。 总之,单片机分层思想就像一个由多层构成的蛋糕,每一层都有自己的功能和责任,通过协同工作实现最终的目标。这种分层思想提供了一种清晰的设计和开发方法,使得单片机系统更加稳定、可维护和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值