1.2 AT89S51单片机结构
1.2.1 AT89S51单片机内部结构及引脚功能
1.AT89S51内部结构
AT89S51单片机芯片内除了有CPU、存储器、I/O端口外,还包括定时器/计数器、中断系统、时钟电路等。AT89S51单片机内部结构如图1-2所示。
由图1-2可知,AT89S51单片机由以下部分组成。
●一个以ALU为中心的8位微处理器(CPU),完成运算和控制功能。
●4KBFlash片内程序存储器(ROM),用来存储程序、原始数据、表格等。
●片内低128B的数据存储器(RAM),其地址范围为00H~7FH。
●片内26个特殊功能寄存器(SFR),离散分布于地址80H~FFH中。
●4个8位并行I/O接口(P0~P3)。
●1个全双工异步串行口。
●2个16位定时器/计数器。
●5个中断源,2个中断优先级。
●一个片内振荡器和时钟电路。
●程序计数器PC,是一个独立的16位专用寄存器,其内容为将要执行的指令地址。
●看门狗(WDT)电路。
2.AT89S51单片机的信号引脚
AT89S51的引脚结构有双列直插封装(PDIP形式)和方形封装(PLCC、TQFP形式),其引脚排列如图1-3所示。
图1-2 AT89S51单片机内部结构图
图1-3 AT89S51封装引脚图
图1-3 AT89S51封装引脚图(续)
这里仅介绍PDIP40封装,其引脚按其功能可分为电源、时钟、控制和I/O接口4大部分。
(1)电源引脚VCC和GND
①VCC(40脚):接+5V电源。
②GND(20脚):接地。
(2)时钟电路引脚XTALl和XTAL2
①XTALl(19脚):接外部石英晶振和微调电容一端。在片内,它是振荡器倒相放大器的输入。若使用外部时钟时,该引脚必须接地。
②XTAL2(18脚):接外部石英晶振和微调电容的另一端。在片内,它是振荡器倒相放大器的输出。若使用外部时钟时,该引脚作为外部时钟的输入端。
(3)控制引脚RST/VPD、和
①RST/VPD(9脚):复位信号输入端,高电平有效。在此输入端保持2个机器周期的高电平后,就可以完成复位操作。在单片机正常工作时,此引脚应为低电平。VCC掉电期间,该引脚可接上备用电源(VPD)以保持内部RAM的数据。
②(29脚):程序存储允许输出端,是片外程序存储器的读选通信号,低电平有效。CPU从外部程序存储器读取指令时,在每个机器周期中两次有效,但在访问片外存储器或访问内部程序存储器读取指令时,无效。此引脚接外部ROM的输出允许)端。
③(30脚):访问地址锁存控制信号/编程脉冲输入端。在扩展系统时,ALE用于把P0口输出的低8位地址锁存起来,以实现低8位地址和数据的隔离。P0口作为数据地址复用口线,当访问单片机外部程序、数据存储器或外接I/O口时,ALE输出脉冲的下降沿用于低8位地址的锁存信号;即使不访问单片机外部程序、数据存储器或外接I/O口,ALE端口仍然以晶振频率的1/6输出正脉冲信号,因此可作为外部时钟或外部定时信号使用。但应注意,此时不能访问单片机外部程序、数据存储器或外设I/O接口。ALE端可以驱动8个TTL负载。在对Flash存储器编程期间,该引脚用来输入一个编程脉冲。
④(31脚):访问程序存储器控制信号/编程电源输入端。当该引脚信号为低电平时,无论片内是否有程序存储器,只访问片外程序存储器;当该引脚为高电平时,单片机访问片内的程序存储器。但对AT89S51来说,当程序计数器(PC)值超出4KB地址时,自动转到片外程序存储器1000H开始顺序读取指令。在Flash编程期间,该引脚用于施加+12V的编程电压(VPP)。
(4)I/O接口引脚(32个,分成4个8位并行口)
①P0.0~P0.7(P0口):通用I/O口引脚或低8位地址总线复用引脚。在Flash编程时,P0口作为原码输入口,当Flash进行校验时,P0输出原码,此时P0外部必须被拉高。
②P1.0~P1.7(P1口):通用I/O口引脚。在Flash编程和校验时,P1口接收低8位地址。
③P2.0~P2.7(P2口):通用I/O口引脚或高8位地址总线引脚。P2口在Flash编程和校验时接收高8位地址信号和控制信号。
④P3.0~P3.7(P3口):一般I/O口引脚或第二功能引脚。P3口同时为闪烁编程和编程校验接收一些控制信号。
1.2.2 AT89S51单片机的存储器结构
存储器功能用于存储程序和数据。存储器按其存取方式可以分成两大类,一类是随机存取存储器(RAM);另一类是只读存储器(ROM)。
1.程序存储器ROM
AT89S51片内有4KB的FlashROM,用于存放用户的目标程序和表格常数,所以又简称“程序内存”。当程序内存不够用时,可扩展片外ROM,最大扩展范围为0000H~FFFFH(即64KB),其配置如图1-4(a)所示。
图1-4 AT89S51程序存储器配置
低4KB地址的程序可以存储在片内FlashROM中,也可以存储在片外ROM中。片内ROM与片外ROM低4KB的地址重叠,执行选择由引脚来控制。当引脚信号为低电平,复位后,单片机从片外ROM中的0000H地址单元开始执行程序。当为高电平,复位后,单片机从片内ROM中的0000H地址单元开始执行程序,当PC值大于0FFFH(4KB)时,系统自动转到片外ROM中执行程序。
程序存储器低端的一些地址被固定作为特定的入口地址,见图1-4(b)。是单片机的5个中断服务子程序的入口地址,相邻中断入口地址间的间隔为8B,如表1-2所示。
表1-2 各种中断服务子程序的入口地址
编程序时一般在这些入口地址开始的单元中存放一条转移指令,转移到相应的中断服务程序处。如果中断服务程序少于8B,可以将中断服务程序直接存放到相应入口地址开始的几个单元中。如果没有用到中断功能,那么这些单元也可作为一般用途的程序存储器。
2.数据存储器RAM
数据存储器分为片外RAM和片内RAM。片外RAM最大可扩展64KB,地址范围为0000~FFFFH;片内RAM可分为两个不同的存储空间,即低128B单元的数据存储器空间和高128B单元的特殊功能寄存器SFR的存储器空间。对于增强型单片机,数据存储器容量为256B,其结构如图1-5所示。
图1-5 AT89S51数据存储器结构
(1)片内RAM低128B单元
片内RAM低128B单元分为工作寄存器区、位寻址区、用户RAM区3部分,其结构如图1-6所示。
①工作寄存器区。AT89S51单片机内部低32B单元分成4个工作寄存器组,每组占8个单元,分别用R0~R7来表示。单片机运行时只能允许1个工作寄存器组作为当前工作寄存器组。
图1-6 片内RAM低128B配置图
当前工作寄存器组的选择由特殊功能寄存器中的程序状态字寄存器PSW的RS1、RS0位来决定,选择方法如表1-3所示。
表1-3 当前工作寄存器组的选择方法
②位寻址区。AT89S51单片机具有位处理功能,因此存储空间有一个位寻址区,位于片内RAM的20H~2FH单元中,16个单元共128位,其位地址范围为00H~7FH。该区也可以作为普通的RAM单元使用,进行字节操作。
③用户RAM区。30H~7FH单元作为用户RAM区。在实际应用中这些单元作为数据缓冲区,AT89S51的堆栈一般设在30H~7FH范围内。
(2)片内RAM高128B
片内RAM高128B单元称为特殊功能寄存器区(SpecialFunctionRegister)。由于这些寄存器的功能已专门规定,故称为特殊功能寄存器(SFR)。
AT89C51单片机有21个特殊功能寄存器。AT89S51的特殊功能寄存器,除与AT89C51相同的外,还增加了5个与增加功能相关的特殊功能寄存器。它们分散在80H~FFH地址中,字节地址能被8整除(字节地址末位为0H或8H)的特殊功能寄存器可以进行位寻址。26个特殊功能寄存器地址分配如表1-4所示。
表1-4 特殊功能寄存器位地址及字节地址表
注:带*者为AT89S51增加的特殊功能寄存器
①累加器A:A是8位寄存器,字节地址为E0H。它是CPU中工作最繁忙的寄存器,CPU的大多数指令都要通过累加器A与其他部分交换信息。累加器A常用于存放使用次数高的操作数或中间结果。在指令系统中,累加器A的助记符为“A”或“ACC”。
②通用寄存器B:乘除法指令中要用的通用寄存器,也可用做一般寄存器。
③程序状态字寄存器PSW:程序状态字用于存放程序运行状态信息,各标志位如表1-5所示。
表1-5 程序状态字
其中每位的具体含义如下。
CY:进位标志,常用C表示。在进行加、减法运算时,若运算结果最高位有进位(或借位)时,C置“1”,否则置“0”;在进行位操作时,C作为位操作累加器。
AC:半进位标志。在进行加、减法运算时,若低半字节向高半字节有进位(或借位)时,AC置“1”,否则置“0”;AC还作为BCD码运算调整时的判别位。
F0:用户标志。由用户置位、复位,作为软件标志。
RS1、RS0:工作寄存器指针,用来选择当前工作的寄存器组。
单片机复位时,RS1RS0=00,CPU选中第0组为当前工作寄存器。
OV:溢出标志。反映运算结果是否溢出,溢出时OV为“1”,否则为“0”。溢出和进位是两种不同性质的概念。溢出是指有符号数的两个数运算时,结果超出了-128~+127;而进位是指两个数最高位相加(或相减)时有进位(或借位)。
例如,两个正数相加超过+127,则产生了溢出,使符号位由正变为负,结果出错,这时OV=1;又如两个负数相加,结果小于-128,产生了溢出,结果也是出错,OV=l。
常用的判别方法是:两个有符号数在进行加、减法运算时,D6或D7中仅有1位发生进位(或借位)现象,则OV=1;D6、D7位都没进位(或借位)或都有进位(或借位),则OV=0。
P:奇偶标志。反映累加器A中内容的奇偶性。若A中有奇数个“1”,则P置为“1”,否则P置为“0”。此标志位对串行口通信中的数据传输有重要的意义,在串行通信中,常用奇偶检验的方法来检验数据传输的可靠性。
④堆栈指针SP(StackPointer):SP在片内数据存储器RAM128B中开辟堆栈区,并随时跟踪栈顶地址。它是按先进后出的原则存取数据的,开机复位后,SP为07H。
⑤数据指针DPTR:由于AT89S51单片机可以外接64KB的数据存储器和I/O接口电路,故单片机内设置了16位的数据指针DPTR。它可以对64KB的片外数据存储器和I/O进行寻址。它的高8位为DPH,地址为83H;低8位为DPL,地址为82H。
AT89S51有两个数据指针DPTR,由辅助寄存器1(AUXR1)的最低位DPS确定选择其一。
⑥程序计数器PC(ProgramCounter):16位的PC不属于特殊功能寄存器。其存放的内容是下一个要取的指令的16位存储单元地址。也就是说,CPU总是把PC的内容作为地址,从ROM中取出指令,然后执行,每取出一条指令后,PC的值自动加1。
⑦辅助寄存器AUXR:辅助寄存器用于使能控制,控制位的含义如下。
DISALE:ALE使能。DISALE=0时,ALE输出1/6振荡频率的脉冲;DISALE=1时,ALE仅在执行MOVX、MOVC指令时有效。
DISRTO:看门狗溢出复位使能。DISRTO=0时,看门狗溢出复位引脚RST至高电平;DISRTO=1时,RST只作为输入。
WDIDLE:空闲模式下的看门狗使能。WDIDLE=0时,在空闲模式下看门狗继续计数;WDIDLE=1时,在空闲模式下看门狗停止计数。
(3)片外RAM
AT89S51的片内RAM不够用时,可扩展片外数据存储器RAM,最大范围为0000H~FFFFH,共64KB。且片内RAM与片外RAM低128B地址也重叠,由于对片内RAM、片外RAM的操作使用了不同指令(MOV、MOVX),这样就不会发生混乱。
另外,单片机应用系统扩展的外部I/O端口与片外RAM是统一编址的,地址范围为0000H~FFFFH。因此CPU将系统扩展的外部I/O端口与片外RAM完全一样对待,并采用相同的指令。
1.2.3 AT89S51单片机的并行端口结构
AT89S51共有4个8位的I/O口,分别记作P0、Pl、P2、P3。每个口都包含一个锁存器、一个输出驱动器和输入缓冲器。4个I/O口都是8位双向口,这些口在结构和特性上基本相同,但又各具特点,下面分别介绍各I/O接口及功能。
1.P0口
P0口的位结构如图1-7所示。它包含1个数据输出锁存器、2个三态数据输入缓冲器及驱动电路和控制电路。在访问外部存储器时,P0口是一个真正的双向口,当P0口输出地址/数据信息时,控制信号“1”,使模拟开关MUX把地址/数据信息经反相器和VT2接通,同时打开与门,输出的地址/数据信息即通过与门去驱动VT1,再通过反相器去驱动VT2,使两个FET管构成推拉输出电路。若地址/数据信息为“0”,则该信号使VT1截止,使VT2导通,从而引脚上输出相应的“1”信号。若地址/数据信息为“1”,则VT2截止,使VT1导通,引脚上输出“1”信号。若由P0口输入数据,则输入信号从引脚通过输入缓冲器进入内部总线。
图1-7 P0口的位结构
当P0口作为通用I/O接口使用时,CPU内部发控制信号“0”封锁与门,使VT1截止,同时使模拟开关MUX把锁存器的西端与VT2的栅极接通。当P0作为输出时,由于端和VT2的倒相作用,内部总线上的信号与到达P0口上的信息是同相位的,只要写脉冲加到锁存器的CP端,内部总线上的信息就送到P0的引脚上。此时VT2为漏极开路输出,故需外接上拉电阻。当P0口作为输入时,由于该信号既加到VT2,又加到下面一个三态缓冲器上。假若此前该口曾输出锁存数据“0”,则VT2导通,引脚上的电位就被VT2钳在“0”电平上,使输入的“1”无法读入。故作为通用I/O接口使用时,P0口是一个准双向口,即输入数据前,应先通过写锁存器向D端写“1”,输出为“0”,使VT2截止。但在访问外部存储器期间,CPU会自动向P0的锁存器写入“l”。所以对用户而言,P0口作为地址/数据总线时,则是一个真正的双向口。
P0口特点如下:
●P0口地址为80H,可以进行位操作。
●P0口既可以作为数据/低8位地址总线,也可以作为通用I/O口使用。
●P0口采用漏极开路输出作通用I/O口时,要接上拉电阻,可以推动8个LSTTL电路。
●P0口作为输入时,必须将P0口先置1。
2.P1口
P1口的位结构如图1-8所示。P1口是一个准双向口,专供用户使用。作为通用I/O接口使用时,其内部有上拉电阻与电源相连,故不必再外接上拉电阻。当做输入时,必须先向对应的锁存器写“1”,使VT截止。原理同P0口作为通用I/O接口类似。
图1-8 P1口的位结构
P1口特点如下:
●P1口只能作为通用I/O口使用。
●P1口作为输入时,必须将P1口置1。
●P1口无需接上拉电阻,可以推动4个LSTTL电路。
3.P2口
P2口的位结构如图1-9所示。P2口也是一个准双向口,其位结构与P0口类似,当系统中有片外存储器时,P2口用于输出高8位地址。此时,MUX在CPU控制下,接通地址信号,而P2口在作为通用I/O口使用时,MUX接通锁存器,使需要输出的数据送到P2的引脚上。同样,若P2口作为输入口时,首先应对锁存器写“l”,使输出端的VT截止。
图1-9 P2口的位结构
P2口特点如下:
●P2口可以作为高8位地址线,也可以作为通用I/O口。
●P2作为通用I/O口作为输出时,由于内部集成了上拉电阻,无需再接上拉电阻,可以推动4个LSTTL电路。
●P1口无需接上拉电阻就可以推动4个LSTTL电路。
●输入时,P2口必须置1。
4.P3口
P3口的位结构如图1-10所示。P3口是一个双功能口,它既可以作为通用I/O接口使用,又具有第二功能。当做通用I/O接口使用时,每位都可定义为输入或输出,且是一个准双向口。
由图1-10可见,当P3口作为通用输出口使用时,选择输出功能端应为“l”,使锁存器的信号能顺利传送到引脚。同样,若需用于第二功能作专用信号输出时(如送出等),则该位锁存器的Q端置“l”,使RD、WR等信号顺利传送到引脚。而对输入而言,无论该位是作为通用输入口或作为第二功能输入口,相应的锁存器和选择输出功能端都应置“1”,这个工作在开机复位时自动完成。
图1-10中输入通道中有两个缓冲器,第二功能的专用输入信号(如RXD)取自第一个缓冲器输出端,通用输入信号取自“读引脚”缓冲器的输出端。
图1-10 P3口的位结构
当P3口工作于第二功能时,各位的定义如表1-6所示。
表1-6 P3口的第二功能定义
1.2.4 看门狗定时器
看门狗定时器为WDT。WDT是CPU遭遇软件混乱时的恢复方法。由一个14位的计数器和看门狗复位SFR(WDTRST)构成。当退出复位后,WDT默认为关闭状态。要打开WDT,需依次将01EH、0E1H写入到WDTRST中。当开启了WDT,它会随晶体振荡器在每个机器周期计数。除硬件复位或WDT复位外,没有其他方法关闭WDT,当WDT溢出,将使RST引脚输出高电平的复位脉冲。
启动看门狗定时器WDT时,为避免因WDT溢出而复位,在其溢出前(计数<16384)应将01EH、0E1H写入到WDTRST,称为喂狗。在合适的程序代码时间段,需要周期性地喂狗,以防溢出而复位。具体应用见附录A。