第七课 单片机的内部结构

在上一课中 我们讲到了指令 MOV P3 #0FFH 能使 P3 口全部为高电平 而在第四课中 LED 灯闪

烁程序中给 R7 送数用的指令是 MOV R7 #250 那么这#250 和#0FFH 到底有什么不同 它们又代表什

么意思呢 这一课就来讨论这个问题 在讲解之前 让我们先来复习一下数字电路中学过的数制概念

一 数制

1 十进制数Decimal Number

在日常生活中 我们表示数的多少用的是十进制数 即 0 1 2 3 4 5 6 7 8 9 它遵循

逢十进一 借一当十 的原则 通常我们把计数符号的个数叫做基数 十进制的基数就是十

比如一个十进制数 5847=5*1000+8*100+4*10+7*1 它的每一个数码都有一个系数 1000 100 10

1 这个系数叫做权或位权 十进制数虽然非常符合我们的使用习惯 但计算机中却无法采用 因为计 算机只能有两种状态0 和 1所以我们还得应用二进制数

2 二进制数Binary Number

二进制的基数为二 0 和 1 它遵循的是 逢二进一 借一当二 的进借位原则 也就是当某位 计数到两个数时就向高位进 同时本位变为

比如二进制数 1100=1*23+1*22+0*21+0*20 二进制数只有 0 和 1 两个数 正好代表了计算机中电路 的两种工作状态 所以它在计算机中被广泛应用 下面是二进制的加法和乘法运算规则

 


 

二进制数虽然在计算机中处理很方便 但当位数较多时 就不容易记忆和书写了 所以计算机中 又有了十六进制数

3 十六进制数Hexadecimal Number

十六进制也遵循两个规则 一是有十六个基数 即 0 1 2 3 4 5 6 7 8 9 A B C D

E F 另一个规则是 逢十六进一 借一当十六

比如我们前面提到的#0FFH 就是一个十六进制数 #--我们已经明白了 它表示的是传递数的本身

H 叫数制简码 它表示这个数是十六进制数 为什么前面我在标题后面都加了英文注释 相信大家 也应该明白了吧这里随便提一下 二进制简码 B 和十进制简码 D 通常是可以省略的 我们以后的课程

中用到的数都是这样写的那么 0FFH 这个十六进制数的表示方法是怎么样的呢 用十进制就是表示

0FFH=F*161+F*160 即等于 255 大家也许会疑问 这里的 0 到哪里去了呢 原来 在单片机中

当我们用十六进制格式表示一个数时 如果高位的数字为 A-F 时 高位前面就得加上个 0 不然

编译软件会出错 就象#0FFH

二 进制之间的转换

十进制有使用比较习惯的特点 二进制有易于表示和运算方便的特点 十六进制又有表示位数较 多的特点 但有时我们常常要把十进制数转换成二进制数或十六进制数来处理 把二进制数逆转换成十 六进制数 如何进行这种转换呢 下面就举几个例子

1 十进制数与非十进制数之间的转换

1 非十进制数转换为十进制数

具体做法是 将一个非十进制数按权展开成一个多项式 每项是该位数码与相应权值之积 把多 项式按十进制的规则进行计算求和 所得的结果就是该数的十进制形式

比如 二进制数 1011B 转换成十进制为 1*23+0*22+1*21+1*20=8+2+1=11D 再比如 十六进制数 FFH

转换成十进制为 255D

2 十进制数转换为非十进制数

十进制数转换为非十进制数时 可将其分为整数部分和小数部分分别进行转换 最后将结果合并

 

24

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

 

为目的数 为了简单 我这里只讲整数部分的转换 这种转换叫做除基取余法 具体做法是用欲转换数 制的基数去除十进制数的整数部分 第一次除所得余数为目的数的最低位 把得到的商再除以该基数

所得余数为目的数的次低位 依次类推 继续上面的过程 直至商位为 0 此时所得余数为目的数的最 高位

比如 将十进制数 53D 转换成二进制数为 53D=110101B

2└53

2└26 1

2└13 0

2└6 1

2└3 0

2└1 1

0 1

2 二进制数与十六进制数之间的转换

四位二进制共有 16 种组合 而这 16 种组合正好与十六进制数的 16 个基数一致 所以每 4 位二进 制数对应一位十六进制数 我们只要把二进制数的整数部分自右向左每 4 位一组 最后不足 4 位的用 0 补足 小数部分自左向右每 4 位一组 最后不足 4 位的在右面补 0 再将每 4 位二进制数对应的十六进 制数写出即可 相反 如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的 4 位二进制 数即可

比如 将 1101011B 转换成十六进制数为 D6H 再比如 将 F0FH 转换成二进制数为 111100001111B

十进制数

二进制数

十六进制数

0

0000

0

1

0001

1

2

0010

2

3

0011

3

4

0100

4

5

0101

5

6

0110

6

7

0111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

15

1111

F

16

10000

10

上面的表格就是二进制数 十进制数和十六进制数之间的对应关系

三 立即数的写法

通过前面一小节的讲解 我们已经懂了 MOV R7 #250 和 MOV R7 #OFFH 中#250 和#0FFH 原来

是十进制数 250D 和十六进制数 FFH 的区别 在单片机中 通常我们把这个数称之为立即数 那么如果 我在编写指令时把立即数#0FFH 写成二进制数即 11111111或用十进制写法255是不是可以呢

当然可以 立即数既可以是二进制数 也可以是十进制数或十六进制数 讲到这里你应该明白了 为什

么我们前面的实验把#0FFH 送到 P3 口会使 P3.7-P3.0 变为高电平 这里再重复一遍 那就是当用十六 进制格式表示一个立即数时 如果高位的数字为 A-F 时 高位前面要加上个 0请大家务必记住

了 这是一个常识问题 可很多书上都不提 所以很多人在做实验时往往会编译出错

这里简单地讲了一下关于数制以及二进制 十进制和十六进制数的关系 大家可以在以后的实践

 

25

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

 

中慢慢去理解和掌握 如果您一时记不住 千万不要刻意地去死记硬背 下面让我们来讨论另一个问题

四 存储器的地址

什么是存储器的地址 地址和数据又有什么关系呢 这个问题往往让初学者非常的难以理解 既 然单片机存储器内存放的是数据 为什么还要有地址的概念 让我们从生活中的一个例子谈起 大家都 知道寄信是怎么回事吧 我们要寄一封信就必须写好信的内容 然后在信的封面写上详细地址 邮局才

能按地址把它寄出去 我们给单片机送数也一样 除了要给出立即数犹如信的内容还必须知道这 个数送达的地址犹如信的地址或邮政编码所以就必须给每个寄存器即半导体存储器都规定不

同的地址 只不过在单片机中地址的编码也是用数字来表示的 那么单片机中有多少个寄存器呢 它们

的地址又是如何规定的呢

前面我们学过 单片机有两种存储器 即只读存储器 ROM 和随机存储器 RAM 它们都被规定了各

自的地址 我们把它称做寻址空间 既然是空间 就必然有一个范围的概念 接下来就让我们先看看

89C51 单片机内部程序存储器的寻址范围

1 内部 R0M 的寻址范围

89C51 的内部有 4K 的 FLASH ROM 空间 其寻址范围为 000H-FFFH 15162*15161*15160=0-4095

这 4K 的 ROM 空间就是用来存放我们为单片机编写的程序用的 单片机执行指令时就是一条一条顺序地

从 ROM 中寻找指令进行执行 了解了 ROM 的寻址范围 让我们接着来看另一种存储器 RAM 的寻址范围

2 内部 RAM 的寻址范围

89C51 内部共有 128 个字节的 RAM 空间 其寻址范围为 00H-7FH怎么算出来的 大家结合前面所

学的知识自己理解一下它被分成三个区域 第一个区域 00H-1FH 安排了 4 组工作寄存器 每组用 8

个字节 共 32 个字节 分别为 R0-R7 当然在同一时刻 只能用其中的一组工作寄存器 怎么来控制

它 就要用到程序状态字 PWS 中的 RS0 RS1 两位这我们后面再讲 第二个区域 20H-2FH 共 16 个字 节除了可以作为一般的 RAM 单元读写外 还可以对每个字节的每一位 即每一个抽屉中的每一个小盒子

进行操作 并且对这些位都规定了固定的位地址 从 20H 单元的第 0 位开始到 2FH 单元的第 7 位结束共

128 位 第三个区域就是一般的 RAM 单元 地址为 30H-7FH 共 80 个字节

实际上 在 89C51 单片机的内部还有一个部分从 80H-FFH 是专门用于特殊功能寄存器SFR的

89C51 共用 21 个特殊功能寄存器这些我们都将在下一课中讲解它们每个也都有 8 位的 这些特殊 功能寄存器的使用和前面的 128 个字节 RAM 不同 所以很多书上的解释都是 89C51 有 128 个字节的内部

RAM 实际上它们也属于内部 RAM 一部分

为了加深印象 大家可以打开 DUG8051 软件看一下它们的内部组成

五 本课总结

本课主要讲述了数据与地址两个概念 其中第一部分的内容在学习数字电路时大家应该学过 我 这里把与单片机有关的内容再讲解一下 目的是希望各位能掌握这些知识 因为它们对我们学习单片机 是非常有用的 数据和地址是单片机中一个非常重要的概念 也是比较难以理解 在我们以后的学习中

大家会发现 我还会更加详细的讲解这方面的相关知识

六 第 7 课习题

1 二进制 十进制 十六进制的规则分别是什么

2
什么叫立即数


3
单片机 RAM 的寻址空间为多少
它包括哪两个部分

4
单片机 ROM 的寻址空间为多少



5
把下面的立即数转换成二进制


 

100 250 100H 4AH FFH

6 把下面的立即数转换成十进制

0001 0011 1111 A0H FFH

7 把下面的立即数转换成十六进制

100 255 00111100 11110101

26

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

 

第八课 单片机的内部结构 六

前面我们已经讲过 R7 R6 是工作寄存器 P0 P1 P2 P3 是并行口 那么单片机中还有些什么

东西 它们的结构又是怎么样的呢 这就是本课要讨论的问题

一 单片机的特殊功能寄存器

看第三课的单片机内部结构图 在单片机中 除了前面介绍的 RAM ROM P0-P3 和 CPU 外 方框

内的还有许多其他的东西它们被称为特殊功能寄存器 英文简写 SFR 下表例出的就是 MCS-51 单片机 中几个常用的特殊功能寄存器 这一课我们先来介绍几个

二 几个常用的特殊功能寄存器

1.累加器 ACC

通常用 A 表示 它是一个什么东西呢 我们知道单片机在做运算时它的中间结果需要放在某个地

方 这个地方就是累加器 它的名字很特殊 功能也很特殊 几乎所有的运算类指令都离不开它

2.寄存器 B

B 寄存器在做乘法时用来存放一个乘数 在做除法时用来存放一个除数 不做乘除法时随你怎么

3.程序状态字 PSW

它是一个很重要的东西 里面放了 CPU 工作时的很多状态 知道它就可以了解 CPU 当前的工作状

态 它有点象平时看书用的目录 我们浏览它就可以了解一本书的内容 它是一个 8 位的寄存器 用到 了其中的 7 位 其格式如下

D7

D6

D5

D4

D3

D2

D1

D0

CY

AC

F0

RS1

RS0

0V

P

下面来逐位介绍它的功能

1CY 进位标志位

MCS-51 是一种 8 位的单片机 它的运算结果只能表示到 28 0-255但我们有时候的运算结果 要超过 255 怎么办呢 就要用 CY 例如 79H+87H01111001+01010111=1 00000000 这里的 1

就进到了 CY 中去了

2AC 半进位标志位

D3 位向 D4 位进位/借位时 AC=1 通常用于十进制调整运算中

3F0 用户自定义标志位

由编程人员自行决定 什么时候用 什么时候不用

4 RS1 RS0 工作寄存器组选择位

RS1 RS0 工作寄存器组

0

0

0

00H-07H

0

1

1

08H-0FH

1

0

2

10H-17H

1

1

3

18H-1FH

前面讲到单片机共有四个工作寄存器组 0 -3 它们就是由 RS1 RS0 来控制 这两位就在 这里 它共有四种组合状态 看上面的表格 每个工作寄存器组有 8 个字节 分别记为 R0-R7 当然在 某一时刻 CPU 只使用其中的一组

假设 PSW 11H 00010001 那么 RS1=1 RS0=0 则用到了第 2 组寄存器组 地址 10H-17H

RO-R7 即为 10H-17H DBG8051 软件输入数值 看看内部 RAM 中地址为 10H-17H 中的值是不是为输入


5 0V 溢出标志位

什么时候溢出 我们讲到定时器时再研究

27

 

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


6 P 奇偶检验位

每次运算结束后若 A 中二进制数 1的个数为奇数 P=1 否则 P=0 某运算结果是 58H

01011000显然 1 的个数为奇数 所以 P=1

4 DPTRDPH DPL数据指针

数据指针是一个 16 位的寄存器 我们可以用它来访问外部 RAM 也可以访问外部 ROM 中的表格

具体应用以后再讲

5 SP 堆栈指针

让我们先来理解一下堆栈是什么意思 你在家洗碗吗 我们洗好碗之后 是怎么放的呢 一般总 是先洗的放在下面 晚洗的放在上面 然后用的时候呢 总是晚放上去的先用 先放上去的后用 如果 你不洗碗不要紧 知道码头上仓库里堆的货物吗 一般也是先进去的后出来 而后进去的先出来 这种

符合 先进后出 后进先出 存放规则的现象我们就把它叫做 堆栈 其实栈在中文中的意思就是码

在单片机中 我们可以在内部 RAM 中构造出注意 是可以构造这样一个区域 这个区域存 放数据的规则就符合堆栈中 先进后出 后进先出 的原则 为什么要有这样一个区域呢 存储器本身 不也同样可以存放数据吗 是的 知道了存储器地址确实可以读出它里面的内容 但如果我们要读出的 是一批数据 每一个数据都要给出一个地址就会很麻烦 为了简化操作就可以利用堆栈的存放方法来读 取数据 具体的应用我们将在十五课中结合具体实验来讲 这里只是让大家先了解一下 那么堆栈在单 片机的什么地方 也就是说把 RAM 空间的哪一块区域作为堆栈呢 这就不好定了 因为单片机是一种通 用的产品 每个人的实际需要各不相同 有人需要多一些堆栈 而有人则不需要那么多堆栈 所以 INTEL 公司就干脆不分了 把分的权利让给用户编程者也就是说我们可以根据自已的需要来决定 所以 单片机中堆栈的位置是可以变化的 而这种变化就体现在 SP 中值的变化 看下面的图 SP 中的值等于

27H 不就相当于是一个指针指向 27H 单元吗 这就是堆栈指针的由来

31H

SP

31H

第一个数据

30H

30H

29H

29H

28H

28H

27H

27H

26H

26H

25H

25H

24H

24H

当然在 MCS-51 单片机中 指针开始所指的位置并非就是数据存放的实际位置 而是数据存放

的前一个位置 例如一开始堆栈指针是指向 27H 单元的 那么第一个数据的存放位置就在 28H 单元中

而不是 27H 单元中 这一点请大家注意

6 电源控制寄存器 PCON

单片机在以电池供电的系统中 有时为了节电 我们需要让它尽量降低电源的消耗 所以单片机 就有多种的工作方式 其中一种就是低功耗方式 PCON 寄存器就是用来控制单片机进入低功耗方式的

有关这方面的知识我们将在下一课的课程中详细介绍

三 本课总结

以上几个寄存器只是单片机中最常用的几个 SFR 其他的特殊功能寄存器 我们将在具体应用时 再作详细的介绍

四 第 8 课习题

1 累加器 A 的作用是什么

2 什么是堆栈 堆栈存放数据的规则是什么

3
单片机中有几组工作寄存器
它们的字节地址是什么

4
简述 PSW 各位的作用

 

28

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

 

第九课 单片机的工作方式

上一课中 我们提到了单片机的工作方式 单片机究竟有几种工作方式 它们又是如何工作的呢

这一课就来讨论这个问题

一 单片机的工作方式

单片机共有复位 程序执行 低功耗和编程与加密四种工作方式 下面分别加以介绍

1 复位方式

1为什么要复位

大家知道 单片机执行程序时总是从地址 0000H 开始的 所以在进入系统时必须对 CPU 进行复位

也叫初始化 另外由于程序运行中的错误或操作失误使系统处于死锁状态时 为了摆脱这种状态 也需 要进行复位 就象电脑死机了要重新启动一样

2 复位的原理

单片机复位的方法其实很简单 只要在 RST 引脚9 脚上加一个持续时间为 24 个振荡周期 即 两个机器周期的高电平就可以了 如果晶振为 12M 计算一下这个持续脉冲需要多长时间

3 如何进行复位

复位操作有上电自动复位 按键复位和外部脉冲复位 3 种方法 它们的电路分别如下


上电自动复位是通过外部复位电路的电容充电来实现的 看图 1 当电源刚接通时电容 C 对下拉

电阻开始充电 由于电容两边的电压不能突变 所以 RTS 端维持高电平 只要这个充电时间不超过 1ms

一般都就可以实现对单片机的自动上电复位 即接通电源就完成了系统的初始化 在实际的工程应用中

如果没有特殊要求 一般都采用这种复位方式 按键复位的电路如图 2 所示 它其实就是在上电复位的

基础上加了 R1 和 SA 这种电路一般用在需要经常复位的系统中 外部脉冲复位的电路如图 3 所示 外 部复位通常用于要求比较高的系统 比如希望系统死锁后能自动复位 外部复位是由专门的集成电路来 实现的 也就是我们通常俗称的 看门狗 电路 这种电路有很多 它们不但能完成对单片机的自动复 位功能 而且还有管理电源 用作外部存储器等功能 比如 X25045,MAX813L 等等就是比较常用的此类 芯片 关于这方面的内容我们将留到下册的教程中再来给大家详细讲解

现在让我们先来看看单片机复位后 它的内部会有些什么变化呢 看下面的表

 

29

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

 

4复位后的状态

这就是单片机复位后内部系统的状态 上面的有些符号我们暂时还看不懂 不过没关系 等以后 学到了相关的知识后您自然就会明白了

单片机的初始化状态

寄存器

复位时的内容

PC

0000H

ACC

00H

B

00H

PSW

00H

SP

07H

DPTR

0000H

P0-P3

FFH

TMOD

00000000B

TCON

0X000000B

TL0

00H

TH0

00H

TL1

00H

TH1

00H

SCON

00H

SBUF

不定

PCON

0XXX0000B

2 程序执行方式

程序执行是单片机的基本工作方式 由于复位后 PC=0000 所以程序就从地址 0000H 开始执行

此时单片机就根据指令的要求完成一系列的操作控制 比如前面讲的让 LED 灯闪烁起来 不过在实际使 用中 程序并不会从 0000H 开始执行 而总是安排一条跳转指令 比如 LJMP START 为什么要这样安

我们讲到中断时再来解释

3 低功耗操作方式

在以电池供电的系统中 有时为了降低电池的功耗 在程序不运行时就要采用低功耗方式 低功

耗方式有两种待机方式和掉电方式

低功耗方式是由电源控制寄存器 PCON上一课我们提到过的来控制的 电源控制寄存器是一个 逐位定义的 8 位寄存器 其格式如下

MSB

SB

SMOD

--

--

--

GF1

GF0

PD

IDL

其中 SMOD 为波特率倍增位 在串行通讯时用 GF1 为通用标志位 1 GF0 为通用标志位 0 PD 为掉电方式位 PD=1 进入掉电方式 IDL 为待机方式位 IDL=1 进入待机方式 也就是说只要执行 一条指令让 PD 位或 IDL 位为 1 就可以了 那么单片机是如何进入或退出掉电工作方式和待机工作方式

我们来介绍一下

1 待机方式

进入待机方式

当使用指令使 PCON 寄存器的 IDL=1 则进入待机工作方式 此时 CPU 停止工作 但时钟信号仍提 供给 RAM 定时器 中断系统和串行口 同时堆栈指针 SP 程序计数器 PC 程序状态字 PSW 累加器

ACC 以及全部的通用寄存器都被冻结起来 单片机的消耗电流从 24mA 降为 3.7mA 这样就可以节省电源 的消耗

退出待机方式

退出待机方式可以采用引入中断的方法 在中断程序中安排一条 RETI 的指令就可以了 什么是中

断 我们现在还不知道 当然这没关系 其实待机方式和我们使用电脑时的睡眠方式有异曲同工之妙

2掉电方式

 

30

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

 

进入待机方式

当使用指令使 PCON 寄存器的 PD=1 则进入掉电工作方式 此时单片机的一切工作都停止 只有 内部 RAM 的数据被保持下来 掉电方式下电源可以降到 2V 耗电仅 50uA 此时就相当于把显示器和硬 盘也关闭了

退出待机方式

退出掉电工作方式的唯一方法是复位 不过应在电源电压恢复到正常值后再进行复位 复位时间 要大于 1mS 在进入掉电方式前 电源电压是不能降下来的 因此可靠的单片机电路最好要有电源检测 电路 显然掉电方式和待机方式是两种不同的低功耗工作方式 前者可以在无外部事件触发时降低电源 的消耗 而后者则在程序停止运行时才使用

关于单片机的低功耗的方式就简单的讲这些 更详细的内容也留到下册再讲解

4 编程和加密方式

单片机的编程与加密是由专门的设备来完成的 这种设备称为编程器或烧录器 类似的产品有很

多 功能也不尽相同 如果您有兴趣 我将在以后给您介绍一款 51 系列单片机编程器的自制方法

这里给大家简单介绍一下单片机的加密 加密是为了保护编程者的劳动成果而设计的一种工作方

式 不过有矛必然有盾 现在的高手实在是很多 听说即使用 OTP 特种加密方式 也能解密 不过能加 密总比不加密的好 所以大家在编程时应尽量采用加密功能

二 本课总结

这一课我们讲述了单片机的工作方式 对于初学者来说除了复位方式外 其他的只要稍微有点了 解就可以了

三 第 9 课习题

1 单片机有几种工作方式

2 为什么要进行复位 复位后的状态是什么

3 如何对单片机进行复位

4 找一套编程器的软件自己先熟悉一下


31

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

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