电子工程师提升计划第2章:深入探讨单片机硬件原理【1.4】
2.5.3 数据存储器
数据存储器(RAM)用来存放数据和运算结果等信息。与程序存储器一样,单片机除了可以使用内部数据存储器外,也可以使用外部数据存储器。
MCS-51系列单片机的内部数据存储器有256B的存储空间(即有256个存储单元,每个单元存储1B数据),地址编号为00H~FFH(也可用0000H~00FFH表示);外部数据存储器地址编号为0000H~FFFFH,有64KB的存储空间。外部数据存储器最开始的一段地址(0000H~00FFH)与内部数据存储器相同,对于相同的地址,单片机是通过不同的指令来区分的。MCS-51 系列单片机数据存储器的地址编号如图2-13所示。
从图2-13中可以看出,内部数据存储器分为4个区:工作寄存器区、位寻址区、数据缓存区和特殊功能寄存器区。前3个区的详细结构如图2-14所示。
1.工作寄存器区
工作寄存器区的地址编号为00H~1FH,该区域又分为4组(0~3组),每组有8个存储单元,都用R0~R7表示。单片机在工作时,在同一时间内这4组寄存器中只能有 1 组工作,到底是哪一组寄存器工作由特殊功能寄存器区内的程序状态字寄存器(PSW)中的RS1位和RS0位的状态决定,默认为0组工作,具体见表2-2。
表2-2 工作寄存器与RS1、RS0的关系
例如,当寄存器中的RS1=0、RS0=1时,1组(08H~0FH)寄存器处于工作状态。
2.位寻址区
位寻址区的地址编号为20H~2FH,该区域有16个存储单元,在该区域既可以对某个存储单元进行字节操作,也可以用位操作指令对某个存储单元进行位操作。下面以图2-15为例来说明字节操作和位操作的过程。
在进行字节操作时,用字节操作指令选中编址为24H的存储单元,然后可以将1B的数据存入该单元,或从该单元取出。图2-15(a)中是将1B的数据11011001存入编址为24H的存储单元。
在进行位操作时,用位操作指令选中编址24H,该24H是一个位地址,在图中它是字节地址24H的第4位,该地址存储了一位数“0”,如果要将该位转换成“1”,可用位操作指令选中位地址24H,然后将“1”存入该位,该位就变为“1”,整个字节就变为11011001。
单片机在工作时,是通过程序指令区分地址是字节地址还是位地址的,有关的指令知识将在后续章节介绍。地址编号为20H~2FH的位寻址区有16个存储单元,每个单元有8位,共有128位,这128位的位地址见表2-3。
表2-3 片内数据存储器中位寻址区的位地址
3.数据缓存区
数据缓存区又称用户数据区,或称作内部RAM区,它的地址编号为30H~7FH。该区域一般用来存储随机数据和运算中间结果等。
4.特殊功能寄存器区
特殊功能寄存器(SFR)区内是一些具有特殊功能的存储单元,地址编号是 80H~FFH。特殊功能寄存器区中各个寄存器的地址分布见表2-4。
表2-4 特殊功能寄存器中各个寄存器的地址分布
从表2-4中可以看出,特殊功能寄存器区有21个特殊的寄存器,每个寄存器都有一个地址,如寄存器A(累加器)的地址是E0H,寄存器PCON的地址是87H,各寄存器的地址很多是不连续的,第1列的寄存器还具有位寻址功能。特殊功能寄存器区有128个存储单元(80H~FFH),而真正定义的只有21个单元,对于未定义的单元用户不可使用。
21个特殊功能寄存器的名称、位地址和复位初值见表2-5。表2-5 MCS-51系列单片机内21个特殊功能寄存器的名称、位地址和复位初值
由于表2-5所列的特殊功能寄存器非常重要,下面先简单介绍一下其中一些常用寄存器的功能,在以后的学习中将逐步深入说明。
(1)累加器A
累加器A的地址是E0H,它是单片机内应用最多的寄存器。
(2)寄存器B
寄存器B的地址是F0H,它主要用于乘、除运算。
(3)程序状态字寄存器(PSW)
程序状态字寄存器(PSW)的地址是 D0H,它是一个状态指示寄存器(又称标志寄存器),用来指示系统的工作状态。PSW是一个8位寄存器,可以存储8位数值,每位数值代表不同的功能。PSW各位的功能如下。
D7位(CY):进位标志位。在单片机进行加法运算时,如果相加有进位时CY=1,无进位时CY=0;在进行减法运算时,当有借位时CY=1,无借位时CY=0。
D6位(AC):辅助进位标志位。在进行加、减运算时,低4位向高4位有进位或借位时,AC=1,否则AC=0。
D5位(F0):用户可自定义的程序标志位。可用软件对该位置“1”或置“0”。
D4位(RS1)、D3位(RS0):工作寄存器选择位。这两位用来控制工作寄存器区(00H~1FH) 4组中的某一组寄存器进入工作状态,
具体见表2-2。
D2 位(OV):溢出标志位。在进行有符号数运算时,如果运算结果不在-128~+127 范围内, OV=1,否则OV=0。D1位:保留位,该位不可使用。
D0位(P):奇偶校验位。该位用于对累加器A中的数据进行奇偶校验,当累加器A中“1”的个数为奇数个时,P=1;为偶数个时,P=0。MCS-51系列单片机总是保持累加器A与P中“1”的总个数为偶数,例如累加器A中“1”的个数为奇数个,那么P要为“1”,这样才能让两者“1”的总个数为偶数,这种校验方式称作偶校验。
(4)数据指针寄存器(DPTR)
数据指针寄存器(DPTR)是一个16位寄存器,由DPH和DPL两个8位寄存器组成,地址分别是83H、82H,用它可以访问单片机外部数据存储器中的数据。
(5)堆栈指针寄存器(SP)
人们在日常洗碗碟时,通常是将洗完的碗碟一只一只由下往上堆起来,使用时则是将碗碟从上往下一只一只取走。这个过程有两个要点:一是这些碗碟的堆放是连续的;二是先堆放的后取走,后堆放的先取走。
单片机中的堆栈与上述情况类似。堆栈是指在单片机数据存储器中划分出的一个连续的存储空间,这个存储空间存取数据时具有“先进后出,后进先出”的特点。
在存储器存取数据时,首先由系统给出地址选中某个单元,再将数据存入或取出。如果有一批数据要连续存入存储器,例如将一批5组数据依次存入地址为30H~34H的存储单元中,按一般的方法系统先给出地址30H,选中地址为30H的存储单元,再将第1组数据存入该单元,然后给出地址31H,选中地址为31H的存储单元,再将第2组数据存入该单元……显然这样存取数据比较麻烦,采用堆栈可以很好地解决这个问题。
在数据存储器中划分堆栈的方法是:通过编程的方法设置堆栈指针寄存器(SP)的值,如让SP=2FH,堆栈指针寄存器就将存储器的2FH 单元设置为堆栈的栈顶地址,2FH 单元后面的连续存储单元就构成了堆栈,如图2-16所示。堆栈设置好后,就可以将数据依次存入堆栈或从堆栈中取出,在堆栈中存取数据按照“先进后出,后进先出”的规则进行。
需要注意的是,堆栈指针寄存器中的值并不是堆栈的第1个存储单元的地址,而是前一个单元的地址,例如SP=2FH,那么堆栈的第1个存储单元的地址是30H,第1组数据存入30H单元中。
在单片机通电复位后,堆栈指针寄存器的初始值为07H,这样堆栈第1个存储单元的地址就为08H。由于08H~1FH地址已划分给1~3组工作寄存器,在需要用到堆栈时,通常通过编程将堆栈设置在30H~7FH的数据缓存区(只要将堆栈指针寄存器的值设为2FH即可)。
第3章 单片机的开发过程
单片机开发与普通电路开发不同,普通电路只要进行硬件开发后功能就基本固定不变了;而单片机开发包括硬件开发和软件开发,硬件开发完成后单片机还不能工作,还需要向单片机内写入程序,写入的程序不同,单片机实现的功能就会不同。
开发一个单片机应用系统前,首先要明确单片机开发需要实现什么功能,根据需要完成的功能选择单片机并设计单片机外围电路,然后编写程序,再编译、仿真和调试程序,如果程序正确无误,就可以通过编程器将程序写入单片机,最后将写入程序的单片机安装在之前设计好的电路中,单片机就能在内部程序的控制下,通过外围电路完成相应的功能。单片机应用系统的开发过程如图3-1所示。
3.1 单片机的硬件开发过程
在进行单片机应用系统开发时,一般先进行硬件开发,再进行软件开发。单片机的硬件开发一般可按下面几个步骤进行。
3.1.1 明确单片机应用系统要实现的功能
在进行单片机开发时,一定要明确开发出来的单片机应用系统需要实现什么样的功能,之后的硬件、软件设计都要围绕着单片机要实现的功能进行。
例如,要开发一个控制发光二极管亮灭的单片机应用系统,具体功能要求如下。
① 采用4个开关控制4只发光二极管。
② 按下某个开关,相应的发光二极管会发光;松开开关,发光二极管会熄灭。
③ 同时按下4个开关,4只发光二极管都亮。
3.1.2 选择单片机型号
明确单片机应用系统要实现的功能后,再选择单片机的种类和型号。单片机的种类很多,如PIC系列单片机、MCS-51 系列单片机等,这些单片机又有很多型号,不同型号的单片机结构和功能有所不同,编程时软件指令也有所不同。在选择单片机型号时,一般应注意以下两点。
① 在功能够用的情况下,考虑性能价格比。有些型号的单片机功能强大,但相应的价格也较高,而选择单片机型号时功能足够即可,不要盲目选用功能强大的单片机。
② 选择自己熟悉的单片机。不同系列的单片机内部硬件结构和软件指令或多或少有些不同,而选择自己熟悉的单片机可以提高开发效率,缩短开发时间。
这里选择Atmel公司的AT89S51型号的单片机,选择的理由除了AT89S51单片机与8051单片机完全兼容(引脚数及功能相同,软件指令也相同,内部结构基本相同)外,AT89S51单片机在市场上也比较容易获得(8051已不生产),另外AT89S51单片机内部的程序存储器采用可反复擦写的EEPROM,这样有利于反复修改程序,而8051单片机内部的程序存储器只能写一次。
3.1.3 设计单片机外围电路
单片机的外围电路主要有基本工作条件电路、输入电路和输出电路。根据单片机要实现的功能设计出来的单片机外围电路如图3-2所示。
(1)基本工作条件电路
单片机的VCC电源引脚接+5V电源,C3、R5构成复位电路,晶振X和电容C1、C2与内部电路构成时钟电路,这些电路分别为单片机提供电源、复位信号和时钟信号,单片机即开始工作。
(2)输入电路
按键 S1~S4 构成输入电路。当按下某按键时,单片机相应的输入引脚为低电平;当按键弹起时,相应的输入引脚为高电平。
(3)输出电路
发光二极管VD1~VD4和电阻R1~R4构成单片机的输出电路,其中R1~R4为限流电阻,用于防止流过发光二极管的电流过大而损坏发光二极管。当单片机的某个输出引脚为低电平或高电平时,该引脚外接的发光二极管就会亮或灭。
单片机外围电路设计好后,可以将这些电路做在一块电路板上,为了方便之后的单片机软件开发,可在安装单片机的位置处安装一个40引脚的插座,这样在仿真、编程时可使单片机容易插入和取出。这样制作出来的电路板常称作实验板。
3.2 单片机的软件开发过程
单片机软件开发过程是先编写程序,再编译、仿真和调试程序,然后用编程器将程序写入单片机。这几个过程可以分别用几个软件完成,也可以在一个软件中完成。现在很多单片机开发人员都采用Keil公司开发的KeilC51软件来编写、编译、仿真和调试程序。
3.2.1 编写程序
在编写程序前,需要先安装 KeilC51 软件,然后在该软件中建立项目和源程序文件,再在源程序文件中编写程序。
1.KeilC51软件的获取与安装
KeilC51软件是德国Keil公司开发的51系列单片机编程软件,在该软件中,用户可用汇编语言或C语言编写程序,然后对程序进行编译、仿真和调试。
如果读者需要该软件,可到Keil公司网站http://www. Keil.com下载Eval(评估)版本,也可登录易天教学网(www.eTV100.com)下载。下载该软件后获得的是一个压缩包,解压后运行SETUP文件夹中的Setup.exe文件,即开始安装软件。在安装时,首先会出现图3-3所示的对话框,如果不是商业用户,单击“Eval Version”(评估版本)按钮,软件即开始安装,后面的安装过程与一般的软件安装过程相同,这里不再赘述(注:评估版本软件对编写的程序要求不能大于2KB,其他与商业版软件相同。对于初学者来说, KeilC51评估版本基本够用)。
2.新建项目和源程序文件
KeilC51 软件安装完成后,双击桌面上的“Keil μVision2”图标,或单击桌面左下角的“开始”按钮,在弹出的菜单中选择“程序”→“Keil μVision2”命令,就可以启动 Keil μVision2,进入图3-4所示的“μVision2”软件窗口。
(1)新建项目
在进行单片机程序开发时,为了便于管理,需要先在“μVision2”中建立一个项目,然后在该项目中编写、仿真和调试程序。新建项目的操作过程如下。
① 选择“Project”→“New Project”菜单命令,如图3-5所示,立刻弹出图3-6所示的“Create New Project”(建立新项目)对话框。
② 在“Create New Project”对话框中选择文件保存的位置,再输入项目文件名“test1”,文件的默认扩展名(类型)为“.uv2”,然后单击“保存”按钮,立刻弹出图3-7所示的对话框,要求选择为哪
种型号的单片机编写程序。
作者:BinaryStarXin