[原创] 不一样的51教程之四 基本IO操作和 定时器/计数器

辛昕   2011-10-11 21:15 楼主
            前面的 之三 写得很辛苦。我当时说,这一篇对于你直接点亮LED就有直接帮助,当时我以为我说完 数据传送类 指令的时候,大家就明白了,不好意思,我再一次食言了。
            今天绝对不食言。往下看多大概一两百字,我保证你立马就可以点亮LED。
            这一篇说的内容其实挺多的,所谓的常见内部资源,我指的是 定时器/计数器 ,外部中断 串口——在很多书里,它们被分门别类说了一大通,其实,我认为有很多只是一些你根本不会留下什么深刻印象,并且也用不上的知识,于是乎,我选择从简。

             闲话少说,现在我们来点亮LED。
             我们用来点亮LED,或者说是控制LED亮灭的是IO口。所谓IO口,第一篇就说了,它是输入和输出口,再说白一点,它就是一个一个的二进制位,记住是位,一个位只有0和1两个状态。
             为什么IO高或者低,LED就可以亮或者灭呢?
             这里涉及到具体硬件电路,最简单的情形可以是一个二极管导通电路或者三极管开关电路,但是这里我们都不谈,为了形象说明这个问题,我打个比喻。
             LED在本质上是一个二极管,它具有单向导通性,也就是说,给它两端加上极性合适的电压,它可以点亮,否则就熄灭。(具体来说,就是 正极接高电位,负极接低电位。)
             控制LED的基本原理是使其一端固定电位,另一端写0或者写1就可以改变通断断开,通则亮,断则灭。
一般来说,很多51开发板上的流水灯都是反接的,也就是说,IO口写0,LED才亮,尽管这并不是必须的,但这因为有确切的好处,因而被广泛采用。假如有一天你懂了基本电子知识,你就明白了,这里不细说。
             说到这里,事情就很明白,一般来说,我们会在P1口上接8个流水灯。于是乎,我们点亮LED,其实就是在P1的相应位上写0.
             完事了,事情就这么简单。

             如果只是这样,你可能会见到一些稀奇古怪的现象,因为LED这个东东,它还有一个重要的特征,那就是,灯是拿来看的,看的东西是不能一闪而过的。在我们的观点里,一闪而过,意思就是至少我们还能看到它闪过,但是,对于单片机来说,那你可能就真的什么都看不到,理由很简单,如果你没有延时,这个亮的状态很可能只保持了几个us。你能看得到才怪。
             所以,对于LED,或者任何与显示有关的东西,比如数码管,比如液晶条,请注意一定要给显示的东西足够的保留时间,让你的眼睛能看到(当然了,有的液晶条可能带锁存,或者其硬件电路上做好了锁存,那另当别论。)

             前边说的是用IO口输出,是其中“O”的部分,它还有“I”的部分,就是感知外部状态。
             如果你接触过别的单片机,也许你会知道很多单片机的IO口有个什么IO方向,连IO寄存器都分输出和输入,然而,51没有分,它只有一个IO寄存器,同时管输入和输出。
             所以它无需任何设置,就可直接做输入或者输出。在用IO读取外部状态时,有一点要特别注意,那就是每次读取状态前一定要拉高IO口在先,过一会,有时要延时好一会,比如STC的片子(这是它狗血的地方之一。)
             这是为什么呢?
            这是因为,从硬件上来看,一个高电平有可能被外部低电平拉低,但一个低电平却不可能被外部高电平拉高,所以,为了正确读到一个外部状态,必须首先拉高,然后见高是高,见低是低。

             说完了最基本的IO口,现在我们来说几个常见的内部资源。
             在很多书里,这些内容被当成一个章节,讲得非常细致,从相关寄存器到相关硬件背景知识。我不打算这么讲,否则我还要讲几个晚上才能说完。因为我认为,对于这些内容,我们要了解的其实只是:
              1 它其实是什么?就是说,它在干吗?
             2  它如何启动和控制?
              没了,就这些。

             1 定时器/计数器
              为啥这两个放到一起,因为它们本质上就是一个东西。定时就是计数,计数就可以定时。
              我们看到太阳东升西落就知道过了一天,看到春来冬去就知道过了一年,其实我们只是在数一个标志,太阳出现一次便是一天,再来一次又是一天。
              单片机里也是如此,单片机里的太阳就是晶振产生的振荡周期。
              晶振这个东西是什么,你不用管它,你只要知道,它配合单片机的内部振荡电路,可以产生相当高精确度的方波脉冲就好,什么是方波脉冲,它就是一个高电平,一个低电平,一个高,一个低,如此周而往复,永无止境。
              每一个周期都是一样的长度。就像太阳一天,总是用相同的时间跑一个轨道(近似,近似啊。)
              所以,我们也常把它叫做 定时基准,基准的意思就是,一个周期是一个稳定的单位时间,于是乎,我们计数的同时,也就得到了经历的时间。
               
              计数器就没啥好说的,它就是计数外部脉冲。本质上来说,我们也可以用IO口来计数,但是,那样太麻烦,有现成的硬件,何苦舍近求远?
             
              差点忘了说一个很重要的东西。
              中断。单片机(后来才知道,任何计算机系统都有)  
              中断是这样一个概念。我们的单片机只有一个CPU,任何时候它都只能按顺序一条一条指令处理,虽然有了转移指令,可以在不同位置的指令之间转移,但是它仍然是按部就班。
              而有了中断,CPU可以在发生紧急事件时,离开当前执行的位置,而跑去处理(当然也是预先准备好的)中断程序。
              
               仍然以比喻来说明。我们拿着很多装有指令的信封,在一条一条读取,执行,我们可能看到一条指令说,请查阅134号信件,尽管当前的信件号码可能是23,下一封其实是24.但是,如果没有中断,我们只有在遇到当前指令的命令下才能跳转位置。
                而中断就是说,比如说,有个人提前跟你说,假如有人来敲门,请你打开45号信封,然后按照里面的指示和他交接工作。
                这两者的区别在于:
                只要你按顺序读下去,你总会在第23封信里,看到查阅134号信件的命令。
               但是,你未必会等到那个人来敲门,让你去打开45号信封。另外,你可能总是在每个单片机执行周期的第3454us去查阅134号信封,而你什么时候打开45号信封,则取决于那个人什么时候来。
                由此说来,中断的一大特征就是 随机性。
                
               关于它的好处,我决定在讲每一个内部资源时,顺带说了,因为如果我只是泛泛而谈,你可能没感觉,就像 随机性——什么玩艺?
               前边说到计数器和定时器。
                定时器其实就像一个闹钟。时间到了它就乱叫,直到把我们吵醒,假设一下,如果我们没有调好六点半闹,那情形是怎样呢?情形就是要么你每一个小时或者半个小时看一下闹钟,哦,五点,哦,五点半,哦,六点,,,,,,,那样子,那样子是不可想象的,你不用睡觉了......
               定时器也是如此,有时候我们需要在单片机里执行完一个动作以后,等待一段时间再执行第二个动作,如果我们不用中断,那么,唯一的方式就是让CPU啥都不干,一封一封的空白信封往下读,因为读每一封信的时间是一定的。
               
                计数器的情形下这个作用可能更明显,比如说我们在流水线上,每装十个产品,就要工人来贴一个标签,我们总不能要工人顶着计数器,1234,,,哦,10个了,就去贴,我们可以换一种方式,十个到了就响一下铃,这样,工人的时间就被解放了。(当然,现实里,其实就是这样。)
                在单片机里,我们用中断,可以大幅度解放CPU的时间。

                说了这么多,我们现在来说一下定时器/计数器的启动和控制过程,或者说方法。(它们两个本质上是一回事,只是一个计数外部脉冲,一个计数内部时钟源)
                与它们相关的寄存器其实只有区区3个
               IE——这是中断控制器,如果你不打算用中断方式,甚至可以不用他。
               TMOD TCON,这两玩意,人如其名,一个是定时器状态寄存器,一个是控制寄存器。
               51内部有两个十六位定时器,它们可以各自拆成两个8位寄存器,所谓的定时器4个状态,除了8位自动重装,典型的用于做波特率,以使定时误差更小以外,其实大多数我们只用方式1,16位定时器。别的没必要管太多。
               所以,总结如下:
                1 开总中断和单独的中断控制位,设置IE完成;
                2 选定工作状态,设置 TMOD完成;
                3 启动定时器和关闭定时器,由TRx完成。(这是一个位,在TCON里)。

               使用中断以后,有一个所谓的中断入口向量,起始它就相当于是说,在中断发生时,CPU被通知往这个地址的ROM跑。于是乎,我们经常在哪里安排中断后要做的事,更多的时候,中断向量地址只有区区8个B,是不够用的,我们就安排一条转移指令,让它跑到所谓的中断服务程序哪里去。
               具体的安排,参考资料去吧.


               今晚本来打算把 串口,外部中断等一并说完了,不过发现时间挺晚了,也写了挺长了,今晚就说到这里吧。

                 

              



              
强者为尊,弱者,死无葬身之地

回复评论 (11)

这个排版,看得有点晕。。。。。。。
嵌入式培训www.51great.org
点赞  2011-10-12 10:25

回复 沙发 zhuoyue 的帖子

最近比较忙撒
写完后,会重新排版,附件发~~
强者为尊,弱者,死无葬身之地
点赞  2011-10-13 09:34
不错,期待下五,讲的蛮实在的
点赞  2011-10-13 13:40
继续支持啊,版主很不错,很有耐心!
点赞  2011-10-13 17:03
谢谢各位的捧场,今晚大概可以讲完 初级篇(入门篇)了
强者为尊,弱者,死无葬身之地
点赞  2011-10-13 19:36
看得出什么叫厚积薄发  得心应手

谢谢
点赞  2011-11-7 00:23
真的是看的有点晕,
[url=http://www.51great.org/]嵌入式培训[/url
点赞  2011-11-7 09:25

回复 8楼 djdhn 的帖子

唔。。。。。。是排版么?
强者为尊,弱者,死无葬身之地
点赞  2011-11-21 11:24
楼主真有心,基本每天都能看到你的帖子和回复。
点赞  2011-11-21 13:44

感谢老版主
点赞  2011-11-21 14:56

回复 11楼 caobni 的帖子

那是个男的还是女的?(男的做兄弟,女的......)

如果这都能雷同,我一定要去买六合彩!!
强者为尊,弱者,死无葬身之地
点赞  2011-11-22 11:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复