打印
[C语言]

单片机的编程方法

[复制链接]
2865|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SilentEE|  楼主 | 2017-9-24 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 SilentEE 于 2017-9-24 23:15 编辑

在我的理解中,我把单片机编程分为4种,这4种编程风格,或者说是算法风格,基本代表了电子工程师编程的四个阶段吧。欢迎大家拍砖。

1:学院派编程方法

          之所以称之为学院派编程方法,是因为这个编程方法在大学校园比较流行,也正是因为这个原因,刚毕业的大学生也大多采取这类编程方法。我非常不建议这类编程方法,下面以按键检测举例分析:


         这样检测按键是不行的,因为单片机是在死等按键释放而不执行其他任何操作。老师讲解的时候,只是告诉你了最基本的方法,用最简单的方法让你明白怎样使用单片机检测按键,这样做既对又不对。对是因为的确达到了教学目的,完成了传道授业的任务;不对是因为给同学们造成了很大误导,甚至说是交给了同学们错误的方法,直到某一天跳进深坑还浑然不知。如果项目的要求是通过按键调整数码管显示的数据,在按键按下的时间里,单片机在死等,那么数码管的显示是无法刷新数据的,这显然是不合理的,事实上也不会有开发者会采用这样的方式。

2:传统编程方法

          有的同学会问,既然死等不可以,那我不死等好了,或者说我不一直死等,并且我用延时一段时间的方式消抖,效果也挺不错的。敲黑板,这里的延时方式消抖,恐怕也是大学老师教给你的吧。(在这里没有恶意,实在是感觉这类方法不适合再出现在大学课堂之上了,已经害了许多人,作者就是受害者之一。)


       我们一边看图一边分析,这个按键检测的思路比起第一种方法有很大进步,放弃了死等按键释放的方式,先检测按键是否按下,如果按下,消抖延时20ms,防止误触发,如果20ms后检测按键还是按下的,执行相对应的动作。可是再回到刚刚问过的问题,如果项目要求数码管显示,这20ms实在是太长了,数码管20ms刷新一次,给人的感觉是闪烁的很厉害,这显然不是我们想要的效果。而且20ms延时消抖,这样的消抖方式也是我不推荐的,至于采用什么样的消抖方式,下文会讲到。

         同时,我还想提出一个问题,如果我的端口非常紧张,只剩下一个按键,这时候,要用一个按键代表两种功能——长按和短按,面对这样的问题,采用第二种方法就不足以解决了。实际上,第二种方法存在的问题不止这些,稍微考虑不严密,就可能造成逻辑错误。慎用delay!慎用delay!慎用delay!重要的事情说三遍。

3:时间片+状态机编程方法

        所谓时间片+状态机编程方法,就是一个任务分解,利用状态机分步执行。这样做的好处是逻辑清晰,软件维护成本小。首先,实现这种编程方法要有一个时间基准,我一般采用的方法是定时器中断,每过一段时间定时器溢出,在中断函数里把标志位置1,然后再主函数里检查标志位的状态来判断时间点是否来临。举个LED闪烁例子来说明一下这个编程方法。当然,这个方法可以用到其他方面,后面我会在**里详细说说这种方法。


4:嵌入式系统编程方法

这个编程方法目前我还不是很懂,所以就不过多讲述,目前我的理解是,嵌入式系统编程的方法是在程序中加入了操作系统的概念,基本的原理和时间片+状态机编程方法类似,但是要比前者复杂的多,其中还涉及到内存、堆栈等概念。一般简单的应用不必采用操作系统的编程方法,有点大**打蚊子的感觉,但是涉及到人机交互等复杂应用的场合,嵌入式系统编程方**让软件编程变得有条不紊,稳定可靠。

相关帖子

沙发
xcydwwq| | 2017-9-24 23:41 | 只看该作者
我觉得论坛的那位姓吴的大侠的方法不错,简单实用,但是长按和短按放在一个按键上会出现短按之后按键反应时间比较长的问题,这个如何解决?

使用特权

评论回复
板凳
SilentEE|  楼主 | 2017-9-25 12:21 | 只看该作者
xcydwwq 发表于 2017-9-24 23:41
我觉得论坛的那位姓吴的大侠的方法不错,简单实用,但是长按和短按放在一个按键上会出现短按之后按键反应时 ...

你好,建议你试试这个方法,可以方便地识别长按短按

QQ拼音截图未命名.png (35.38 KB )

QQ拼音截图未命名.png

使用特权

评论回复
地板
IICeeprom| | 2017-9-25 16:06 | 只看该作者
一个按键检测,你不推荐用while,你 不推荐用delay,你推荐啥?用中断?如果你对按键检测的要求那么高,你觉得你的中断就不紧张了吗?

使用特权

评论回复
5
kingkits| | 2017-9-25 16:15 | 只看该作者
我觉得好用就行了,别被那些自认为大侠的人给忽悠了。写完程序,实际测试一下,用着舒服,谁还管他怎么实现的。

使用特权

评论回复
6
IICeeprom| | 2017-9-25 16:42 | 只看该作者
gyugyb 发表于 2017-9-25 16:34
gyugyb邀请您访问21ic电子技术论坛
https://bbs.21ic.com/?fromuser=gyugyb

大哥,你是来骗积分的?

使用特权

评论回复
7
SilentEE|  楼主 | 2017-9-25 18:23 | 只看该作者
yyy71cj 发表于 2017-9-25 17:57
我的单按键对象中,对一个按键规定了多种状态,包含过程性状态,完全不依赖于其它代码,可以复制 ...

仔细看了一下,感觉您把按键检测做的很好,是很好的学习素材。

使用特权

评论回复
8
xcydwwq| | 2017-9-25 21:47 | 只看该作者
yyy71cj 发表于 2017-9-25 17:57
我的单按键对象中,对一个按键规定了多种状态,包含过程性状态,完全不依赖于其它代码,可以复制 ...

哈哈,你是不是那个单片机之编程魔法师的作者?我有你的书啊,回头翻翻去

使用特权

评论回复
9
oufuqiang| | 2017-9-25 22:36 | 只看该作者
思路最重要,代码随便你

使用特权

评论回复
10
山东电子小菜鸟| | 2017-9-26 18:30 | 只看该作者
我想说的是:各种方法有利有弊,还是结合具体的项目来,按键检查的方法很多,有耗时的,有资源合理利用的,但是如今的CPU速度那么快,你的资源真的不够用么,

使用特权

评论回复
11
xmar| | 2017-9-27 09:49 | 只看该作者
本帖最后由 xmar 于 2017-9-27 10:43 编辑

对于一般不是非常复杂、非常巨大系统的MCU编程,不是需要多人共同完成的编程而言,好的编程就是结构化编程。尽量采用结构化编程就是好的风格!(相反,对于种复杂系统编程需要面向对向了,在此略过。)

什么是结构化编程?只采用顺序结构、选择结构、循环结构以及这三种结构的组合与嵌套构成的程序就是结构化编程。因此,不合理的goto,全局变量,状态机、递归会破坏结构化编程。不是不用,尽可能少用,小心使用goto,全局变量,状态机、递归。—— 就是好的编程!
用形象例子来说。好的程序看起来象多个卷心菜,一层包一层,层层包裹但不粘连;卷心菜与卷心菜之间界面清晰。坏的程序看起来象混乱的网络管线,相互连接穿梭,摸不着头绪。

使用特权

评论回复
12
h286288986| | 2017-9-27 13:40 | 只看该作者
其实这四种方法个人觉得都还挺好的,不管哪种方法适合自己的项目就行,没必要追求高大上,用简单的方法实现同样的功能,做到稳定可靠,这是一个优秀的工程师的价值体现---

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

1

粉丝