首页 理论教育控制程序存储:单片机原理与应用

控制程序存储:单片机原理与应用

【摘要】:1.程序存储器程序存储器用来存放程序和表格常数。

1.任务要求

用Keil uVision软件观察单片机的控制程序情况。

2.任务目的

在学习任务1.1的基础上,进一步了解单片机的控制程序存储的基本情况。

3.任务分析

计算机中的程序存储在存储器中,单片机控制程序也是如此,程序存储的具体形式如何,通过本次实训操作要有感性上的认识。

4.观察程序在Keil uVision中的存储

在学习任务1.1的基础上,打开“view”菜单,在下拉菜单中选择“Memory Windows”→“Memory1”,将弹出Memory1窗口,程序存储仿真如图1-9所示。

图1-9 程序存储仿真

Memory1即为单片机中程序存储的一个区,在地址栏“Address”中输入程序存储的首地址0003H(此地址由编译程序提供),下面的窗口就会显示从0x0003地址开始的存储单元中的数据。本例中显示了源程序的机器码(用十六进制表示,软件自动完成由源程序到目标程序的编译),每个单元存放一个字节的数据,整个程序存放在连续的程序存储器区域。存储单元为“00”的是没有占用的单元。

1.1.2 MCS-51单片机存储器的结构

MCS-51单片机存储器的结构与常见的微型计算机的配置方式不同,它把程序存储器和数据存储器分开,有各自的寻址系统、控制信号和功能。程序存储器用来存放程序和始终要保留的常数,如所编程序经汇编、编译后的机器码。数据存储器通常用来存放程序运行中所需要的常数或变量,如做加法运算时的加数和被加数、做乘法运算时的乘数和被乘数、模/数转换时实时记录的数据等。

从物理地址空间看,MCS-51有四个存储器地址空间,即片内程序存储器和片外程序存储器、片内数据存储器和片外数据存储器。

MCS-51系列各芯片的存储器在结构上有些区别,但区别不大,从应用设计的角度可分为下列几种情况。

1.程序存储器

程序存储器用来存放程序和表格常数。程序存储器以程序计数器PC作地址指针,通过16位地址总线,可寻址的地址空间为64 KB(片内、片外统一编址)。

1)片内有程序存储器且存储空间足够

在8051/8751片内,带有4 KB ROM/EPROM程序存储器(内部程序存储器),4 KB可存储约2000多条指令,对于一个小型的单片机控制系统来说就足够了,不必另加程序存储器,若不够还可选8 KB或16 KB内存的单片机芯片,如89C52等。总之,尽量不要扩展外部程序存储器,这会增加成本,增大产品体积。

2)片内有程序储器且存储空间不够

若开发的单片机系统较复杂,片内程序存储器存储空间不够用时,可外扩展程序存储器,具体扩展多大的芯片要计算一下,其由两个条件决定:一是看程序容量大小,二是看扩展芯片容量大小。64 KB总容量减去内部4 KB即为外部能扩展的最大容量,2764容量为8 KB,27128容量为16 KB,27256容量为32 KB,27512容量为64 KB。若再不够就只能更换芯片,选16位芯片或32位芯片都行。定了芯片后就要算好地址,再将引脚接高电平,使程序从内部ROM开始执行,当PC值超出内部ROM的容量时,会自动转向外部程序存储器空间。

对8051/8751而言,外部程序存储器地址空间为1000H~FFFFH。对这类单片机,若把接低电平,可用于调试程序,即把要调试的程序放在与内部ROM空间重叠的外部程序存储器内,进行调试和修改。调试好后再分两段存储,再将接高电平,便可运行整个程序。

3)片内无程序存储器

8031芯片无内部程序存储器,需外部扩展EPROM芯片,地址0000H~FFFFH都是外部程序存储器空间,在设计时应始终接低电平,使系统只从外部程序储器中取指令。

MCS-51单片机复位后程序计数器PC的内容为0000H,因此系统从0000H单元开始取指令,并执行程序,它是系统执行程序的起始地址,通常在该单元中存放一条跳转指令,而用户程序从跳转地址开始存放程序。

2.数据存储器

1)内部数据存储器

MCS-51单片机的数据存储器无论在物理上或逻辑上都分为两个地址空间,一个为内部数据存储器,访问内部数据存储器用MOV指令,另一个为外部数据存储器,访问外部数据存储器用MOVX指令,用C51编程时由系统自动编译完成。

MCS-51系列单片机各芯片内部都有数据存储器,是最灵活的地址空间,它分成物理上独立的且性质不同的几个区:00H~7FH(0~127)单元组成的128字节地址空间的RAM区;80H~FFH(128~255)单元组成的高128字节地址空间的特殊功能寄存器(又称SFR)区。注意:8032/8052单片机将这一高128字节作为RAM区。

在8051、8751和8031单片机中,只有低128字节的RAM区和128字节的特殊功能寄存器区,两区地址空间是相连的,特殊功能寄存器(SFR)地址空间为80H~FFH。注意:128字节的SFR区中只有26个字节是有定义的,若访问的是这一区中没有定义的单元,则得到的是一个随机数

内部RAM区中不同的地址区域功能结构如图1-10所示。其中00H~1FH(0~31)共32个单元是四个通用工作寄存器区,每一个区有八个工作寄存器,编号为R0~R7,每一区中R0~R7的地址见表1-3。

图1-10 MCS-51内部RAM存储器结构

表1-3 寄存器和RAM地址对照表

当前程序使用的工作寄存区是由程序状态字PSW(特殊功能寄存器,字节地址为0D0H)中的D4、D3位(RS1和RS0)来指示的,PSW的状态和工作寄存区对应关系见表1-4。

表1-4 工作寄存器区选择

CPU通过对PSW中的D4、D3位内容修改,就能任选一个工作寄存器区。若不进行设定,则默认为第0区(也叫默认值),这个特点使MCS-51具有快速现场保护功能。特别注意的是,如果不加设定,在同一段程序中R0~R7只能用一次,若使用两次,程序便会出错。

如果用户程序不需要四个工作寄存器区,则不用的工作寄存器单元可以作为一般的RAM使用。

内部RAM的20H~2FH为位寻址区(见表1-5),这16个单元的每一位都有一个位地址,位地址范围为00H~7FH。位寻址区的每一位都可以视作软件触发器,由程序直接进行位处理。通常把各种程序状态标志、位控制变量设在位寻址区内。同样,位寻址区的RAM单元也可以作为一般的数据缓冲器使用。

表1-5 RAM位寻址区位地址映象

在一个实际的程序中,往往需要一个后进先出的RAM区,以保存CPU的现场信息,这种后进先出的缓冲器区称为堆栈。堆栈原则上可以设在内部RAM的任意区域内,但一般设在30H~7FH。栈顶的位置由栈指针SP指出。

2)外部数据存储器

MCS-51具有扩展64 KB外部数据存储器和I/O口的能力,这对于很多应用领域来说已足够使用。对外部数据存储器的访问采用的是间接寻址方式(R0,R1和DPTR都可作为间址寄存器使用)。(www.chuimin.cn)

若系统较小,内部的RAM(30H~7FH)足够大的话就不用再扩展外部数据存储器RAM,若确实需要扩展,可以使用串行数据存储器24C系列,也可以使用并行数据存储器。

用C51编程访问外部数据存储器时需用扩展电路,扩展电路有单独的编程方法。

3.特殊功能寄存器

MCS-51单片机内的锁存器、定时器、串行口数据缓冲器,以及各种控制寄存器和状态寄存器都是以特殊功能寄存器的形式出现的,它们分散地分布在内部RAM地址空间中。表1-6列出了这些特殊功能寄存器的标识符、名称及地址,大部分特殊功能寄存器的应用将在后面详述,这里仅做简单介绍。

表1-6 特殊功能寄存器标识、名称、地址

1)累加器A

累加器ACC是最常用的特殊功能寄存器(在汇编指令中常简写为A),大部分单操作数指令的操作都取自累加器,很多双操作数指令的一个操作数也取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器A或A、B寄存器对中。指令系统中用A作为累加器的助记符。

2)B寄存器

B寄存器是乘除法指令中常用的寄存器。乘法指令的两个操作数分别取自A和B,其结果存放在A、B寄存器对中。除法指令中,被除数取自A,除数取自B,商数存放在A中,余数存放在B中。

在其他指令中,B寄存器可作为RAM中的一个单元来使用。

3)程序状态字PSW

程序状态字是一个8位寄存器,它包含了程序状态信息。此寄存器各位的含义如图1-11所示,其中PSW·1未用。其他各位的说明如下:

图1-11 程序状态字

(1)CY(PSW·7):进位标志。在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。在布尔处理机中它被认为是位累加器,其重要性相当于一般中央处理机中的累加器A。

(2)AC(PSW·6):辅助进位标志。当进行加法或减法操作而产生由低4位数(BCD码一位)向高4位数进位或借位时,AC将被硬件置位,否则就被清零。AC被用于BCD码调整。

(3)F0(PSW·5):用户标志位。F0是用户定义的一个状态标记,用软件来使它置位或清零。该标志位状态一经设定,可由软件测试F0,以控制程序的流向。

(4)RS1,RS0(PSW·4,PSW·3):寄存器区选择控制位。可以用软件来置位或清零以确定工作寄存器区。RS1,RS0与寄存器区的对应关系见表1-3。

(5)OV(PSW·2):溢出标志。当执行算术指令时,由硬件置位或清零,以指示溢出状态。

当执行加法指令ADD时,位6向位7有进位而位7不向CY进位时,或位6不向位7进位而位7向CY进位时,溢出标志OV置位,否则清零。

溢出标志常用于ADD和SUBB指令对带符号数做加减运算时,OV=1表示加减运算的结果超出了目的寄存器A所能表示的带符号数(2的补码)的范围(-128~+127)。

在MCS-51中,无符号数乘法指令MUL的执行结果也会影响溢出标志。若置于累加器A和寄存器B的两个数的乘积超过255时,OV=1,否则OV=0。此积的高8位放在B内,低8位放在A内。因此,OV=0意味着只要从A中取得乘积即可,否则要从B、A寄存器对中取得乘积。

除法指令DIV也会影响溢出标志。当除数为0时,OV=1,否则OV=0。

(6)P(PSW.0):奇偶标志,每个指令周期都由硬件来置位或清零,以表示累加器A中1的位数的奇偶数。若1的位数为奇数,P置“1”,否则P清“0”。

P标志位对串行通信中的数据传输有重要的意义,在串行通信中常用奇偶校验的办法来检验数据传输的可靠性。在发送端可根据P的值对数据的奇偶置位或清零。通信协议中规定采用奇校验的办法,则P=0时,应对数据(假定由A取得)的奇偶位置位,否则就清零。

4)栈指针SP

栈指针SP是一个8位特殊功能寄存器。它指示出堆栈顶部在内部RAM中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。考虑到08H~1FH单元分属于工作寄存器区1~3,若程序设计中要用到这些区,则最好把SP值改置为1FH或更大的值。SP的初始值越小,堆栈深度就可以越深,堆栈指针的值可以由软件改变,因此堆栈在内部RAM中的位置比较灵活。

除用软件直接改变SP值外,在执行PUSH,POP指令,各种子程序调用,中断响应,子程序返回(RET)和中断返回(RETI)等指令时,SP值将自动调整。

5)数据指针DPTR

数据指针DPTR是一个16位特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄器用DPL表示,既可以作为一个16位寄存器DPTR来处理,也可以作为两个独立的8位寄存器DPL和DPL来处理。

DPTR主要用来存放16位地址,当对64 KB外部存储器寻址时,可作为间址寄存器使用。可以用下列两条传送指令:MOVX A,@DPTR和MOVX @DPTR,A。在访问程序存储器时,DPTR可用作基址寄存器,有一条采用基址+变址寻址方式的指令MOVC A,@A+DPTR,常用于读取存放在程序存储器内的表格常数。

6)特殊功能寄存器P0,P1,P2,P3

特殊功能寄存器P0,P1,P2和P3分别是I/O端口P0~P3的锁存器。P0~P3作为特殊功能寄存器还可以用直接寻址方式参与其他操作指令,凡是地址能被8整除的特殊功能寄存器都能进行位寻址。特殊功能寄存器字节地址位地址表见表1-7。

表1-7 特殊功能寄存器字节地址位地址表

续表

7)串行数据缓冲器SBUF

串行数据缓冲器SBUF用于存放欲发送或已接收的数据,它实际上由两个独立的寄存器组成,一个是发送缓冲器,另一个是接收缓冲器。当要发送的数据传送到SBUF时,进的是发送缓冲器。当要从SBUF读数据时,则取自接收缓冲器,取走的是刚接收到的数据。

8)定时器/计数器T0,T1

MCS-51系列中有两个16位定时器/计数器T0和T1。它们各由两个独立的8位寄存器组成,共有四个独立的寄存器:TH0,TL0,TH1,TL1。可以对这四个寄存器寻址,但不能把T0,T1当作一个16位寄存器来寻址。

9)其他特殊功能寄存器

IP,IE,TMOD,TCON,SCON和PCON寄存器分别包含有中断系统、定时器/计数器、串行口和供电方式的控制和状态位,这些寄存器将在后面介绍。