1.2 单片机的结构
下面以AT89S52为例来介绍单片机结构。AT89S52是一个低功耗、高性能的CMOS 8位微控制器,并且在系统中集成了8KB的可编程闪存。AT89S52兼容标准80C51指令集和引脚。AT89S52是一个功能强大的微控制器,具有较高的性价比,可在许多嵌入式控制中应用。
AT89S52单片机在一块芯片中集成了CPU、8KB的Flash、256B内存、32条输入/输出线、看门狗定时器、两个数据指针、3个16位定时器/计数器、6矢量两个级别的中断结构、一个全双工串行口、片内振荡器和时钟电路。
1.2.1 AT89S52单片机的内部构件
AT89S52单片机内包含下列几个部件:
(1)一个8位CPU;
(2)一个片内振荡器及时钟电路;
(3)8KB可重复擦写的Flash程序存储器;
(4)256B内部RAM;
(5)3个16位定时器/计数器;
(6)32条可编程的I/O线(四个8位并行I/O端口);
(7)一个可编程全双工串行口;
(8)6个中断源、两个优先级。
AT89S52基本结构如图1.4所示。
1.CPU
CPU是单片机的核心部件,它由运算器和控制器组成。
图1.4 AT89S52基本结构
1)运算器
运算部件是以算术逻辑单元ALU为核心,加上累加器ACC、寄存器B、暂存器、程序状态字PSW以及十进制调整电路和布尔处理器等许多部件组成的。
(1)8位算术和逻辑运算的ALU单元
ALU单元可以对4位(半字节)、8位(一字节)和16位(双字节)数据进行操作。完成算术四则运算和逻辑运算,以及位操作、循环移位等逻辑操作,操作结果的状态信息送至状态寄存器(PSW)。
(2)累加器ACC
累加器ACC,在指令中用助记符A来表示。A是一个8位寄存器,是CPU中工作最繁忙的寄存器。在算术逻辑运算中,用来存放一个操作数或运算结果(包括中间结果)。在与外部存储器和I/O接口打交道时,其完成数据传送。
(3)寄存器B
B可做通用寄存器,在乘、除法运算中使用。做乘法运算时,寄存器B用来存放乘数及积的高位字节;做除法运算时,寄存器B用来存放除数及余数;不做乘、除法运算时,寄存器B可做通用寄存器。
(4)程序状态字寄存器PSW(程序状态标志寄存器)
PSW是8位寄存器,用于存放当前指令执行后操作结果的某些特征,以便为下一条指令的执行提供依据。PSW的各位定义如表1.1所示。
表1.1 PSW的各位定义
① Cy:进位标志位。
在执行某些算术运算和逻辑指令时,Cy可以被硬件或软件置位或清0。在算术运算中它可作为进位标志;在位运算中,它做累加器使用;在位传送、位与及位或等位操作中,都要使用进位标志位。
② AC:辅助进位标志位。
进行加法或减法操作时,当发生低4位向高4位进位或借位时,AC由硬件置位,否则AC位被置0。执行十进制调整指令时,将借助AC状态进行判断。
③ F0:用户标志位。
该位为用户定义的状态标志,用户根据需要用软件对其置位或清0,也可以用软件测试F0来控制程序的跳转。
④ RS1和RS0:寄存器组选择控制位。
此两位通过软件置0或1来选择当前工作寄存器组,如表1.2所示。
表1.2 工作寄存器组选择
CPU通过对PSW中的D4、D3位内容的修改,就能任选一个工作寄存器组。例如:
SETB PSW.3 CLR PSW.4 ;选定第1组 SETB PSW.4 CLR PSW.3 ;选定第2组 SETB PSW.3 SETB PSW.4 ;选定第3组
若不设定则为第0组,也称为默认值,这个特点使单片机具有快速现场保护功能。特别注意的是,如果不加设定,在同一段程序中工作寄存器R0~R7只能用一次,若用两次程序会出错。
⑤ OV:溢出标志位。
当执行算术指令时,在带符号的加减运算中,OV=1表示有溢出(或借位)。反之,OV=0表示运算正确,即无溢出产生。
⑥ P:奇偶标志位。
P用来表示累加器A中1的个数的奇偶性,它常常用于手机通信。若累加器中1的个数为奇数则P=1,否则P=0。
(5)布尔处理器
布尔处理器完成布尔代数逻辑运算。
2)控制器
控制器是CPU的大脑中枢,是单片机的指挥控制部件。它由程序计数器(PC)、指令寄存器(IR)、指令译码器(ID)、数据指针(DPTR)、堆栈指针(SP)以及定时控制电路等部件组成,对来自存储器中的指令进行译码,通过定时控制电路在规定的时刻发出各种操作所需的控制信号,使各部分协调工作,完成指令所规定的功能。
(1)程序计数器PC
程序计数器PC是16位专用寄存器,寻址范围为64KB,用于存放CPU执行的下一条指令的地址,具有自动加1的功能。当一条指令按照PC所指的地址从程序存储器中取出后, PC会自动加1,指向下一条指令。
(2)指令寄存器IR和指令译码器ID
指令寄存器IR是8位寄存器,用于暂存待执行的指令,等待译码;指令译码器ID对指令寄存器中的指令进行译码,即将指令转变为所需的电平信号。
译码器输出的电平信号,再经定时控制电路即可定时产生执行该指令所需要的各种控制信号。
(3)数据指针DPTR
数据指针DPTR是16位专用寄存器。它可以对64KB的外部数据存储器和I/O口进行寻址,也可作为两个8位寄存器,主要用做外部数据存储器的地址指针。
(4)堆栈指针SP
堆栈指针SP是8位特殊功能寄存器,在片内RAM(128B)中开辟栈区,并随时跟踪栈顶地址,它按“先进后出”的原则存取数据,上电复位后,SP指向07H。
2.存储器及特殊功能寄存器
AT89S52外部有两个独立的存储器空间:64KB的程序存储器空间和64KB的数据存储器空间。
1)程序存储器
EA=0:片内ROM不起作用,完全执行片外程序存储器指令。外部ROM的地址为0000H~0FFFFH,可达64KB。
EA=1:执行片内程序存储器指令,地址为0000H~1FFFH;当指令地址超过1FFFH后,自动转向片外ROM取指令,地址为2000H~0FFFFH。
2)数据存储器
数据存储器分为内部数据存储器和外部数据存储器。
(1)内部数据存储器
AT89S52有256B的片内RAM,地址空间为00H~0FFH。其中,低128B(地址为00H~7FH)是真正的RAM区;高128B(地址为80H~0FFH)与片内特殊功能寄存器(SFR)区(80H~0FFH)地址完全重合,但在物理上是完全独立的,单片机采用不同的寻址方式,以区分这两个重叠的逻辑地址空间。
访问(80H~0FFH)区间的SFR时,只能用直接寻址方式。如:
MOV 0A0H, #data
其中,指令的目的操作数是直接地址,将立即数“#data”送入SFR中的0A0H单元中。
访问(80H~0FFH)区间的片内RAM时,只能用间接寻址方式。如:
MOV R0, #0A0H MOV @R0, #data
其中,指令的目的操作数是间接地址,将立即数“#data”存入片内RAM的0A0H单元中。堆栈操作是间接寻址的典型例子,因为栈指针SP为栈顶单元地址。片内RAM 80H~0FFH空间也可用做栈区空间。
AT89S52片内共有32个特殊功能寄存器。表1.3列出了AT89S52 SFR的地址及复位值。
表1.3 AT89S52 SFR的地址及复位值
续表
在80H~FFH地址空间中,SFR并没有被完全占用。对于余留的空间,用户不可使用。
(2)外部数据存储器
外部数据存储器地址范围为0000H~0FFFFH,可达64KB,用MOVX指令进行访问。
1.2.2 AT89S52单片机引脚功能
AT89S52的引脚和封装共有四种形式,如图1.5所示。
下面以40引脚塑料双列直插式封装(PDIP)芯片为例,介绍各个引脚功能。
(1)电源引脚VCC和GND。
① GND(20):接地端。
② VCC(40):正常操作时为+5V电源。
通常在VCC和GND引脚之间接0.1μF高频滤波电容。
(2)外接晶振引脚XTAL1和XTAL2。
① XTAL1(19):内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。
② XTAL2(18):内部振荡电路反相放大器的输出端,是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。
(3)控制或与其他电源复用引脚RST、ALE/PROG、PSEN和EA/Vpp。
① RST(9):当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位。
图1.5 AT89S52的引脚和封装
② ALE/PROG(30):地址锁存允许/编程脉冲输入。在访问外部程序存储器和外部数据存储器时,该引脚输出一个地址锁存脉冲ALE,其下降沿可将低8位地址锁存于片外地址锁存器中。
在编程时,向该引脚输入一个编程负脉冲PROG。
正常操作时为ALE功能(允许地址锁存),将地址的低字节锁存在外部锁存器中,ALE引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。
③ PSEN(29):外部程序存储器读选通信号输出端,低电平有效。在从外部程序存取指令(或数据)期间,PSEN在每个机器周期内两次有效。在访问外部数据存储器时,PSEN无效。
④ EA/Vpp(31):内部程序存储器和外部程序存储器选择端。当EA/Vpp为高电平时,访问内部程序存储器;当EA/Vpp为低电平时,则访问外部程序存储器。
在Flash编程时,该引脚可连接21V的编程电源Vpp。
(4)输入/输出引脚P0.0~P0.7,P1.0~P1.7,P2.0~P2.7,P3.0~P3.7。
① P0口(32~39):一个8位漏极开路型双向I/O口。
当用做通用I/O口时,每个引脚可驱动8个TTL负载;当用做输入时,每个端口首先置1。
在访问外部存储器时,它分时传送低字节地址和数据总线,此时,P0口内含提升电阻。
② P1口(1~8):一个带有内部提升电阻的8位准双向I/O口。
当用做通用I/O口时,每个引脚可驱动8个TTL负载。当用做输入时,每个端口首先置1。
P1.0和P1.1引脚也可用做定时器2的外部计数输入(P1.0/T2)和触发器输入(P1.1/T2EX)。
③ P2口(21~28):一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。P2口可以驱动4个TTL负载。当用做输入时,每个端口首先置1。
④ P3口(10~17):一个带有内部提升电阻的8位准双向I/O口,能驱动4个TTL负载。当用做输入时,每个端口首先置1。P3口还可用于第二功能,如表1.4所示。
表1.4 P3口的第二功能