暴揍单片机(进阶篇) 1 —— 流水灯(上)动一动

总算开始了第一个 so easy 的项目了。你猜,我们准备做的这个项目简单嘛?话不多说,分享开始。
项目分析(流水灯)
  1. 功能:何为流水灯?其实就很简单,就是一群灯像水流一样。简单两个字:一直会动的灯。
  2. 具体做法划分:(最简单的两步)
  • 在 proteus 上面搭建一个简单的模拟电路:单片机 + 一群灯。
  • 在 keil 上面编写代码,让灯动起来。
实际电路分析和编码前的逻辑分析
实际的效果如下,我们来分析一下如何让下面图片的灯依次动起来?有没有看不懂的?

我简单举个例子,比如图片中左下方的 D6,左端接在 GND 上面,右端接在 P1.6 上面,那么只要 P1.6 提供高电平(1),也就是俗称的 VCC,那么 D6 就能亮起来了。但是要是 P1.6 提供一个低电平(0),也就是俗称的 GND,那么 D6 两端都是 GND 也就灭了。浓缩一下上面的内容也就是两行编程思维:
  • P1.6 = 0; (相当于灯灭了)
  • P1.6 = 1; (相当于灯亮了)
  • 留一个思考的问题(如何让 P1.6 = 0 控制灯亮?也就是两条语句实际的效果调换一下,不会的也别想了,就这么看看吧——正确答案:把上图中接在 GND 的地方换成 VCC)。
硬件开发提供了底层硬件基础,才有了我们逻辑实现的平台。我们只是根据实际的电路图来分析相关引脚到底需要怎么操作。一个好的硬件工程师会简化单片机开发人员的编码工作量。我建议大家硬件软件一手抓。
其他控制引脚如下:
  • P1.1 控制一个 D1
  • P1.6 控制一个 D2
  • P2.1 控制一个 D3
  • P2.6 控制一个 D4
  • P3.1 控制一个 D5
  • P3.6 控制一个 D6
我们现在的工作就是让这些灯能依次的亮起来实现一个动画的效果。也就是对应的控制引脚依次可以输出高低电平就可以了。
上面这么一分析。是不是突然发现,怎么这么简单。
实际编码过程和问题分析
现在灯准备好了,如何让它“流水”起来呢?
有了上面的分析,下面写得这段代码你是不是就能看懂了? 6 - 11行:让灯全部亮起来。 13 - 19 行:让灯又灭掉了。好了,这样一份简单的功能就做完了。下面我们编译生产 HEX 文件。

当你点完编译按钮之后,你应该就可以得到和我一样的编译报错了。

首先解释一下,为什么会出现这些报错信息呢?最根本的原因就是 Keil 这个编译器啊,它不认识 P1 和 .1(其实就是没有定义!无定义不允许使用),那么,我们这里需要考虑的应该是:通过什么来控制 P2.6 这个引脚呢?那当然是自己定义了。看看下面这个代码和实际的运行结果。

好了,我们依次解释一下,上面这个是什么意思。第一行:sbit P2_6 = 0xA6 这句话就是我们本章的重重之重。具体什么意思呢?其实你可以这么理解:0xA6 是芯片的控制开关,P2_6 是我们软件的控制开关。sbit 相关于让两个开关发生关系。当他们发生关系之后,我们就可以通过 P2_6 这个符号控制 0xA6 对应的引脚了。(除了写成 P2_6 的样子,你也可以写成 abc,sbit abc = 0xA6,那么 abc 就也可以控制 P2.6 的引脚了)。
好了,那我们依次把全部的引脚定义一下吧,把代码重新整理一下就是下面这个样子了。到了这一步,我们总算控制了全部的引脚。

现在大家是不是很疑惑?难道这些什么 0xA1,0x96 的都需要背下来?是的,确实有些牛人都全部记下来了。51 芯片自己也已经帮我们把这些全部统一定义好了。那我们怎么才能用呢?我们就需要把 51 给我们写的 reg52.h 文件(有些喜欢用 reg51.h,两个只是差了部分寄存器,基本一样)。#include "reg52.h" 就可以了。如果感兴趣,你们可以打开 reg52.h 这个文件看看,它帮我们把全部寄存器都定义好了专门的标签,那么我们就可以直接用了。
好了,下面我准备变形了,注意了!

同样的功能,更精简的代码。但是你们发现没有,好像其他引脚的状态也被意外修改了?这不就尴尬了,就好像拆了东墙补西墙。比如我只想修改其中某一个引脚该怎么办呢?我给你们总结出了两个标准公式。(先记公式吧,用个两天再百度原因,这种效率才是最高的)。

代码又进一步的优化了。至此,我们总算将所有引脚都可以做到随心所欲的控制了。

好了,我们现在让灯能够亮和灭了,如何让它动起来呢?

理论上讲,是不是这样,小灯是不是就该闪起来了?但是当你打开仿真的时候,你会发现,其实灯只是一直亮着,根本没有闪过,这是什么原因呢?我明明写好了呀!这时候有些所谓的程序员就开始找硬件的麻烦了,可是事实真的是这样吗?
大家好好看下程序,灭 -> 亮 -> 灭 -> 亮,程序流程确实是对的,但是它忽略了一个最重要的问题,我们人眼最快也需要间隔 2ms 以上,才能分辨出两个状态。很简单的一个道理,就是你的大脑反应不过,当然你也可以尝试修炼一下自己的大脑,让它能观察出us级别的变化间隔,然后你就能看到,哇!真的闪烁起来了。但是作为一个正常的地球人,我们还是老老实实的改程序吧!最主要原因就是由灭到亮的时间太快了呗?那好,我们让它慢一点。

我们在每次状态变化的后面,增加一个计算,让它灭完以后,经过大量的计算,再到亮的状态。然后在经过大量的计算,再到灭的状态,这样就相当于有了一定的延时。让它多个状态之间有了时间的间隔,这样眼睛就可以区分了。实际动态效果如下:

竟然真的动起来!本篇文章就写到这里,下一篇我再进一步地讲解。
声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 2
关注 54
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧