上一篇我讲了几个基本概念,很可惜,它对于你马上点亮LED没有任何帮助,而这一篇,我要讲的是51芯片内部的东西,比如 存储器,然后
我还会讲一下51,或者说任何CPU是如何工作的——当然只是一个很简单的过程,我的目的只是让你确切理解我们写入单片机的程序是如何完成预期工作的。(当然,它不涉及很具体的硬件动作——那东西我不会,也研究不了,也管不着。)
然后,我想告诉你的是,看了这一篇,对于你马上点亮LED......仍然是没有任何直接帮助......
就51单片机而言(别的也是类似的,不要担心。)
它内部的存储器可以分成两部分:
1 程序存储器,书上经常用 ROM 指代它,这是因为程序存储器是 只可写存储器。
2 数据存储器,书上用 RAM指代它,因为它是 可读可写 的。
请把ROM想象成很多很多个按顺序放好的信封,每个信封里都写着一个命令。
上边写着 “向左转”,或者“向右转”,“向前走一步”(你不要指望有什么 走两步,走三步.....)
然后,想象一下,如果有个人要你从一个正方形点走到它对角线上的另一个点,并假设,正方形的边长等于两步距离。它该给你写一些什么指令呢?
我们假设你这个正方形在你的左手边,那么,你应该这么走:
先向前走两步,再向左转,再走两步。
于是乎,指令就是:
“向前走一步”——“向前走一步”——“向左转”——“向前走一步”——“向前走一步”。
当然,你也可以有另一条走法,就是先左转,再走,再右转,再走......(解决一件事情的方法是绝对不可能只有一个方法的。)
现在我们进一步考虑,这 写 “向前走一步” 和 “向左转” 太麻烦了——最重要的是,我们是麻烦,对于单片机那就是无能为力,它连英语都不会,更被说中文。
那么,我们就给它们编码吧。
比如说,“向左转” = 01,“向右转” = 02 "向前走一步" = 03.现在事情就简单多了。
只要写这样一组指令,事情就完了。
03 03 01 03 03
如果你把一个51芯片的ROM里的数据全部读出来,你最终会看到的就是 一连串 这样的数字。虽然说,不是我把03写进去,芯片就会自个走一步,但是它自有它对应的意思。也就是说,51的程序执行的过程,就像我们读了上面这5封信以后照着做走了一个90度一样。
请记住一个观点:
单片机做的事情,就是“阅读”存储在其中的程序代码,然后按照每个代码特定的含义,一五一十照做。除此以外,这家伙什么都不会。
接下来你会问一个问题,假如这个家伙,只会一板一眼做事,就像你一个月几千块结果只请了一个只会向前走向左转向右转,而且还要你写好一堆信件让他照着做.......那我要这样的货色来干嘛?
接着告诉你一个观点:
单片机(数字系统)虽然很蠢,蠢到只能一板一眼照着做,但是它胜在速度快——快到什么概念呢......我想想.......
我50米最好成绩是7秒2,一秒下来就差不多是8米,而这个家伙可能就是一秒钟.....8000米.....
快又有什么用呢?我再打一个比方
打个比方,我看一眼一个字,就知道这个字是什么字,这一眼大概算他半秒钟吧。可是,有个老兄,他大字不识一个,偏偏会查字典,但是查字典很麻烦啊。我们假设查一个字需要完成10个步骤。
看起来他很无能,我就一眼就Ok了,而他呢?我的妈呀,还1234......
但是别忘了他查字典的速度飞快,他完成一个步骤可能只需要0.001s,那么这样搞下来,他一秒钟可以看懂的字就不知道比我多多少了。
结论:他很蠢,但是他很快。
现在我们来类比一下正规教科书上用专业术语描述的这个过程。
1 我们拆开信封,得到一条命令,这好比单片机的CPU从程序存储器中,读取一条指令。这个过程叫 取指(取得指令 的意思。)
2 我们读到 03,我们回想起(或者查指令表,对比知道)这个命令的意思是 “向前走一步”,好比单片机的CPU进行译码,知道了这,命令要它干什么 (译码,你可以理解为 翻译命令)。
3 然后肯定就是执行了,我傻乎乎地向前走了一步,而CPU按照相应命令做了一个动作。
说完了ROM,我们说RAM。
前边说了,ROM是用来存储程序的,程序这个东西,一经烧写进去,没事我们不会改它,只会让他一次又一次地依次执行(也许你会问我,信封总是有限的,做完了怎么办?很简单啊,看完了最后一个,就重头再看第一个呗......当然这事不需要在最后一个信封写“请接着看第一个信封”,单片机和那个读信的人 都懂的...)
前边还说了RAM是可读可写的,那它是干嘛用的。回想一下,前边 34 *45 的故事,我们计算的时候,小九九只能帮我们计算一位乘一位,所以我们必须在边上 “留0进2”,RAM就拿来存这个的。
如果现在信封上写着 “计算 34 * 45”,又假设您不是记忆超群,而你只懂小九九,所以你必须把东西记下来。然后又去看它......
你要把东西 记下来,就好比你要写存储器单元,你要把东西读出来,就好比你要读存储器单元。
而信封(ROM只可读,不可写)这玩意显然不能用。就这么一回事。
但是,ROM要比RAM贵——比方说,ROM只要读,不需要写,写新内容就需要擦除旧内容啊,那就要用橡皮擦(只是打个比喻),所以花的钱就多啊......(其实真正的原因是 同样大小的存储器,ROM比RAM便宜。)
既然东西贵,那就要少用,还好反正它能反复读写(程序执行过程中)。
在RAM里,我们以一般传统的256K来说。它的低128K是已经定好特殊用途的,而高128K是自定义的,就是说,你有一本草稿纸,里头有256页,前边那128页,人家已经规定好了你只能记录 你有多少钱,你有多少支铅笔,,,,,,,当然,你也可以随便记点别的东西,但是,你就别指望以后一打开第二页就知道你有多少之铅笔了,因为你压根没当它是 记录 铅笔的。最恐怖的事情是,虽然你没把它当成是,但是,CPU可能会认为是,那你就惨了......
而后边的128页,你爱记什么就记什么。
那低128K的所谓特殊定义,其实里头就是安排了一些固定位置,给予了固定的含义。
比如前边说的,第一页记录你有多少钱,第二页记录你有多少只铅笔。
那么,你就不用另外记着,哦,第一页是钱数目,第二页是铅笔数,,你只要读到第一页是34,,就知道你有34快,第二页是4,就知道你有4只铅笔......以此类推。
记这些东西有什么用?
俺最后举个例子就结束了。比方说俺们要用铅笔写字,但是我们总不能到铅笔用完最后一支才想起去买(也许你经常就是这么干的,其实我也是......但是这是不行的,为啥?假如你大半夜抄作业,突然发现没铅笔了,完蛋了,因为商店可不是24小时便利店。所以,为了防止没铅笔用,我们必须未雨绸缪。)
可是,话又说回来,我总不能没事把钱都买铅笔了,所以我们一般这么干,当铅笔少于多少多少只时,我们就去买,我们去买铅笔总要有钱啊,不然你休想走出商店......
所以,买铅笔这个行为,涉及了两个判断动作:判断铅笔是否少于1只,如果是,要买,否则没它什么事,该干嘛干嘛去。
要买的话,看看钱够不够,一支铅笔5毛,你至少要有5毛钱,如果没有,拉倒,借钱去.....这 1只 铅笔,这 5毛 记录在哪?就在RAM里。我为啥不记到ROM里去呢?
别忘了,你不是永远只有一支铅笔,也不是永远只有5毛钱.......
至于具体的代码,我们下一篇,谈到指令系统的时候,再说.......