我们来看单片机 的例子,读者可能会担心单片机(又称MCU,或微控制器) 过于专业而无法理解。完全没必要!在这里我们仅借它谈论一下有关时间的话题,顺带提一下单片机系统的概念。
单片机顾名思义是集成到一个芯片里面的计算机系统,计算机系统就意味着 它要跑程序,也就意味着要有人去编写这个程序。这同时意味着单片机本身并没有具体的功能,它是一个通用件,具体要实现什么功能取决于你编写的程序。
光是一块芯片可什么也干不了,首先要有一个目标程序文件,它可以是你亲 自编写的,也可以是朋友编写的,总之它在PC机里面是一个文件。然后我们通过连接到电脑的程序烧录器,打开配套的烧录软件,将这个文件导入到单片机内。(就像把文件复制到U盘一样)
单片机内已经有了程序,接下来要怎么让它工作起来呢?这非常简单,首先, 要给单片机加上一个晶振(晶振产生的脉冲信号将驱动单片机按时序工作);其次,当然要给单片机加电;最后给一个复位信号到复位管脚;它就开始运行程序了。这几个最基本的要素,集合在一起,也叫最小系统,如果不想自己亲手做,在网上能够轻松淘到。
言归正传我们切入正题,单片机系统往往要处理按键输入、数码管的显示、以及其他开关量信号的输入和输出处理。普通的8位单片机一般具备 24到32个IO(输入输出)引脚,每个引脚可以作为输入,也能作为输出。假设单片机供电电压为 5V,那么5V 即代表着程序中的1地)。而程序中的0相当于电压为0V(接最简单的输出应用:在P3.7管脚上面连接一个发光管的负极,发光管的正极通过限流电阻接电源。如果程序给P3.7赋值为 1,那么发光管两端电压都是5V电压差为0,处于熄灭状态。若程序给 P3.7赋值为0,那么发光管正极电压为5V,负极电压为0V(接地),电压差使发光管点亮。这样程序就可以控制发光 管的亮与灭了!最简单的输入应用:在P1.7管脚上面通过一个电阻接电源(上拉电阻),使它默认为5V 然后再将这个管脚通过一个按钮接地,当按钮按下时,管脚电压变为0V。程序只要从P1.7管脚读取数值为0时,表示该按键被按下。
单片机的输入和输出:S1-S4 按键输入,d1-d8 发光管输出
🔜🔜🔜🔜
回到时间的话题,先来看一下 摇摇棒的例子:
摇摇棒有一排 LED 发光管
夜里摇动摇摇棒的效果
这又是什么原理?这是一个眼睛被时间欺骗的经典案例!眼见为实吗?事实 告诉你,眼见并非为实,很多东西你看到了却并非你想的那样真实。同样还有很 多东西是你肉眼看不到的,但看不到并不证明不存在!我们先撇开摇摇棒的实现 原理,来看看我们眼睛的特性。
关于人类的视觉延时 ,百度百科这么说:视觉暂留(Persistence of vision)
现象是光对视网膜所产生的视觉在光停止作用后,仍保留一段时间的现象,其具体应用是电影的拍摄和放映。原因是由 视神经的 反应速度造成的。是动画、电影等视觉媒体形成和传播的根据。视觉实际上是靠眼睛的晶状体成像,感光细 胞感光,并且将光信号转换为神经电流,传回大脑引起人体视觉。感光细胞的感 光是靠一些感光色素,感光色素的形成是需要一定时间的,这就形成了视觉暂停 的机理。
物体在快速运动时,当人眼所看到的 影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。是人眼具有的一种性质。人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会立即消失,而要延续 0.1 -0.4秒的时间。人眼的这种性质被称为“眼睛的视觉暂留”。
读到这里,我想也就不用再解释摇摇棒的原理了!只要你切换的时间小于人 眼延时,我们的眼睛就会被欺骗。接下来再看一个异曲同工的小玩意:电动版摇 摇棒。
🔜🔜🔜🔜
数码管是廉价、简便、易于实现的显示元件,没错,其实就是7个(带上小 数点就是8个)被做成 条状和点状的发光管。它能够通过不同段位的组合显示 出基本的数字和字母,真是一项了不起的发明!
数码管的高明之处是码段的复用,通过 7 个段的排列组合,描绘出数量超过7种的数字和字母的象形符号。如将数码管的BC点亮,就是数字1,如果把ABGED点亮,就是数字2,非常形象,四岁的孩子都能读懂。数码管和单片机天然搭配,前面讲到单片机的I 口(输入输出口)能够直接控制发光管的亮灭,而一个数 码管只是8个发光管装在一个壳子里,数码管与单片机连接是酱紫的:
图中每个引脚上都加了电阻,是因为发光管本身是个二极管,二极管是不能 直接加电源的,千万别把发光管当灯泡一样接到电源,那样会因为电流过大而烧 毁。因此要串联一个电阻,以限制通过发光管的电流,单个发光管的电流在1-5mA之间。
现在问题来了,估计读者也意识到这个问题了:一个数码管至少需要7 个独 立的控制脚,如果一个系统需要8个甚至更多数码管排列进行显示时,那么至少要56个控制脚,而单片机管脚十分有限,难道一个单片机最多只能接2个数码管?
办法当然有,那就是在时间上做文章,终于回到时间的话题上来了:) 一般来说一个系统要实现的初级形态总是最复杂的,人们通过线路复用、空间复用、时间复用,总之是资源的复用来简化我们的系统。数码管用了7个段,显示的内容却远远超过 7 种,这是对发光管的复用。一个发光管需要2根引线, 意味着一个数码管至少有14根引线,由于发光管的一端总是要接电源正极或地(负极),把这些线合并成一根线,以减少管脚数量,是线路的复用。
把 4 个数码管的控制脚并联在一起,形成总线的模式,所有数码管都用同一 组单片机IO口来驱动。读者的第一反应是不是:那好像行不通,岂不是所有数 码管都显示相同的内容了?
D0 到 D4 能够控制单个数码管的供电,如果单片机的程序这样做:先在 IO口上输出 1 的码型,然后只点亮第1个数码管,其他数码管都关闭;第二步,在IO口上输出 2 的码型,然后只点亮第2个数码管;第三步,IO口上输出3的码型,然后只点亮第3个数码管;第四步,IO口上输出4 的码型,然后只点亮第4个数码管。接着又回到第一步重复这些步骤。
没错!就是一个跑马灯,4个数码管依次被点亮。如果把时间因素考虑进去, 这个跑马灯跑一圈的时间小于人眼的视觉延时时间,嘿嘿,没错,眼睛就这样被 欺骗了。你就会神奇的感觉到:4个数码管同时亮了!而且还显示着各自独立的内容。
说完数码管,再来谈一谈阵列显示:
数码管虽好,但其变化实在有限,如果要显示一个图形、图标,那非要阵列 莫属。就拿图中的最基本的阵列单元来看,我的哥!八八六十四个 LED 发光管, 如果要使每个点都能独立显示,至少需要 65 个引脚!那还有简化的空间吗?当然,继续寻找线路复用的方法呗!
通过行列形式进行组织无疑是一种直观、简化的办法:用 8 根行线与 8 根列 线交叉,每一个交叉点上连接一个发光管,将指定的行线和列线加电,那么它们 所交汇的那个发光管就被点亮。那岂不是同时只能点亮一个,或者一排发光管?回忆一下前面的例子,现在轮到欺骗眼睛的伎俩登场(坏笑)!
单片机 16 个引脚驱动 64 个 LED 的阵列
以上那么多例子,说明一个事情:平时我们所感觉到事情发生“同时”性并 不完全是真的。时间能够在你眼皮底下变戏法而让你无法察觉!如果你是一个设 计者,要通过区区 16 根线让 64 个发光管“同时”受控制,抛弃时间因素话,就 不可避免会钻到牛角尖里去。“那怎么可能!”
从时间的微观角度去看,很难有什么事情是真正同时发生的,你在电脑上看 着文档,同时电脑又播放着迷人的音乐,音乐和显示器上的内容变化都是“同时” 发生着,如果真的要同时,那么电脑就要有成千个处理器,每开启一个程序,就 要增加使用一个独立的处理器。而事实上并非如此,个人电脑一般只有一个处理器而且足以应付你“同时”看文档和听歌这类事。
站在程序的视角,在阵列上显示一个 B,总共分 8 步:
阵列组织方式,除了在显示上面派用场,在内存中、键盘中同样可以采用类 似的方法。比如说键盘:
不难理解,当按键查询程序运行一个周期所需要的时间小于你的手指按下一个按键的时间时,无论你怎么去按下按键,都能被程序检测到!假如你是超人:手指按键速度超过程序速度,那当然按键就不能再响应你了:)这种玩弄时间的 伎俩终于被识破了(坏笑)。
最后上一个案例给读者自己琢磨:
手握一支笔尖带有一个感光器 的光笔,当光强大于一个设定的幅度时,光笔 输出信号1,否则输出信号0。现在要实现光笔在LED阵列上绘画的功能,站在程 序的角度,程序该怎么做?总共分几步?别忘了利用时间变戏法哦,别问我为什 么不需要触摸屏,奥秘全在于对时间的理解。
举了那么多栗子够累的,下面我们来玩一玩概念。学概念是最占便宜的行当, 既能快速理解,又不需要花太大成本,然后摇身一变,就能装个专家了!这里当 然还是说与时间有关的事,来谈一谈实时系统。
实时系统是什么?实时是啥意思?立即、马上的意思?可能差不多吧。但是 立即又是多长时间呢?马上又是多长时间呢?了解分时系统的读者可能会本能的理解字面意思:把系统分为分时系统和实时系统两大类,分时系统是过时的老技术,实时系统比较高大上。真是这样吗?这些理解会把人带到沟里去的。
看看百度怎么说:一个实时系统是指计算的正确性不仅取决于程序的逻辑正 确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发 生系统出错。所谓“实时”,是表示“及时”,而实时系统是指系统能及时响应 外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协 调一致的运行。
首先实时系统并非一定是计算机系统,比如执行拦截任务导弹的发射电路, 要求从按钮按下到导弹发射的时间间隔必须小于一个值,否则将错过拦截目标而 导致任务失败。也就是说,实时系统除了对功能有要求外,对时间也有要求。按钮按下能够使火箭发射是功能,按下按钮之后在要求的时间限制内使火箭发射是时间!
既然是“实时”表示“及时”的意思,那难道分时系统就不及时了吗?问到 点子上了,事实上,实时系统与分时系统并非并列相对的,它们根本就是两个不 同的概念。分时系统主要是指计算机操作系统,而实时系统是一个大概念,它也 包括操作系统。如果在分时系统上增加对时间的约束管理,使得任务的执行时间 能够预知和可控,那么这个分时系统同时又是一个实时系统。
为了加深认识,举一个极端的例子:
在一艘游轮安装有一个礁石避让系统,这个系统由声呐装置和舵机控制两大 部分组成,声呐装置探测半径为2海里,游轮的最高速度20节(海里每小时), 那么从探测到障碍到游轮触礁的时间最快是6分钟,而舵机转向之后到游轮改变 航道需要4分钟。那就要求礁石避让系统从接收到障碍信号到输出控制舵机转向 的时间必须小于2分钟。只要这个2分钟的要求能够满足,那么这个礁石避让系 统就是一个实时系统!
实时系统在概念上又有强实时和弱实时之分,或叫硬实时和软实时之分:强 实时系统(Hard Real-Time):在航空航天、军事、核工业等一些关键领域中, 应用时间需求应能够得到完全满足,否则就造成如飞机失事等重大地安全事故,造成重大生命财产损失和生态破坏。因此,在这类系统的设计和实现过程中,应 采用各种分析、模拟及形式化验证方法对系统进行严格的检验,以保证在各种情 况下应用的时间需求和功能需求都能够得到满足。
弱实时系统(Soft Real-Time):某些应用虽然提出了时间需求,但实时任 务偶尔违反这种需求对系统的运行以及环境不会造成严重影响,如 视频点播(Video-On-Demand,VOD)系统、信息采集与检索系统就是典型的弱实时系统。在VOD系统中,系统只需保证绝大多数情况下视频数据能够及时传输给用户即可, 偶尔的数据传输延迟对用户不会造成很大影响,也不会造成像飞机失事一样严重的后果。
写在 最后:其实,在时间的世界里,没有“久”、“立即”、“马上”、“瞬间”,时间就是一个可以用数字衡量的东西,我们的直觉和感官范围太小,所有的感觉都建立在 相对的基础上。有句谚语说:饭是要一口一口吃的,事情是一件一件做的,路是 一步一步走的!就是要我们认识到时间的特性,为什么一些人可以从容面对和处 理非常多的事,而大部分人总是只能做一件事,事情多了就烦躁,失去头绪,因 为他潜意识想所有的事情同时得到解决,然后就乱了方寸。从微观的角度,站在 程序的视角也是如此,程序是一个指令一个指令的往下执行的,语句是一句一句 往下走的,不是所有的功能和信号都是同时发生的!即使你感觉到它们是同时发 生的,那极有可能你被“欺骗”了。
假使一个程序周期就是一次生命的话,你的人生就是一部进化史。当一个键 盘扫描程序全部代码的意义发生在某个方波的下降沿附近的某个位置时,它扫到 了一个按键。当你的人生发生在人类进化史上的某个细微的角落时,你干了一些 有意义的事情。李白的人生、成吉思汗的人生、耶稣的人生、爷爷的人生、爸爸 的人生、你自己的人生,相对于地球时间而言,就如同一个程序周期发生在一连 串信号中某个方波的沟沟里面,性质是一样的。无论你怎样生活,无论是秉承金 钱至上还是顿悟出道的理念,无论你有或没有伟大的目标,无论你信不信上帝, 时间就这样一如既往,让每个人的人生成为它的一个瞬间。
人的聪明,就在于你能够突破感官,意识到眼见并非为实,去理解那些你身 体感官永远感受不到的事实。希望本文能够对读者有所启发。