首页 > 编程知识 正文

单片机原理及接口技术胡汉才答案,干货店

时间:2023-05-05 17:05:05 阅读:172675 作者:3661

晾衣架单片机程序的分层思想阐释

来源:华强电子网

作者:谦让的柠檬

陟览: 376

时间: 2016-11-02 16:00

标签:

概要:

设计中的分层思想实际上并不是高级技术,有项目经验的工程师基本上理解单片机的分层。 但是对于初学者来说,单片机分层并不那么容易理解。 单片机的分层结构可以帮助设计者对电路有进一步的理解。 本文介绍单片机程序中的层次思想。 对于单片机的分层思想,两种设计思想非常重要。 一种是“时间轮设计思想”,它实际上对解决多任务问题非常有用,通常可以用它来判断是单片机的学习者

设计中的分层思想实际上并不是高级技术,有项目经验的工程师基本上理解单片机的分层。 但是对于初学者来说,单片机分层并不那么容易理解。 单片机的分层结构可以帮助设计者对电路有进一步的理解。 本文介绍单片机程序中的层次思想。 对于单片机的分层思想,两种设计思想非常重要。 一种是“时间轮设计思想”,它实际上对解决多任务问题非常有用,通常可以用它来判断是单片机学习者,还是单片机工程师。 这个必须把握。 在网上介绍这个的帖子也不少,所以在这里不多说了。 二是“分层屏蔽的设计思想”。 用扫描键盘程序的例子作为引子,引出今天说的话。 问题的提出:单片机的学习板一般比较简单,所以经常分配按钮,比如整个4*4的键盘矩阵分配在P1口上面,8条控制线,正好。 这样的话程序也很容易写。 简单的KEY_DAT=P1; 端口的数据进来了。 确实,现实中没有这么好的事情。 在实际项目应用中,单片机管脚复用相当厉害。 这与所谓的单片机学习板有很大的不同。 另一个原因是,典型的设计流程是“软件适合硬件”。 简单来说,就是先确定硬件原理图,进行硬件布线,最后进行软件开发。 因为硬件的修改很麻烦,所以相对来说在软件修改时比较容易变更。 这就是中国传统阴阳平衡哲学的原理。 硬设计和软设计本来就是鱼和熊掌的关系,两者不能兼得。 硬件设计变得方便,很可能给写软件带来很大的麻烦。 反过来说,如果软件设计变得方便的话,硬件设计也会相当麻烦。 如果硬件设计和软件设计同时方便了,那只有两种可能性。 一是这个设计方案非常简单,二是设计师达到了非常高的境界。 我们不考虑那么多情况,只是从常用实用的角度来看问题。 由于硬件布线的原因,在许多情况下,可以将IO端口分配到不同的端口上。 例如,在上面的4*4键盘中,8条线分别分配在P0P1P2P3之上。 那么,开发板的扫描键盘程序可以去他妈的。 怎么扫描按钮? 我们引入中学数学所学的“映射”概念来解决问题。 基本思想是将不同端口的密钥映射到同一个端口上。 这样,按键扫描程序可以分为三个级别。 1 )底层为硬件层,完成端口扫描,延迟20ms消除抖动,将端口数据映射到一个KEY_DAT寄存器上,KEY_DAT为上层驱动层的一个接口。 2 )中间层是驱动层,驱动层仅操作KEY_DAT寄存器的值。 简而言之,无论底层硬件如何布线,驱动层都不需要在意,只需要在意KEY_DAT这个寄存器的数值是什么就可以了。 这样出现的间接效果“屏蔽了基础硬件的差异”,驱动程序层编写的程序就可以通用了。 驱动层的另一个功能是向上层提供消息接口。 我们使用了像window程序一样的消息的概念。 您可以在此提供几条按键消息,包括按下消息、释放消息、长按消息和长按时的步进消息。 3 ) APP应用层。 这里,针对每个项目写入键功能程序,是属于最上层的程序。 使用驱动程序层提供的消息接口。 在APP应用层编写程序的思想是,无论下层如何工作,都只关心关键消息。 收到关键信息时执行功能,但没有消息时什么都不做。 用一个简单的一般例子来说明我们这个设计思想的使用方法。 用秒表调整时间时,如果按住某个按钮,则要求时间连续地向上增加。 这很实用,在实际家电中用途很广。

在看下一个之前,大家要想想。 这个东西难吗? 相信大家会大声回答,“不难! ”但是,“这很麻烦吗? ”。 一定会有很多人说:“太麻烦了! ”项目要求:两个按钮分别被分配给P10和P20。 分别为“正”“负”按钮,要求长按时实现连续正负功能。 实战:假设:向上拉动按钮,没有按钮时为高电平,有按钮时为低电平。 另外,为了强调问题,这里没有编写消除延迟的程序,所以应该追加到实际项目中。 C语言函数的自变量的传递有很多种,这里作为例子,使用最简单的全局变量传递自变量。 当然,既可以用unsignedcharreadport(void )返回一个读键结果,也可以用voidreadport (unsigned char * pt )传递地址直接变更变量的方法是各种各样的1 )开始编写硬件层程序,# define kye _ min0x 01 # define key _ plus0x 01 unsignedcharkeydat; voidreadport(void ) if ) P1key_plus==0) { KeyDat|=0x01; if(P2key_min==0) { KeyDat|=0x02; C语言很容易理解吧? 当KEY_PLUS被按下,并且P10端口读取低电平时,P1 KEY_PLUS的结果为0,并且满足if的条件,并且前进到KeyDa

t|=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五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。