基于Proteus和Keil的C51程序设计项目教程(第2版):理论、仿真、实践相融合
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.6 单片机硬件知识补充

1.6.1 存储器:永久程序和临时数据的住所

AT89C51存储器由程序存储器ROM和数据存储器RAM组成。ROM可分为片内ROM和片外ROM。片内ROM的大小为4KB,地址范围为0000H~0FFFH;片外ROM可扩展到64KB。RAM可分为片内RAM和片外RAM。片内RAM由128B(00H~7FH)的片内数据存储器和21个特殊功能寄存器(在80H~FFH中)组成。片外RAM可扩展到64KB。AT89C51程序存储器ROM的结构如图1-24所示。AT89C51数据存储器RAM的结构如图1-25所示。

图1-24 AT89C51程序存储器ROM结构

图1-25 AT89C51数据存储器RAM结构

1.程序存储器ROM

AT89C51有4KB片内ROM,用于存储(固化)编好的程序、表格、常数,所以又被简称为“程序内存”。当程序内存不够用时,可扩展片外程序存储器,最大扩展范围为0000H~FFFFH(即64KB),其结构如图1-24所示。

片内ROM、片外ROM的地址空间是统一编址的,地址范围为0000H~FFFFH,总共64KB。单片机工作时,只能读ROM,不能写ROM,所以ROM被称为只读存储器。单片机断电后,存储在ROM中的程序、表格、常数等不会消失。

ROM的地址单元0000H是特殊的地址单元。单片机复位后,程序计数器PC的内容为0000H,故系统必须从0000H单元开始取指令并执行程序。它是系统的启动地址,用户程序的第一条指令应放置在0000H单元中。

低4KB地址的程序可存储在片内Flash ROM中,也可存储在片外ROM中。片外ROM的低4KB地址与片内ROM重叠,执行选择由引脚来控制。=0(低电平),复位后,系统从片外ROM中的0000H地址单元开始执行程序,且只能执行片外ROM中的程序。=1(高电平),复位后,从片内ROM的0000H地址单元开始执行程序,当PC值大于0FFFH(4KB)时,系统自动转到片外ROM中执行程序。

ROM内还有5个特殊的地址,是单片机的5个中断服务子程序的入口地址(见表1-3),相邻中断入口地址间的间隔为8个单元。当程序中使用中断时,一般在这些入口地址处存放一条跳转指令,而相应的中断服务程序存放于转移地址中。如果中断服务子程序小于等于8个单元,则可将其存储在相应入口地址开始的8个单元中。如果没有用到中断功能,这些单元也可作为一般用途的程序存储器。

表1-3 各种中断服务子程序的入口地址

2.数据存储器RAM

(1)片内数据存储器

AT89C51片内数据存储器RAM容量为128B,地址范围为00H~7FH,使用时可分为4个区,即工作寄存器区、可位寻址区、数据缓冲区和堆栈区。堆栈区的栈底地址复位后默认为07H,可编程改变。AT89C51片内数据存储器的大致结构如图1-26所示。

① 工作寄存器区。

片内数据存储器RAM中地址最低的32个单元(00H~1FH)是工作寄存器区,按地址由小到大分为4个组,即0组、1组、2组、3组,如图1-26所示。每个组有8个8位寄存器,地址由低到高依次命名为R0~R7。当前工作寄存器只能有一个组,至于选用哪个工作寄存器组,由PSW中的RS0和RS1位确定,可由指令设置。复位初始化值RS0=0、RS1=0,使用的是0组,为默认的工作寄存器组。

在程序不太复杂的情况下,一般只使用工作寄存器0组,不使用的另外三个组可做他用。

② 可位寻址区。

工作寄存器区上面的16个单元(20H~2FH)构成固定的可位寻址存储区。每个单元有8位,16个单元共128位,每个位都有一个位地址,如图1-26所示。它们可位寻址、位操作,即可对该位进行置1、清0、求反操作等。在AT89C51单片机的指令系统中,有位操作指令。

图1-26 AT89C51片内数据存储器的大致结构

需要指出的是,位地址00H~7FH和片内RAM中字节地址00H~7FH的编码表示相同;但要注意它们之间的区别,位操作指令中的地址是位地址,而不是字节地址。若程序中没有位操作,则该区的地址单元可做他用。

③ 数据缓冲区。

片内数据存储器RAM中,30H~7FH地址单元一般可用作数据缓冲区,用于存放各种数据和中间结果,起到数据缓冲的作用;但要注意,没有使用的工作寄存器单元和没有使用的可位寻址单元都可用作数据缓冲区。

④ 堆栈区。

堆栈区简称堆栈,是在片内数据存储器RAM中开辟的一片特殊数据存储区,是CPU用于暂时存放数据的特殊“仓库”。用堆栈指针SP指向堆栈栈顶地址,堆栈的最低地址叫栈底。其特殊在于,栈底可根据片内数据存储器的使用情况由指令设定;对堆栈存取数据遵守“先进后出”原则,在此过程中堆栈栈顶地址也相应变化,即SP的内容相应变化。复位后,栈底的地址单元为07H,由于此时堆栈内还未存放数据,指示栈顶的堆栈指针SP的内容与栈底值同为07H,即(SP)=07。设计者也可根据需要设置SP的初值。

(2)特殊功能寄存器(SFR)

特殊功能寄存器(SFR,也称专用寄存器)是单片机各功能部件所对应的寄存器,是用来存放相应功能部件的控制命令、状态或数据的区域。AT89C51内的端口锁存器、程序状态字、定时器、累加器、堆栈指针、数据指针,以及其他控制寄存器等都是特殊功能寄存器。它们离散地分布在片内RAM的高128B(80H~FFH)中,共21字节,其分配情况见表1-4。其中有些寄存器既可字节寻址又可位寻址,有些只可字节寻址。凡是地址能被8整除(字节末位为0H或8H)的特殊功能寄存器都是既可字节寻址又可位寻址的特殊功能寄存器,否则,只能按字节寻址。可位寻址的特殊功能寄存器的每一位都有位地址,有的还有位名称、位编号。有的SFR有位名称,却无位地址,也不可以进行位寻址、位操作,如TMOD。不可位寻址操作的SFR只有字节地址,无位地址,如SBUF。

表1-4 特殊功能寄存器(SFR)

① 累加器ACC(Accumulator)。

累加器助记符(帮助记忆的符号)为A,是一个最为常用的特殊功能寄存器。许多指令的操作数取自于它,许多运算的结果存放在其中。

② 通用寄存器B(General Purpose Register)。

通用寄存器B是乘除法指令中要用的通用寄存器,也可做一般寄存器用。

③ 程序状态字PSW(Program Status Word)。

程序状态字是一个8位的标志寄存器,用来存放指令执行后的有关状态。PSW的各位定义见表1-5。

表1-5 PSW的各位定义

● 进位标志C(Carry,也可用Cy表示),用于表示加减运算过程中累加器最高位有无进位或借位。在加法运算时,若累加器最高位有进位,则C=1,否则C=0。在减法运算时,若累加器最高位有借位,则C=1。此外,CPU在进行移位操作时也会影响这个标志位。在布尔(位)处理机中,它被认为是位累加器,其重要性相当于CPU中的A。

● 辅助进位AC(Auxiliary Carry),加减运算时低4位向高4位进位或借位,AC置1,否则置0。

● 用户标志位F0,这是一个供用户定义的标志位。

● RS1和RS0是工作寄存器组选择位,见表1-6。RS1和RS0用于设定当前使用的工作寄存器的组号。复位后,RS1和RS0初始化值为0,即选择的是0组。此时,R0~R7的地址分别为00H、01H、02H、03H、04H、05H、06H、07H。

表1-6 RS1、RS0对工作寄存器组的选择

● 溢出标志OV(Overflow),可以指示运算过程中是否发生了溢出,在执行过程中其状态自动形成。

● 未定义位。用户不能使用。

● 奇偶标志P(Parity),奇偶标志位。表明累加器A(用二进制数表示)中“1”的个数的奇偶性,奇数个置1,偶数个置0。

④ 堆栈指针SP(Stack Pointer)。

堆栈是在片内数据存储器RAM区中开辟的一片特殊数据存储区。系统复位后,堆栈指针SP初始化值为07H,使堆栈存放数据地址由08H开始。由于08H~1FH单元分属于工作寄存器组1~组3。若程序设计中这些组全要用到,则要把SP的值设置为1FH或更大的值。当单片机调用子程序或响应中断时,将自动发生数据的入栈、出栈操作。除此之外,还有对堆栈进行操作的指令,可参阅本书项目3。

⑤ 数据指针DPTR(Data Pointer)。

DPTR是一个16位特殊功能寄存器,由两个8位寄存器DPH(高8位)和DPL(低8位)组成。DPTR既可作为一个16位寄存器来处理,也可作为两个独立的8位寄存器DPH和DPL来处理。DPTR主要用来存放16位地址。

⑥ 串行数据缓冲器SBUF。

串行通信都是通过数据缓冲器SBUF发送和接收的。实际上,SBUF有两个独立的寄存器,一个是发送缓冲器,另一个是接收缓冲器。

⑦ 定时器/计数器寄存器。

两对寄存器(TH0,TL0)、(TH1,TL1)分别为定时器/计数器T0、T1的16位计数寄存器,它们也可单独作为4个8位的计数寄存器用。

(3)片外数据存储器RAM

若片内RAM不够用时,可扩展片外数据存储器RAM,最大范围为0000H~FFFFH,共64KB。从图1-25可以看出片外RAM有部分地址(00H~FFH)与片内RAM是重叠的。汇编语言中,片内RAM、片外RAM以不同的指令操作码区别,片内RAM指令用MOV表示,片外RAM指令用MOVX表示。

1.6.2 I/O(输入/输出)口结构、功能

1.I/O口结构

AT89C51单片机有4个并行双向8位I/O输出口,即P0~P3。每个口都有8根I/O引脚,总共有32根引脚。每个口都有一个锁存器,依次对应地址为80H、90H、A0H、B0H等4个特殊功能寄存器。它们的结构有同有异,功能与用途也有同有异。

每个I/O口可以进行“字节”输入/输出,也可进行“位”输入/输出。对各I/O口进行读、写操作,即可实现单片机的输入、输出功能。

每个I/O口的8个位的结构是相同的,所以,每个I/O口的结构与功能均以其位结构进行讨论。

P1、P3、P2、P0口的位结构如图1-27~图1-30所示,都含有锁存器、输入缓冲器1(读锁存器)、输入缓冲器2(读引脚)和组成输出驱动器的FET晶体管Q0。其中P1只用作通用I/O口,所以结构最简单。P3、P2、P0除用作通用I/O口外还另有功能,所以结构比P1复杂,且彼此间也有差别。还要注意:P1、P3、P2口都有内部上拉电阻,而P0口无内部上拉电阻。

图1-27 P1口的位结构

2.I/O口功能

(1)P1口

P1口只有通用输出/输入功能(见图1-27)。

① 输出。

内部总线输出0时,D=0,Q=0,=1,Q0导通,A点被下拉为低电平,即输出为0;内部总线输出1时,D=1,Q=1,=0,Q0截止,A点被上拉为高电平,即输出为1。

例如,将立即数55H传送(即输出)到P1口。C51语言指令为

② 输入(读引脚)。

AT89C51输入即读,为读入正确的引脚信号,必须先保证Q0截止。因为,若Q0导通,引脚A点为低电平,显然,从引脚输入的任何外部信号都被Q0强迫短路,严重时可能导致大电流,而烧坏元器件。为保证Q0截止,必须先向锁存器写“1”,即D=1,=0,Q0截止。外接电路信号(即输入信号)为1时,引脚A点为高电平;输入信号为0时,引脚A点为低电平。这样才能保证单片机从P1口引脚输入的电平与外电路接入引脚电平一致。

例如,使用C51语言输入指令“X=P1”时,应先使锁存器置1(即通常所说的置端口为输入方式),再把P1口的数据读入变量X中。程序设计如下:

③ 输入(读锁存器)。

从图1-27可看出,还有一种输入为读锁存器。这是为了适应“读—修改—写”类型指令。这些指令是ORL、XRL、JBC、CPL、INC、DEC、DJNZ、MOV PX.Y,C、CLR PX.Y和SET PX.Y。指令中PX.Y表示P1.0~P1.7、P2.0~P2.7、P3.0~P3.7、P0.0~P0.7。

(2)P3口

P3口除有通用输出输入功能外,还有第二功能(见表1-7)。

表1-7 P3口引脚的第二功能说明

① 通用I/O。

● 输出:图1-28中“第二输出功能”端B为高电平。经分析可知,尽管P3口的结构与P1口略有差别,但输出操作,P3口的功能与P1口类同。

图1-28 P3口的位结构

● 输入(读引脚):读操作时,“第二输出功能”端B为高电平,缓冲器0开通。尽管P3口的结构与P1口略有差别,但读操作时,它们的功能和操作类同,也要先进行写“1”操作。

● 输入(读锁存器):类同P1。

② 第二功能。

当P3口的某位要用作第二功能输出口时,该位锁存器置1,Q=1。与非门的输出状态取决于该位的“第二输出功能”端B的状态。B点状态经与非门、Q0后出现在引脚上,A点与B点的状态一致,P3口的该位工作于第二功能输出状态。若“第二输出功能”端B为0时,因Q=1,与非门输出为C=1,Q0导通,从而使A=0,引脚上为低电平。若“第二输出功能”端B为1时,与非门输出为C=0,Q0截止,从而使A上拉为高电平,即引脚上为高电平。

当P3口某位要用作第二输入功能口时,该位的“第二输出功能”端B和该位“锁存器”都为1,Q0截止,缓冲器2关闭。该个引脚上的信号通过缓冲器0送入“第二功能输入”端。

(3)P2口

P2口除有通用输出输入功能外,当有外部扩展时作为地址总线的高8位输出(见图1-29)。

图1-29 P2口的位结构

① 通用I/O。

● 输出:输出操作时,图1-29中的多路选择开关在内部控制信号作用下连接C端反相器输出为锁存器输出取反。经分析可知,尽管P2口的结构与P1口略有差别,但输出操作时,P2口的功能与P1口类同。

● 输入(读引脚):读操作时,图1-29中的多路选择开关在内部控制信号作用下连接C端反相器输出为锁存器输出取反。经分析可知,尽管P2口的结构与P1口略有差别,但读操作时,P2口的功能与P1口类同,也要先进行写“1”操作。

● 输入(读锁存器):类同P1。

② 地址总线的高8位输出(多路选择开关与地址线接通)。

当P2口某位要用作地址总线的高8位中的某位输出时,多路选择开关在内部控制信号作用下,连接B端,反相器的输出状态取决于B的状态。B点状态经多路选择开关、反相器、Q0后,出现在引脚上。经分析可知,A点与B点的状态一致时,P2口工作于地址总线的高8位输出状态。

P2口输出的高8位地址可以是片外ROM、片外RAM的高8位地址,与P0口输出的低8位地址共同构成16位地址线,从而可分别寻址64KB的程序存储器和片外数据存储器。地址线以字节为操作单位,8位一起输出,不能进行位操作。

如果AT89C51单片机有扩展程序存储器(地址≥1000H),访问片外ROM的操作连续不断,P2口要不断送出高8位地址,P2口就不宜再用作通用I/O口。

(4)P0口

P0口除有通用输出输入功能外,当有外部扩展时用作地址(低8位输出)/数据线(见图1-30)。

图1-30 P0口的位结构

① 通用I/O。

● 输出:输出操作时,“多路选择开关”在内部控制信号作用下,连接C端(见图1-30),锁存器输出通过多路选择开关与Q0相通;同时内部信号使与门控制输入端2置0,从而导致与门输出为0,Q1截止,输出驱动器处于开漏状态。经分析可知,只要外接一个上拉电阻,输出操作时,P0口的功能与P1口类同。

● 输入(读引脚):读操作(多路选择开关接通锁存器,控制信号置0)。读操作时,多路选择开关在内部控制信号作用下,连接C端(见图1-30),锁存器输出通过多路选择开关与Q0相通;同时内部信号使与门输入端2为0,从而导致与门输出为0,Q1截止,输出驱动器处于开漏状态。所以要外接一个上拉电阻,读操作时,P0口的功能与P1口类同,也要先进行写“1”操作。

● 输入(读锁存器):类同P1口。

② 用作地址(低8位)/数据线。

用作地址/数据线时,内部控制信号端置1,同时MUX与B端相连,Q1的输入信号就是地址/数据线信号,Q0的输入信号就是地址/数据线信号取反后的信号。A点的信号与地址/数据线信号一致,引脚输出地址/数据信息。

注意:用作地址/数据总线时,P0口不能进行位操作,也不外接上拉电阻;用作通用I/O口时,输出驱动器是开漏电路,须外接上拉电阻。

1.6.3 I/O口的负载能力

1.I/O口的位(引脚)驱动能力

P0口的每一位以吸收电流方式驱动8个LS TTL输入,约2.88mA。

P1~P3口的每一位以吸收或提供电流方式驱动4个LS TTL输入。

1个LS TTL输入:高电平时为20μA(提供电流),低电平时为0.36mA(吸收电流,俗称灌电流)。可见,P0~P3口每一个引脚输出低电平的驱动能力:输出高电平的驱动能力=0.36mA×n/20μA×n≈18。

2.稳定状态下,IOL(引脚吸收电流)的严格限制

每个引脚上的最大IOL=10mA。

P0端口8个引脚的最大∑ IOL=26mA。

P1、P2、P3端口8个引脚的最大∑ IOL=15mA。

所有输出引脚上的IOL总和最大为∑ IOL=71mA。

1.6.4 STC89系列单片机新增资源及I/O口驱动能力举例

1.新增资源

STC单片机12T的STC89C51RC/RD系列架构如图1-31所示。相比AT89C51系列单片机,STC89C51RC/RD多了T2、P4、E2PROM、看门狗、A/D等资源,不同型号资源可能不一样,请查相应手册。新增的引脚在非DIP40封装的芯片中可见,如图1-32所示。STC部分型号单片机的资源见表1-8所示。因STC提供了不同存储容量的型号,用户根据需要选择合适的型号,而不用再考虑外部存储器扩展。

图1-31 STC89C51RC/RD系列架构

图1-32 STC89C51RC/RD系列单片机的LQFQ-44、PQFQ-44封装下的引脚布局图

表1-8 STC部分型号单片机的资源情况

(1)增强型8051单片机,6时钟/机器周期和12时钟/机器周期任意选择,指令代码安全兼容传统8051。

(2)工作电压:5.5~3.3V(5V单片机)/3.8~2.0V(3V单片机)。

(3)工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。

(4)用户应用程序空间4KB/8KB/13KB/16KB/32KB/64KB。

(5)片上集成1280B/512B RAM。

(6)通用I/O口(35/39个):复位后,P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口);P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

(7)ISP(在系统可编程)/IAP(在应用可编程):无须专用编程器,无须专用仿真器。可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。

(8)有EEPROM功能。

(9)有看门狗功能。

(10)内部集成MAX810专用复位电路(HD版本和90C版本才有),外部晶振20MHz以下时可省去复位电路。

(11)共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用。

(12)外部中断4路,下降沿中断或低电平触发中断。Power Down模式可由外部中断低电平触发中断方式唤醒。

(13)通用异步串行接口(UART),还可用定时器软件实现多个UART。

(14)工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)

(15)封装:LQFP-44、PDIP-40、PLCC-44、PQFP-44。如选择STC89系列,请优先选择LQFP-44封装。

提示:推荐优先选择采用最新第六代加密技术的STC11/10xx系列单片机取代已被全球各厂家均解密的89系列单片机。

2.STC89C51RC/RD系列单片机I/O口驱动能力

STC89C51RC/RD系列单片机所有I/O口均(新增P4口)有3种工作类型:准双向口/弱上拉(标准8051输出模式)、仅为输入(高阻)或开漏输出功能。P1/P2/P3/P4上电复位后为准双向口/弱上拉(传统8051的I/O口)模式。P0口上电复位后是开漏输出:作为I/O口用时,需加4.7~10kΩ上拉电阻;作为总线扩展用时,不用加上拉电阻。5V单片机的P0口的灌电流为8~12mA,其他I/O口的灌电流为4~6mA,见表1-9,是AT89C51单片机的3倍多。

STC89LE51RC/RD的3V单片机的P0口的灌电流最大为8mA,其他I/O口的灌电流最大为4mA。

当单片机工作在掉电模式时,典型功耗<0.1μA;掉电模式可以外部中断唤醒,适用于电池供电系统,如水表、气表、便携设备等。

表1-9 STC89C51RC/RD系列单片机直流特性表