单片机的概述-单片机的硬件结构与开发过程

第一课 单片机的概述

因为我们的主要课程是单片机的应用 本来不想讲解单片机的历史与发展这话说现状更确切

些但为了兼顾大多数朋友 我还是简单的介绍一下这方面的相关知识

一 单片机的由来

单片机 专业名称—Micro Controller Unit(微控制器件) 它是由大名鼎鼎的 INTEL 公司发明的

最早的系列是 MCS-48 后来有了 MCS-51 我们经常说的 51 系列单片机就是 MCS-51 micro controller system它是一种 8 位的单片机 8 位是什么意思 我们以后再讲

后来 INTEL 公司把它的核心技术转让给了世界上很多的小公司不过 再小也有几个亿的销售/

年哦 所以世界上就有许多公司生产 51 系列兼容单片机 比如飞利浦的 87LPC 系列 华邦的 W78 系列

达拉斯的 DS87 系列 现代的 GSM97 系列等等 目前在我国比较流行的就是美国 ATMEL 公司的 89C51

它是一种带 Flash ROM 的单片机至于什么是 Flash ROM 我在这儿先不作介绍 等以后大家学到相 关的知识时自然就会明白我们的讲座就是以该型号的单片机来作实验的 讲到这里 也许有的人会

问 我平时在各种书上看到全是讲解 8031 8051 等型号的单片机 它们又有什么不同呢 其实它们同

属于一个系列 只是 89C51 的单片机更新型一点(事实上,89C51 目前正在用 89S51 代替 我们的实验系 统采用就是 89S52 的 兼容 89C52) 这里随便说一下 目前国内的单片机教材都是以 8051 为蓝本的

尽管其内核也是 51 系列的 但毕竟 8051 的单片机已经属于淘汰产品 在市场上也很少见到了 所以由 此感叹 国内的高等教育是如此的跟不上时代的发展需要 这话可能会引起很多人的不满,所以大家别 说是我讲的哦

二 主要单片机的分类

接着上面的话题 再给大家介绍一下我们经常在各种刊物上看到的 AVR 系列和 PIC 系列单片机是 怎么回事 以便让大家对单片机的发展有一个较全面的认识 在没有学习单片机之前 这是一个令很多 初学者非常困惑的问题 这么多的单片机我该先学哪一种呢

AVR 系列单片机也是 ATMEL 公司生产的一种 8 位单片机 它采用的是一种叫 RISC精简指令集单 片机的结构 所以它的技术和 51 系列有所不同 开发设备也和 51 系列是不通用的 它的一条指令的 运行速度可以达到纳秒级即每秒 1000000000 次是 8 位单片机中的高端产品 由于它的出色性能

目前应用范围越来越广 大有取代 51 系列的趋势 所以学完了 51 系列的 看来必须学会 AVR 的才行

可叹知识爆炸 人生苦短 说完了 AVR 的 再来说说另一种--PIC 系列单片机 它是美国 MICROCHIP 公

司 唉 又是老美 叫微芯公司的生产的另一种 8 位单片机 它采用的也是 RISC 的指令集 它的指令 系统和开发工具与 51 系列更是不同 但由于它的低价格和出色性能 目前国内使用的人越来越多 国 内也有很多的公司在推广它 不过它的影响力远没有 51 系列的大 所以作为初学者 51 系列当然是首

以上几种只是比较多见的系列 其实世界上还有许多的公司生产各种各样的单片机 比如

MOTOROLA 的 MC68H 系列 老牌的单片机 TI 的 MSP430C 系列 极低功耗的单片机 德国的西门子 SIEMENS 等等 它们都有各自的结构体系 并不与 51 系列兼容 为了不搞大家的脑筋 这里就不介绍了 等大 家入了门以后自己去研究它吧 我们还是回来了解一下 51 系列单片机到底是个什么东西 它有那些部 分组成 请接着往下看

三 单片机的结构及组成

单片机到底是一种什么 DD 它究竟能做什么呢 其实它就是一种能进行数学和逻辑运算 根据不 同使用对象完成不同控制任务的面向控制而设计的集成电路 此话好象有点绕口 没关系 大家都应该 知道我们经常使用的电脑吧 在电脑上 我们可以用不同的软件在相同的硬件上实现不同的工作 比如 我们用 WORD 可以打字 用 PROTEL 可以设计图纸等等 单片机其实也是如此 同样的芯片可以根据我们 不同的要求做出截然不同的产品 只不过电脑是面向应用的 而单片机是面向控制的 比如控制一个指

 

6

----------------

 

示灯的亮和灭 控制一台电机的启动和停止等等

那么它的内部究竟由哪些部件组成的呢 大家都知道我们的电脑有很多的零件 比如 CPU 中央

处理器 RAM 内存条 ROM 程序存储器 有点象硬盘 输入输出设备 并行口串行口 等等 在 单片机中这些部件都有 而且还把它们全部做到了一块芯片上这就是单片机名称的由来

讲到这里 您一定会想 这么多零件集成在一块芯片上 那为什么单片机的价格会这么便宜 89S51

每块才 10 元不到其实原因很简单----功能有强弱 就象我们平时用的 PLC 控制一台数控机床要用

128 点的 而控制一台电机有几点的就足够了 另外这种芯片的产量很大 技术也非常的成熟 自然价 格也就很低了

说到这里 你是不是有点心痒了 也想学习学习 那么学习单片机究竟需要些什么设备 又要做 哪些准备呢 对于一个初学者来说了解这些真的是很有必要哦 尽量化最少的钱毕竟是大家的想法嘛

四 学习单片机的准备工作

首先您需要一台电脑 这是最基本的 配置嘛 P2 以上的就可以了 然后您需要一套开发单片机 的软件 这个软件叫 KEIL C51 它是美国 Keil Software 公司专门为 MCS-51 系列单片机开发的第三方 软件 它的免费测试版可在www.keil.com 上下载 也可以在各种单片机网站上下载 最新版本是 V6.23

安装时选择 Uvision2 虽然有 2K 代码的限制 但足以满足我们学习的需要 其次 您还需要一台编程

器 它是一种把程序写进单片机芯片的设备 这种设备品种很多 操作也很简单 大家既可以买现成的 产品价格从 200 多元到 2000 多元的都有也可以自己制作 有了这两样东西还不行 为了看到程序

执行的结果 我们还需要一块实验板

因为现在没时间 学习系统我也不做了 以前做的还有一些零件 大家

如果有需要 我可以送给大家 具体的说明在电子爱好者园地上 有时间自 己去看一下 网址www.fj136.com/bbs/index.asp

实验系统的介绍看下面的内容

传统的单片机实验过程都是先用 KEIL C51 或其他的单片机开发软件把源

代码汇编成 HEX 或 BIN 文件 然后用编程器把汇编文件烧写入单片机中 再 把单片机插入实验板中 才能看到软件的执行结果 对于一个单片机初学者来说 不仅非常的麻烦 而且必须配置一套编程器和实验板 就目前市场上 最便宜的编程器来说 投资也要 300 多元 如此一来 使得很多想学单片机

但又不想花太多钱的爱好者忘而却步

好在现在出现了一种支持在线下载的单片机 只要满足一定的外部条件

就能够直接把汇编的程序下载到目标单片机中 经过实验 我们开发设计了

这样的一套实验系统 它采用了一套集源代码编辑 软件汇编 程序下载于 一体的专业软件 采用具有在线下载功能的 FLASH ROM 单片机 89S52 配合

 

7

----------------

 

本教程 可以完成教程中的每一个实验 这样既免去了您添置编程器和仿真器等设备的昂贵费用 又可以直接在实验板上看到程序执行的结果 更由于 采用的是 FLASH ROM 的存储器 烧写次数可以达到 1000 次以上 产品具体

电路图在教程的最后面附录中

为了尽量降低大家的学习费用 我们采用了模块化的设计方法 在您学习

上册时只需购买实验系统的主机部分 包括了 8 个发光二极管 2 个数码管

4 个功能按键 1 个蜂鸣器 一个串行芯片和成品外客 完全可以做上册中的 每一个实验

当您开始学习下册时可以再购买扩展模块 现在开发的扩展模块包括 A/D

TLC0831和 D/AMAX517转换 外部 RAM6264和外部 ROM29F020

存储器 16*16 汉字显示点阵 I2C 总线24C01和温度转换DS18B20

日历时钟DS1302和液晶字符模块T6963 驱动的 240*128 中文图形点阵

等 如果你把这些都学会了 那就得恭喜您 因为您已经基本学会了使用

MCS-51 系列单片机

四 第 1 课习题

1 单片机的分类有几种

2 单片机与计算机有什么区别

 

8

----------------

 

第二课 单片机硬件结构和开发过程

从这一课开始 我们就要正式开始学习 MCS-51 单片机了 前面我们曾经提到过单片机的内部结构

是由 CPU ROM RAM 等等组成 它们的内部结构我们以后再讲 这一课让我们先来看看它的外部引脚 即 硬件结构看下面的图 这就是我们要实验用的 89C51 单片机的外部引脚图 给大家简单介绍一下

一 单片机的引脚功能





























































































































接电源+5V

接地 也就是 GND

3 XTAL119 脚和 XATL218 脚接振荡电路

单片机是一种时序电路 必须有脉冲信号才能工作 在它的内部有一个时钟产生电路 有两种

振荡方式 一种是内部振荡方式 只要接上两个电容和一个晶振即可 另一种是外部振荡方式 采用外

部振荡方式时 需在 XTL2 上加外部时钟信号详细的内容将在以后的课程中专门介绍

4 PSEN29 脚片外 ROM 选通信号 低电平有效

5 ALE/PROG30 脚地址锁存信号输出端/EPROM 编程脉冲输入端

至于它们的作用我们暂时不去管它 等以后学到相关的知识时再来研究它 这也许就是本教程区 别于其他教材的最大特点----先实践后理论 尽量用实验结果来总结理论知识 因为单片机是一种通用 的产品 它的功能设计是为了满足大多数使用者的要求 换句话说 不同的使用者只会使用其相关的功

能 几乎不可能把全部的功能都用起来 因此我们完全不必象学习其他电子技术那样 把单片机的全部 知识都搞懂了再去开发产品 这话前面好象说过了 打住

6 RST/VPD9 脚复位信号输入端/备用电源输入端

什么是复位信号 为什么要加复位信号 当然也暂时不去管它

7 EA/VPP31内/外部 ROM 选择端

在 30 脚 9 脚的功能上不知大家注意没有 都有一个/ 什么意思呢 这是引脚的第二功能 也 就是说 该引脚既可以作前面的功能 也可以作后面的功能 至于它是如何工作的 我们暂时也别去研 究它

 

9

----------------

 

8 P0 口39-32 脚双向 I/O 口

9 P1 口1-8 脚准双向通用 I/0 口


 

 

I/O 就是英文 IN/OUT 的缩写 这些引脚的功能想必大家也都明白了 就是输入/输出的意思

这 32 个 I/O 口就是留给我们作连接外围电路用的 那么它们之间有些什么不同呢 这个问题稍微有点 复杂 我们将在稍后再来专门学习 现在我们先来往下看

二 单片机的电路连接和开发过程

看最后面的附图 这就是我们做实验用的电路图 想必大家都能看得懂吧 接下来就让我们通过 一个实验来看看单片机是如何工作的 我们的实验是让一个 LED 灯亮起来 亮哪一个 这就随便你了

比如我们就让 LED1 亮起来吧 仔细看一下电路图 LED1 接在什么地方呢 接在单片机的 P1.0 的引脚

也就是 1 脚上 那么按照该电路图的连接方法 当 1 脚为高电平时 LED1 是不亮的 只有当 1 脚 为低电平时 LED1 才会亮起来 怎样才能让 1 脚由高电平变为低电平呢 我们让人做事 就必须对她

说一声 也就是发布命令 想让单片机工作 也得发布命令 不过在计算机中那叫指令 我们要让 1

脚变为低电平的指令是 CLR P1.0让 1 脚变为高电平的指令是 SETB P1.0这就是我们通常所说的

源代码 这是我们实验的第一步—源代码编辑 怎么做呢 我们首先得打开实验软件 屏幕出现一个 浏览器的软件窗口 点击左边的扩展实验 选中实验 16—自动温度控制器 再点击工具栏里的调试按

钮 弹出一个记事本对话框 写入 CLR P1.0;(注意 分号必须在英文状态下输入) 输入完毕后选择文

件 保存即可 那么单片机能读懂这条指令吗 当然不能 接下来我们还有一件事情要做 就是把这句 指令翻译成单片机能读懂的东西 单片机能读懂什么呢 它其实只懂一样--就是数字 因此 我们就把

CLR P1.0 翻译成 C2H,90H 至于为什么要翻译成这样 这当然是 INTEL 公司规定好的 我们就不需要

去研究它了 这个过程我们叫作编译 这是我们实验的第二步 那么指令是怎么编译过来的呢 这就 得靠专业的软件了 我们做实验使用的软件就有此功能 只要点击工具栏上的编译按钮 稍等片刻即

出现一个编译信息窗口 如果编译通过就会有编译完成 结果如下 0 个警告 0 个错误的编译信息

如果编译错误则会出现编译错误的信息 并提示错误的行号 编译完了之后通常要进行程序仿真 这是 第三步当然我们的实验程序很简单是不需要仿真的 接下来怎么才能把编译通过的指令写入单片机

中呢 这通常需要借助于一种硬件工具 叫编程器也叫烧录器不过我们的实验板采用的是具有串 行下载功能的单片机 所以您只要直接点击快捷工具栏上的下载按钮 程序就进入了实验板这是第

四步—编程自此就完成了单片机实验的全过程

全部工作结束后 我们看到了什么 接 P1.0 1 脚 的 LED1 亮了起来 改变源代码 变成 SETB P1.0;

进行编译 下载 看看结果是不是 LED1 不亮了 怎么样 不难吧

最后让我们来思考一个问题 当我们用编程器把编译后的指令写入单片机时 单片机就开始执行 这条指令 那么这条指令就一定在单片机内部的某个地方 它究竟在哪里呢 单片机的内部结构又是怎

么样的呢 这将是我们第三课要讨论的内容—单片机的内部结构一半导体存储器

三 本课总结

本课主要讲述了单片机实验的整个过程 这个过程包括第一步—编辑源代码 第二步—编译源代

码 第三步—程序仿真 第四步—芯片烧写 亦称编程 希望大家记住这四步 这是非常关键的哦

单片机的硬件原理其实并不复杂 本来嘛 单片机的设计就是为了通用和灵活 所以开发单片机最重要 的就是软件的编写 以后我会慢慢地教大家学习更多的软件知识

四 第 2 课习题

1 89C51 的电源电压是多少伏

2 熟练掌握编译软件的使用方法

 

10

----------------

 

第三课 单片机的内部结构 一

单片机的内部究竟有哪些部分组成的 它们都有些什么作用呢 让我们看下面的图

这就是单片机的内部方框图 我们先来了解其中的 ROM 存储器吧

一 半导体存储器 ROM

1 几个基本概念 上一课我们讲到了把编译后的指令下载到单片机后这条指令一定在单片机内的某个地方 那么它

究竟在哪里呢 原来它就放在一个叫程序存储器的地方 英文名称 ROM全称为 Read Only Memory

叫只读存储器 它是一个什么东西呢 在讨论这个问题之前 让我们先来看几个物理现象

1数和物理现象的关系

不知大家是否还记得 在学习数字电路时我们曾用一盏灯的亮和灭来表示电平的高和低 即用 1

来表示高电平 用 0 来表示低电平 如果现在有两盏灯那它会有几种状态呢 请看下面的表

0 0

0 1

1 0

1 1

两盏灯的组合就是四种状态 00 01 10 11 这样看来灯的亮和灭这种物理现象同数字确实有 着某种联系 如果我们把它们按一定的规律排好 那么电平的高或低就可以用数字来表示了 换句话说

不同的数字可以代表不同数量灯的电平高或低 比如 0000 0001 0010 0011 0100 0101 0110

0111 1000 1001 1010 1011 1100 1101 1110 1111 这十六种组合就可以代表四盏灯的状态 能 理解吗

 

2位及字节的含义

11

----------------

 

在单片机中 一盏灯实际上是一根线我们称它为一位 它有两种状态0 或 1 分别

对应电平的高或低 它是单片机最基本的数量单位 用 BIT 来表示 8 盏灯八根线有 256 种状态

这 8 盏灯也就是 8 位我们把它称为一个字节 用 BYTE 表示 至于为什么要怎么规定 这就不需要 你我操心了 我们只要记住就可以了 那么单片机是如何来储存这些数字所代表的字节的状态的呢 接

着往下看

2 半导体存储器的工作原理

1存储器的内部构造

看下面的图 这就是半导体存储器的结构简图 (图中有 4 个字节)

2存储器的工作原理

存储器就是用来存放数据的地方 它其实是利用电平的高或低来存放数据的 也就是说 它实际 上存放的是电平的高或低的状态 而不是我们所习惯上认为的 1234 这样的数字 那它是如何工作的

呢 看上面的图 这就是存储器的内部结构示意图 一个存储器就象一个小抽屉 一个小抽屉里有 8

个也就是单片机的 8 位小盒子 每个小盒子用来存放 1 位 电荷电荷通过与它相连的电线传进 来或释放掉 至于电荷在小盒子里是怎样存放的 这就不用我们操心了 您可以把电线想象成水管 小

盒子里的电荷就象是水 那就好理解了 存储器中的 1 个小抽屉我们把它称之为 1 个 单元相当于

1 个字节 而 1 个小盒子就相当于 1 位

有了这么一个构造 我们就可以开始存放数据了 比如我们要放进一个数据 00011010我们只 要把第 2 号 第 4 号和第 5 号小盒子里存满电荷 而其它小盒子里的电荷给放掉就行了 可是问题又出

来了 一个存储器有好多相同的单元 线是并联着的看 D7-D0在放入电荷的时候 会将电荷放入 所有的字节单元中 而释放电荷的时候 会把每个单元中的电荷都放掉 这样的话 不管存储器有多少

个字节单元 都只能放同一个数 这当然不是我们所希望的 因此 我们要在结构上稍作变化 看上面 的图 在每个单元上有根线与译码器相连 我想要把数据放进哪个单元 就通过译码器给哪个单元发一

 

12

----------------

 

个信号 由译码器通过这根线把相应的开关打开 这样电荷就可以自由地进出了 那么这样是不是就能 随意地向存储器写入或者读出数据了呢 其实还不能 继续看上面的图 与 D7-D0 相连的还有一个控制

器 它是用来干什么的呢 这根线叫写入/读出控制线 当我们向存储器写入数据时 必须先把这个开 关切换到写入端 而要读出数据时 就得先把开关切换到读出端 而片选端则是为了区分不同的存储器 设置的 这里没搞明白 没关系 后面还有介绍 先让我们来看看译码器是如何工作的

3 半导体存储器的译码

简单介绍一下 我们知道 1 根线可以代表 2 种状态 2 根线可以代表 4 种状态 3 根线可以代表

8 种 256 种状态又需要几根线代表 自己想一下 是不是 8 根线

4 存储器的选片及总线的概念

至此 译码的问题解决了 让我们再来关注另外一个问题 送入每个字节的 8 根线又是从什么地

方来的呢 它就是从单片机的外部引脚上接过来的 一般这 8 根线除了接一个存储器之外 还要接其它 的器件 这样问题又来了 这 8 根线既然不是存储器和单片机之间专用的 如果总是将某个单元接在这

8 根线上 就不行了 比如这个存储器单元中的数值是 11111111 另一个存储器的单元是 00000000

那么这根线到底是处于高电平 还是低电平 所以我们必须让它们分离 办法当然也简单 当外面的线 接到集成电路的引脚上来后 不直接接到各单元去 而是在中间加一组开关 这组开关就是前面提到的

控制器看前面的图平时我们让开关打开着 如果确实是要向这个存储器中写入数据 或要从存储

器中读出数据 再让开关切换到相应的位置就行了 这组开关由三根引线选择 读控制端 写控制端和

片选端 要将数据写入 先由控制器选中该片 然后发出相应的写信号 开关切换到相应的位置 并将 传过来的数据电荷写入片中 如果要读信号 先选中该片 然后发出读信号 开关也切换到相应的

位置上 数据就被送出去了 另外读和写信号还同时受到译码器的控制 由于片选端的不同 所以虽有

读或写信号 但没有片选信号 所以另一个存储器就不会 误会 而开门 造成冲突 那么会不会同时 选中两个存储器呢 只要是设计好的系统就不会 如果真的出现同时选中两个存储器的话 那就是电路 出故障了

如此看来 存储器要想写入或者读出数据还真是不容易 不过好在这些都是由计算机自动完成的

不需要我们去操心 从上面的介绍中我们已经看到 用来传递数据的 8 根线并不是专用的 而是很多器

件大家共用的 所以我们把它们称之为数据总线 总线英文名为 BUS即公交车道 谁都可以走 而

16 根地址线51 单片机共有 16 根地址线 这些以后会讲解 这里不必死记硬背也是连在一起的 我

们把它们称之为地址总线 看上面的图

对于本小节的内容 如果您一时还无法理解 没有关系 继续往下看好了 我们会在以后的课程 中再来详细的介绍 这里你只要稍微的了解一下就可以了

 

13

----------------

 

5 半导体存储器的分类

第一课中我们提到过 89C51 是一种带 Flash ROM 的单片机 什么是 Flash ROM 它到底是一种什 么东西呢 ROM 我们已经知道 是只读存储器 所谓只读 从字面上理解那就是只可以从里面读出数据

而不能写进去 它类似于我们的书本 发到我们手里之后 我们只能读里面的内容 不可以随意更改书 本上的内容 ROM 就是单片机中用来存放程序的地方 前面我们下载到单片机的指令就放在这个地方

讲到这里大家也许会感到困惑 既然 ROM 是只读存储器 那么指令又是如何进入其中的呢 其实所谓的 只读只是针对工作情况下而言 也就是在使用这块存储器的时候 而不是指制造这块芯片的时候 只要 让存储器满足一定的条件就能把数据预先写进去 这个道理也很好理解 书本拿到我们手里是不能改了

但当它还是原材料--白纸的时候 我们完全可以由印刷厂把内容印上去嘛 前面的编程就是这么回事

Flash ROM 是一种快速存储式只读存储器 这种程序存储器的特点是既可以电擦写 而且掉电后 程序还能保存 编程寿命可以达到一千次左右 所以我们的实验系统是可以反复烧写的 你尽管使用

目前新型的单片机都采用这种程序存储器 当然 除了这种程序存储器外 还有两种早期的程序存储器

产品 简单介绍一下 PROM EPROM 和 EEPROM PROM 称之为可编程只读存储器 就象我们的练习本

买来的时候是空白的 可以写东西上去 可一旦写上去 就擦不掉了 所以它只能写一次 要是写错了

就报废了 习惯上我们把带这种程序存储器的单片机称为 OTP 型单片机 如果您的产品批量生产 又要

求价格比较低的话 带这种程序存储器的单片机是非常合适的 EPROM 称之为紫外线擦除的可编程只

读存储器 它里面的内容写上去之后 如果觉得不满意 可以用一种特殊的方法去掉后重写 就是用紫 外线照射 紫外线就象 消字灵可以把字去掉 然后再重写 当然消的次数多了 也就不灵光了

所以这种芯片可以擦除的次数也是有限的—几十次吧 电脑上的 BIOS 芯片采用的就是这种结构的存储

器 EEPROM 前一种存储器的擦写要用紫外线 而这种存储器可以直接用电擦写 比较方便数据的改写

它有点类似于 FLASH 存储器 但比 FLASH 存储器速度要慢 现在新型的外部扩展存储器都是这种结构的

有关这几种程序存储器的使用和原理 我们将在下册中详细的介绍 这里就不多讲了 总之一句

不管哪种程序存储器 它们的作用都只有一个----就是用来存放程序也就是我们为单片机编写的指

了解了 ROM 让我们再来简单讲讲另一种存储器 叫随机存取存储器 也叫内存 英文缩写为 RAM

Random Access Memory它是一种既可以随时改写 也可以随时读出里面数据的存储器 类似于我 们上课用的黑板 可以随时写东西上去 也可以用黑板擦随时擦掉重写 它也是单片机中重要的组成部


本课主要讲述了单片机的两种半导体存储器—只读存储器 ROM 和随机存储器 RAM 的工作原理 它 们是单片机的重要组成部分 了解它的内部结构对我们学习单片机是很有帮助的 不过如果您一时对本 课的内容还无法搞得很明白 也没有关系 随着学习的深入 我们还会慢慢地讲解相应的基础知识 可 千万不要放弃哦 我在没有学会单片机之前也是如此囫囵吞枣的

三 第 3 课习题

1 半导体存储器分为几大类

2 ROM 存储器的作用是什么

3 什么是位 什么是字节

4
为什么 8 根线在单片机中会有 256 种状态
它是如何出来的

5
89C51 的 ROM 有多少字节的容量

14

----------------

 

第四课 单片机的内部结构 二

上一节课我们讲了半导体存储器 ROM 和 RAM 的内部结构 大家是不是觉得有些枯燥了 这一课让

我们先来做一个实验

一 LED 灯闪烁的实验程序

还记得第二课中的实验吗 这个实验在实际应用中太没有意义了 接下来我们要让 LED1 不断的闪

烁 就象高楼上或者大海中用的航标灯 这个实验可是非常经典的 几乎所有的单片机实验都要提到

那么怎样才能让 LED1 不断的闪烁呢 实际上就是让它亮几秒 再灭几秒 也就是让 P1.0 交替地输出高 电平和低电平 怎样来实现这个功能 按照前面所学的知识 我们写出下面的程序 CLR P1.0 SETB P1.0 编译后下载到单片机

结果不行 为什么 这里有两个问题 首先计算机执行指令的速度很快 执行完第 1 条指令后 LED1 是灭了 但在极短的时间内又去执行了第 2 条指令 LED1 又亮了 我们根本无法看到灯曾经灭过 第 二个问题是当执行完第 2 条指令后 不会再去执行第 1 条指令了 因为单片机执行指令的过程是一条一 条地顺序执行的

如何解决这两个问题呢 我们可以作如下的设想 第一 执行完第 1 条指令后让单片机延时一段

时间几秒或零点几秒然后再去执行第 2 条指令 这样就可以看到 LED1 曾经灭过了 第二 让单片 机执行完全部指令后再返回去执行第 1 条指令 如此不断的循环就可以达到我们的要求了

实验程序如下

主程序

MAIN:SETB P1.0 ;

LCALL DELAY ;

CLR P1.0 ;

LCALL DELAY ;

LJMP MAIN ;

子程序

DELAY:MOV
R7,#250
;

D1:MOV
R6,#250
;

D2:DJNZ R6,D2 ;

DJNZ
R7,D1
;

RET

;

END

.

发现许多朋友很聪明 喜欢把这里的内容复制了直接粘贴到实验系统中 这对你的学习很不利

所以现在的 PDF 文档我把它加密了 看你再偷懒 呵呵 别怪我 我也是为了你好*^*

还记得软件的使用方法吗 调试 写入源代码 编译 下载到单片机 看看是不是我们想要的

结果

在分析这段程序之前 先来说明几个标点符号的意义 1.分号在这里起一个分隔符的作用 表示

这条指令到此为止 2.括号内的数字在这里是为了解释程序用的 实际的编译过程中是没有意义的 也 就是说没有也是一样的 只是为了程序的可读性更强 我们一般会在分号的后面加上程序的注释文字 后 面我们会用到3.特别 程序中的标点符号只能在英文状态下输入 当使用中文输入时 必须切换 到半角状态 不然编译软件会出错

接下来我们分析一下这段程序 按照我们的要求 第 1 条 让灯灭 第 2 条应该是延时 第 3 条 是让灯亮 第 4 条和第 2 条一样也应该是延时 第 5 条应当返回去执行第 1 条指令 看一下上面的程序

第 1 条我们已经懂了 是让 LED1 灭 第 2 条和第 4 条我们等一下讨论 第 5 条是 LJMP MAIN LJMP 是

 

15

----------------

 

一条指令 意思是转移 转移到什么地方去呢 看一下 LJMP 后面跟着什么 是 MAIN 什么地方有 MAIN

在第 1 条指令的开头就是 MAIN 所以第 5 条指令的意思就是跳转到 MAIN即第 1 条指令处继续执行

如此一来 就不断地重复执行这些指令 那么 MAIN 又是什么意思呢 它实际上是我们为这段程序起的

一个名称 专业术语叫标号 既然是一个名称那可不可以用 JIGUO CHINA 等等的其他名字呢 当然可

以 这完全取决于您的需要 不过也有一些是不能采用的 我们以后会讲再来分析第 2 条和第

4 条指令 看看它们是如何实现延时的 LCALL DELAY LCALL 也是一条指令 这条指令叫做调用子程

序指令 看看 LCALL 后面跟着的是什么--DELAY 哪里有 DELAY 在第 6 条指令的开头 很显然这也是 一个标号 这条指令的作用就是当执行到这条指令时就转去执行 LCALL 后面标号所在处的程序 如果在

执行程序时遇到 RET 指令 RET 叫返回指令 就返回到 LCALL 指令的下面一条即第 3 条指令处继 续执行 在第 9 条指令后确实有 RET 指令 那么在执行完第 2 条指令后就应该去执行第 6.7.8.9 条指令

之后遇到第 10 条指令 RET 执行完这条指令后就回去执行第 3 条指令 将 P1.0 清零 也就是让 LED1

亮 然后再去执行第 4 条指令 执行完后又回到 6.7.8.9.10 条指令 最后执行第 5 条指令 LJMP MAIN

也就是我们刚才说的跳转到第 1 条 将 P1.0 置位 就是让 LED1 灭掉 如此周而复始 LED1 就不断的 闪烁 好好理解这段文字 务必把它搞清楚

从标号 DELAY 处即第 6 条开始到 RET 的这一段指令我们称之为子程序 它是一段延时程序

至于延时多长时间 我们会在下一课中学习 程序的最后一条是 END 它不是指令 它只是告诉编译软 件整个程序到此结束了 它叫 伪指令在大家以后的编程中 写完程序都要加上这一条

在上面的程序中我们知道了从标号 DELAY 开始的子程序是一段延时程序 那么它又是如何工作的

呢 在了解它的工作过程之前我们必须先知道其中的一些符号 就从 R7 开始吧 它是单片机内部的一

个重要组成部分 叫工作寄存器 什么是工作寄存器 下面我们就来讲解这个问题

二 工作寄存器

上一课我们已经讲过 在单片机中有许多的功能寄存器和半导体存储器 RAM 有关 那么工作寄存 器又属于哪一部分呢 它是用来干什么的呢 要搞清楚这个问题 让我们先从日常生活中的一个例子说

起 比如我们要做一道数学题 123+456 您会马上得出答案 579 接下来再看一道题 123+456+789

要你马上得出答案就不那么容易了 通常我们会怎么做呢 一般总是先把 123+456 的结果 579 写在一张 纸上 然后再算 579+789=1368 这 1368 就是我们想要的最终结果 而 579 只是为了得到最终结果而暂 时记下来的中间结果 单片机中做运算和我们生活中做运算一样 也需要把中间结果放在某个地方 那

么计算机把它放在哪儿呢 前面我们提到的 ROM只读存储器中 不行 因为 ROM 是用来放程序的

它只能写进去 不能读出来 再次提醒一下 这只是相对而已 所以只能放在单片机的另一个区域—RAM 中即随机存取存储器中 R7 就是 RAM 区域中划出的一部分 知道了 R7 接下来让我们来分析一下 这段子程序延时程序

三 LED 灯闪烁程序子程序的分析

首先看第 6 条 MOV R7 #250 这也是一条指令 意思是传递数据 我们知道在日常生活中 要 传递一件东西就必须要有一个传递者 一个接受者和被传递的东西 那么在单片机中是怎么区分它们的

呢 在这条指令中 R7 是接受者 250 就是要传递的东西单片机中要传递的东西当然是数字了这 里传递者被省略了顺便提一下 并不是每条指令都能省略的 事实上大部分的指令都要有传递者

这样一来 这条指令的意思也很清楚了 就是把 250 这个数传递给 R7 这个工作寄存器也就是把 250

这个数送入 R7 中这样执行完这条指令后 R7 中的值就应该是 250 我们可以用 DBG8051 这个软件来 验证一下 看是不是符合这个软件的使用很简单 大家可以预先学一下比如 我们写下面的指令

 


 

输入后按 F8 看看右边的特殊/工作寄存器窗口中 R6 R7 的值是不是 01H 02H注意 实际显示 的值是十六进制数 由于我们输入的十进制数 为了直观的看到执行结果 所以数值不要太大了

这里还有一个问题 不知大家注意没有 在 250 这个数的前面有个# 它是什么意思呢 这个#就

说明 250 是一个被传递的数的本身 而不是传递者这里面是有区别的 我们以后会讲到看懂了 MOV

 

16

----------------

 

R7 #250 那么 MOV R6 #250 也应该很清楚了

接着看第 8 条 DJNZ R6 D2 这又是另一条指令 我们来看一下 DJNZ 后面跟着什么 一个是 R6

一个是 D2 R6 我们已经知道了 再找一下 D2 D2 在本行的开头 我们已经学过 它是标号 那么这条 指令是怎么执行的呢 它的执行过程是这样的 它将后面的值即工作寄存器 R6 中的值减 1 然后

查一下这个值是否等于 0如果等于 0 就往下执行 如果不等于 0 就转移 转移到什么地方去

呢 大家应该明白了 实际上这条指令的执行结果就是在原地转 250 次 当 R6 中的值等于 0 之后

程序就去执行第 9 条指令 也就是 DJNZ R7 D1 大家自行分析一下这条指令的结果是不是转去执

行 MOV R6 #250 同时 R7 中的值减 1这段子程序的最终执行结果就是 DJNZ R6 #250 这条指令被 执行了 250*250=62500 次 执行这么多次干吗 就是为了延时

四 本课总结

大家可以改变一下 MOV R6 #250 这条指令中的值注意 不能大于 255 为什么 以后会讲 到或者改变一下标号的名称 看是不是符合上面的分析 接下来提一个问题 通过实验我们看到了

LED1 在闪烁 是因为 DJNZ R6 #250 这条指令被执行了 250*250=62500 次 执行那么多次究竟需要多

长时间呢 下一课我们再来专门讨论这个问题

这里有必要介绍一下 DBG8051 这个软件 它是一个专为 8051 单片机设计的仿真软件 配合 MON51 仿真机能进行 51 单片机的仿真 拥有这样一套设备在过去可是非常奢侈的 不过现在已经很少有人使 用它了 原因是目前市场出现了许多兼容 KEIL C51 的仿真器 它们的功能更先进 MON51 只能属于淘 汰产品 不过作为单片机初学者 使用 DBG8051 还是很有意义的 相比其他的开发工具 它的使用比较 简单 我们可以用它来理解单片机的内部结构和程序的执行结果 在我们实验套件的随机光盘中 有这 个软件 希望大家有时间好好的看一看

五 第 4 课习题

1 什么是主程序 什么是子程序

2 标号的含义是什么

3 单片机是如何执行程序的

4 工作寄存器属于 ROM 单元还是 RAM 单元

5 在实验中如果没有 RET 指令会出现什么情况

6 理解指令 LCALL LJMP DJNZ 的意义

7 掌握 DBG8051 软件的使用方法

17

----------------

版权所有:单片机教程网 2007
Email:erd51@163.com qq:58565254