曾经有写过一两个简单的比较另类的关于51理解的文章。不过一直都没有好好写一整套全的,认识的一些朋友,有刚刚开始接触51单片机的,由于他们不是电类专业,经常对51很陌生,他们问我该怎么学?有没啥教程推荐。
于是我就很想把自己对于51的理解告诉他们,希望他们能有一个整体上的感觉——我想传达一种概念:这种东西就像内功,你看不到它,也很难“偷师”什么的,但是拥有它的人,根本不需要什么教程,他需要的除了数据手册就是资料——我是说那些什么寄存器地址啊,寄存器定义 啊之类的设计参考。
这些时间里,正事没干多少,想法乱七八糟。心想还是实实在在做点事情。尽管51单片机我只能说是基本了解,而且我可能渐渐远离它,但我还是想好好地写这套东西,算是一个自我梳理的过程,如果能对你有帮助,不胜荣幸。
闲话少说,开始正题。
在开始讲51的内容以前,我想先说几个概念:数字(电路),单片机。并试图简单阐述清楚,这个东西,到底是个什么玩意,到底能干什么?
假如你有数字电路基础,或者对数制一类的概念清楚,请自行跳过,以免浪费您的时间。
数字
这里说的“数字”当然是与“模拟”对应的数字。
最简单的说法,就是用一连串0和1组成的数据串计数的记数系统。
对比十进制,可以简单理解它。
当你看到 “345”这个数字的时候,虽然你不会去想,它有 3个100,4个10,5个1,但你心里一清二楚。(我没查证)我们有十个手指,所以我们拥有了十进制,0到9.但是,半导体的世界里,它只有 通 和 断 两个状态。所以,它只有二进制。
二进制是什么?二进制是0和1,二进制是 通 和 断,二进制是 灯亮灯灭。请记住——所谓X进制,就是有X个截然不同的状态用于区别,正如我们有十个手指,它们都是不一样的。
关于二进制和我们熟悉的十进制之间的转换,其实你可以对比十进制,灵活点的人估计已经猜出来了,假如没有,也不要紧,这样的资料网上,书上多的是,请自行查阅。
那么我们的到这些数字有什么用?
这里,我以 灯亮灯灭 为例说明。
学习51的入门任务就是点亮LED。很多人也提到自己对51的兴趣直接来源于那些闪烁的LED。我们可以设计电路,使输入一个信号为1时,灯灭,为0时,灯亮(反之亦可)。
你看到大街上的红绿灯了吗?假设控制 红黄绿三个颜色的就是一个一个的二进制位的状态。
现在我们定义 这三个位对应 红 绿 黄,1为灭,0为亮。 按照 红灯亮 黄灯亮(中间缓冲),绿灯亮 的顺序依次改变。
那我们就等于一直在输出3个3位二进制数 011 110 101,它们如果换成十进制数是(3,6,5)。
单单看这三个数字 3 6 5,如果不告诉你它来源于哪里,不要说你,任谁都猜不到它到底是什么意思。
其实事情就是这样——一个数字,一个二进制数字,当我们给每一位赋予了不一定的含义,那些看起来毫无规律莫名其妙的数据就有了意义(特别是十进制形式时。)
当你理解了上述的内容。我首先可以剧透的一个内容是:单片机也好,任何数字系统都好,依我的个人理解,它的核心工作就是处理数字——移动到不一样的位置,修改它,对它进行运算.......而这些最终的目的只有一个——获取和设置我们想要的数字——然后通过它们感知和影响真实的物理世界。
单片机
单片机是什么?也许你听的耳朵已经起了茧,无数的书无数的人告诉我们,单片机其实跟我们的电脑是一样的,只不过它简单很多!——可以说这样的话是废话:我最初就不知道其实我们的电脑是什么,我除了知道可以用它打字,看电影,听音乐.......
我们前面简单介绍了什么是数字(电路)。
在解释单片机是什么以前,我来举一个大家都很熟悉的例子——笔算。
中国人很小都懂得了 小九九,因此我们的小学生可以在纸上运算多位乘除。请回顾一下你 运算 34 * 45 的过程。
“45 20,留0进2, 35 15 加2 17 留7 进1......”
我们把这些过程用笔记录在纸上。请想象一下,如果不给你纸和笔,并假设你尚未能做到用脑袋记住几个中间值(虽然这个例子来看并不复杂,是可以记住的。)。在这种情况下,你是没有办法进行下去的。
因为,你损失了很多 中间结果。
单片机(或者说 我们的电脑 ,以及任何的数字系统)在进行运算的时候(其实很多数据的处理过程都可以看成 运算)。它也需要记录中间结果和存放数据。
所以我们需要存储器,存储器是什么?粗糙的说,存储器就是一系列有序的电子开关单元。它们每一个人只记得0或者1.
当它们集合在一起的时候,它们就可以计数了。
比方我们前面说的 红绿灯。它有三个电子开关单元。每个人只知道0和1,但当它们组合起来的时候,它们就可以表达几种状态。从000到111,0到7,共8个数字。
有了存储器以后,我们当然还少不了运算单元,当然,它没我们厉害,它不知道小九九,它只知道加法。但是不要紧,在我们的策划和安排下,加法也可以完成 小九九 完成的乘法。
接下来还有什么呢?
前边说了,红绿灯,如果我们要让外部世界知道我们处在什么状态,我们还必须通过明确的 0和1 展现出来,这时候可以通过灯亮和灯灭,或者只是 一个 高低电位,所谓高低电位 就是 0 和 1.
有的时候,我们还需要知道外边的人要告诉我们什么,我们也是通过读取它的0和1 来理解——当然这个的具体操作稍微有点复杂,暂且不说,你只要知道,它了解外部世界也是通过判断0和1状态就可以了。
它们通常是可以做到一起的,就是说,既可以向外部世界展现自己的状态,也可以读取外部世界的状态,就好像公司的前台小姐,外边有人来访了,她会打电话告诉我们,而我们请来人在那里会见,也是通过前台小姐。
现在我们给它起一个名字,叫 通用输出输入口,英文就是input/output,也就是I/O。你以后会经常看到这个名词,现在你知道其实它是什么了吧?
我们回顾一下,这一段看起来会很像你在教科书上看到的内容:它是由 运算器 存储器 输入输出系统 (还有我没有说的 控制器 )组成的一个完成数字逻辑处理运算的 数字系统。
我换个白菜点的说法: 运算器就是我们的小九九,存储器就是我们写在纸上的那些 "留0进2“,输入 就是我们听到别人要我们运算 34 * 45 ,输出就是我们在纸上算出来的......1530.(算错了请原谅我。),所谓的”数字逻辑处理运算”,在这里,其实就是 笔算 两位乘法。
一个完整的单片机系统还有很多别的东西,比如说 控制器。但是我觉得这些东西没有必要每个人都 全部齐刷刷说一遍,我只想把最基本的概念说清楚,让没有接触过的人知道怎么回事就好了——至于懂的人,就算我不说他也知道,或者不知道也不影响他的编程过程。
单片机能做什么?