1.让流水灯呈现一亮一灭的效果(其一)

(虽然我写的并不是什么好文章,但是转载前请你告诉我一声,谢谢 联系方法 odawnw at gmail.com)

文章可能不是很专业,如果有哪个和我一样是学习单片机的初学者的话,咱们可以私下交流一下,你可以跟着留言,也可以给我发email,欢迎大家一起互相讨论互相学习互相进步。
篇前话 –>
汇编语言(Assembly Language,简称AL,其中assembly是装配的意思)作为早期的硬件交流语言,AL帮助了早期进入80×86系列单片机的学者进行较为广泛的硬件程序开发。不过随着时代的推移,C语言以及其他一些与硬件相配的程序语言的涌现使得汇编语言不再是开发硬件的最佳选择。不过,对于初学者来说,学习汇编语言能够帮助我们清楚的认识硬件的结构以及程序和硬件之间的关系,所以想要开发单片机的朋友倒不妨先出略了解一些基于80×86的汇编语言知识,再去研究别的单片机以及其开发语言。虽然80×86系列单片机现在普遍不再实用,可是它确实众多高校里电子与自动化专业的入门课,如果不认真对待,那么至少你就会挂科。
我的计划是,先了解80×86单片机以及概略地学习汇编,再进入AVR单片机并用回以前学过的c语言作为开发程序,接着,如果有时间的话就接触ARM,毕竟这个在消费电子产品上的应用相当广泛。

正文 –>
学习汇编语言必须首先有个认识,你得和硬件打交道,而这也是硬件程序设计和软件程序设计最大的区别。所以,AL的学习并不能只限制与语言的学习上,而应该非常重视其控制的硬件部件。

流水等呈现一亮一灭的效果是一个入门的AL程序,要学会这个程序那么得首先了解单片机的结构和工作原理,发光二极管的工作原理,接着就是到程序本身,而这里面我们得知道一些最基础的程序,以及AL的设计思路。

1.1单片机的结构和工作原理
b408b2a12aec098046106475 
上图为一单片机引脚的结构图,其实说白了,单片机就是一个可以把输入信号转换成那么多个引脚里不同的输出信号,以此来达到“控制”的效果。所以看一个单片机的引脚图最重要的就是看它从哪里输入,又从哪里输出。不过AL设计里不过多考虑输入的问题,而知需要考虑输出在哪个引脚(这个后面会有提到)。一般单片机都喜欢用途中P2开头的引脚(就是右下角从P2.7到P2.0的八个引脚),这个信息我们必须得知道。
另外,我们必须知道单片机是一步一步的进行工作的。这是什么意思,就比如军训的时候教官口里喊的“一二一”口令。在单片机里,“一二一”口令是由晶振来发出的,也就是说晶振就是单片机里的“教官”,不过懂得这个也没多大用处,更重要的是我们得知道单片机是一步一步的去进行工作的,每一个口令下它处理一个事件,下一个口令再处理下一个事件,懂得这个我们也就知道汇编语言的没一句话也就是在每一个口令下,让单片机进行的某一种事件的操作(这个后面会有提到)。

1.2发光二极管的工作原理
二极管的工作原理是当给它加以正向的电压时它会导通,也就是会发光,而要是加以反向的电压的话它就不能导通(这一现象的物理分析设计模拟电路的知识这里暂且不讨论)。我们就是要使用单片机的这些引脚(更具体的说就是使用P2里的八个引脚)来控制加在二极管两端电压的方向的,不过对于单片机来说,我们不采用“电压”的说法,而用“电平”这个词,其实实质是一样的,只是叫法不同而已。与电压相对,正向电压在单片机里一般定义为“高电平”,相反也一样。

1.3单片机和发光二极管间的接法
图片1
既然我们要用单片机来控制发光二极管,那么就需要将这个控制的单片机和被控制的发光二极管接起来。由于P2引脚有八个,所以相应的就要接入八个发光二极管(如图),而这八个发光二极管组成一排灯,一般叫做“流水灯”,之所以叫“流水”是因为我们可以通过程序的设计来让这八个等实现一种类似流水的效果(这个下面会有讲)。
虽然这个图很复杂,可是我们需要看的只有右边部分,也就是P2引脚到发光二极管这一小段。其中+5V的电压提供一个工作电压,电阻是用来保护二极管不少坏的。汇编语言可以很轻松的对P0到P7这八个引脚进行专门的控制(下面有讲到),我们假设从P2.0口输入了一个相对发光二极管的正向电压(发光二极管额“正向”规定为三角形到竖直线的方向,也就是向左的方向),这在单片机来说也就是低电平(为什么?看看有一个+5V的电压已经使发光二极管处于正向偏置的状态了,我们只需要把P2.0口设置为电压为零,使得“+5V -> 电阻 -> 发光二极管 -> 单片机内部 -> 地”形成一个回路,这样就可以使发光二极管导通而发光了)。

2.1AL的基本语句 – 送数据以及循环
我们来看一个基本的程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lp:  mov  p2, #00H
      ajmp  lp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
这就是一个简单的送数据以及循环的与语句。其中lp是loop的意思,mov是move,ajmp是a jump的意思,表示跳转(这个很重要,是循环)
前面已经提到了,单片机是一步一步地进行工作的,而我们设计的汇编语言的每一行都是每一步里命令单片机要进行怎么样的操作。现在先让我们把上面的汇编语言翻译成我们一般说的话,至少我们得读懂它是什么意思,对吧,接着我们再去了解没一句话这样设置的含义,只有这样我们才可以写出属于自己的语句。
首先设置一个名为lp的循环:进入第一步,我们由某个地方(某个地方是什么?这个是以后的知识,不过现在既然提到了就说一下,是从内存中取数)取出一个00H这个数(H的意思就是十六进制,所以00H转换成二进制也就是0),输入到P2的所有引脚。接着进入第二步,我们再跳转回这个循环。
现在我们已经“翻译”了这个语句了,不过似乎还不是很了解其效果。那么,就把这个程序“烧”到单片机里面去看看有什么效果吧。“烧”进去后发现,八个灯全部亮起。
现在我们来理解一下这个程序。首先我们得知道,既然单片机是一步一步的进行工作的,那么我们就会利用到循环来在相连的几步里进行同一个操作。正如这里的程序,首先第一步我们将P2口的八个引脚送入了0这个数,也就是说把八个引脚全部设置为低电平,在这一步中我们就使得发光二极管点亮了,而下一步我们再次返回到第一步中,再次使得发光二极管点亮,如此不断的进行循环,出来的效果也就是发光二极管一直亮了。
不过这里有些细节得注意,每一步之间是否会有些间隔?答案是的确有,不过这个时间间隔相当小,大概是几微秒,这个时间间隔完全无法被人眼所感觉到,所以我们就看不到法官二极管是闪烁的,而是一直在亮。
现在我们来看看mov语句,它的语法如下
mov 端口,#数字
如果是数字则要加#,如果是地址则不需要加了。
另外,AL讲究一种形式美,所以我们这里mov和ajmp这两个隶属于lp虚幻的操作都是对称地缩进的。

2.2神奇的#
再回到我们的标题,我们是要设计一亮一灭,可是上面我们只设计了亮,我们怎么让它灭掉呢?这里就不得不提一下神奇的#了
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lp:  mov  p2, #11111111B
      ajmp  lp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
如果我们的单片机以及发光二极管的接法限制了高电平使发光二极管灭的话,上面的语句就是让八个管子全灭掉的AL。也许你注意到了,这和上面最初的AL有点不一样,的确,上面我使用的十六进制,而这里我使用了二进制。为什么要这样,我们得考虑到P2口是有八个引脚的,如果我们要一个一个地对每个引脚进行控制那么我们需要有八个量,不过好在有了神奇的#,我们就可以用八个二进制来对其进行控制,更神奇的是,四位二进制对应一位十六进制,所以这八个二进制我们又可以用两位十六进制来表示。不过使用八位二进制来表达的话可以很直接的对每个引脚进行控制(设置是高电平还是低电平),要注意到,如果你使用了八进制那么你的数后面就需要以B结尾。
现在我们用二进制来重写最初让它灭的程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lp:  mov  p2, #00000000B
      ajmp  lp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
超级简单,其实就是把1改成0!
我们再看一下下面的程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lp:  mov  p2, #00000001B
      ajmp  lp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
把它烧进去,再执行后出现什么效果?对!最右边的那个发光二极管灭了!这就是#号的神奇之处!它能够对每个引脚进行控制!
现在,知道了怎么点亮发光二极管,也知道了#号的神奇之处,我们来变换出一些花样吧,其实质需要把八位二进制进行小小的改动就可以了。也许你会很天真的想到,要是我再用其它七个每个六排的有单片机控制主的发光二极管组合成一个8×8的发光二极管矩阵的话,似乎就可以写出A,B,C以及很多很多字,甚至可以画画了?对的,这个想法的确很好,不过实现出来可能有点麻烦,毕竟你得同时设置八个单片机的程序。实际上我们做起来并不适用八个单片机,而知需要一个就可以了,不过这个程序要理解起来还需要很多很多基础知识,不过总有一天我们一定会掌握的。

 

回顾这次的学习,我们从最基本的知识入手,接着从最基本的让灯亮切入,接着我们了解到神奇的#,用它来变换出了几个花样,再接着我们又发挥了想象力,设想字和画是否会用8×8的发光二极管来设计得到……其实学习过程就是这样,从简单入手再慢慢复杂,从慢速切入再慢慢提速。要知道单片机是一个日益更新的领域,新的知识新的挑战我们每天都会遇到,所以我们必须得不断的学习,无论难的知识还是简单的知识,不过,当我们一步一步的进行学习,到最后再回顾我们的成就时,就会感到一种由衷的幸福。所以,虽然技术更新带来的挑战很大,可能会让人背负很大的压力,可是我们把它转换成一种学习带来的成就感的话,就会感觉到有无穷无尽的驱动力了。

2 thoughts on “1.让流水灯呈现一亮一灭的效果(其一)

Leave a comment