AT89C52 是 51 系列单片机的一个型号,它是 ATMEL 公司生产的。
AT89C52 是一个低电压,高性能 CMOS 8 位单片机,片内含 8k bytes 的可反复擦
写的 Flash 只读程序存储器和 256 bytes 的随机存取数据存储器(RAM),器件采用
ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内
置通用 8 位中央处理器和 Flash 存储单元,功能强大的 AT89C52 单片机可为您提供
许多较复杂系统控制应用场合。
AT89C52 有 40 个引脚,32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中
断口,3 个 16 位可编程定时计数器,2 个全双工串行通信口,2 个读写口线,AT89C5
2 可以按照常规方法进行编程,但不可以在线编程(S 系列的才支持在线编程)。其将通
用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效
地降低开发成本。
兼容 MCS51 指令系统 · 8k 可反复擦写(>1000 次)Flash ROM
· 32 个双向 I/O 口 · 256x8bit 内部 RAM
· 3 个 16 位可编程定时/计数器中断 · 时钟频率 0-24MHz
· 2 个串行中断 · 可编程 UART 串行通道
· 2 个外部中断源 · 共 6 个中断源
· 2 个读写中断口线 · 3 级加密位
· 低功耗空闲和掉电模式 · 软件设置睡眠和唤醒功能
AT89C52P 为 40 脚双列直插封装的 8 位通用微处理器,采用工业标准的 C51 内核,
在内部功能及管脚排布上与通用的 8xc52 相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主 IC 内部寄存器、数据 RAM 及外部接口等功能部件的初始化,会
聚调整控制,会聚测试图控制,红外遥控信号 IR 的接收解码及与主板 CPU 通信等。
主要管脚有:XTAL1(19 脚)和 XTAL2(18 脚)为振荡器输入输出端口,外接 12
MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VC
C(40 脚)和 VSS(20 脚)为供电端口,分别接+5V 电源的正负端。P0~P3 为可
编程通用 I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定
义为 N1 功能控制端口,分别与 N1 的相应功能管脚相连接,13 脚定义为 IR 输入端,
10 脚和 11 脚定义为 I2C 总线控制端口,分别连接 N1 的 SDAS(18 脚)和 SCLS
(19 脚)端口,12 脚、27 脚及 28 脚定义为握手信号功能端口,连接主板 CPU
的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0 口
P0 口是一组 8 位漏极开路型双向 I/O 口, 也即地址/数据总线复用口。作为输出口
用时,每位能吸收电流的
方式驱动 8 个 TTL 逻辑门电路,对端口 P0 写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低 8 位)和数据
总线复用,在访问期间激活内部上拉电阻。
在 Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,
要求外接上拉电阻。
P1 口
P1 是一个带内部上拉电阻的 8 位双向 I/O 口, P1 的输出缓冲级可驱动(吸收或
输出电流)4 个 TTL 逻辑
门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉
电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与 AT89C51 不同之处是,P1.0 和 P1.1 还可分别作为定时/计数器 2 的外部计
数输入(P1.0/T2)和输入(P1.1/T2EX),
参见表 1。
Flash 编程和程序校验期间,P1 接收低 8 位地址。
表.P1.0 和 P1.1 的第二功能
引脚号 功能特
P1.0
P1.1
性
T2,时
钟输出
T2EX
(定时/
计数器
2)
P2 口
P2 是一个带有内部上拉电阻的 8 位双向 I/O 口,P2 的输出缓冲级可驱动(吸收或
输出电流)4 个 TTL 逻辑
门电路。对端口 P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入
口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一
个电流(IIL)。
在访问外部程序存储器或 16 位地址的外部数据存储器(例如执行 MOVX @DPTR
指令)时,P2 口送出高 8 位地址数据。在访问 8 位地址的外部数据存储器(如执
行 MOVX @RI 指令)时,P2 口输出 P2 锁存器的内容。
Flash 编程或校验时,P2 亦接收高位地址和一些控制信号。
P3 口
P3 口是一组带有内部上拉电阻的 8 位双向 I/O 口。P3 口输出缓冲级可驱动(吸收
或输出电流)4 个 TTL 逻
辑门电路。对 P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此
时,被外部拉低的 P3 口将用上拉电阻输出电流(IIL)。
P3 口除了作为一般的 I/O 口线外,更重要的用途是它的第二功能
P3 口还接收一些用于 Flash 闪速存储器编程和程序校验的控制信号。
RST
复位输入。当振荡器工作时,RST 引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地
址的低 8 位字节。一般情况下,ALE 仍以时钟振荡频率的 1/6 输出固定的脉冲信号,
因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将
跳过一个 ALE 脉冲。对 Flash 存储器编程期间,该引脚还用于输入编程脉冲(PRO
G)。如有必要,可通过对特殊功能寄存器(SFR)区中的 8EH 单元的 D0 位置位,
可禁止 ALE 操作。该位置位后,只有一条 MOVX 和 MOVC 指令才能将 ALE 激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置 ALE 禁止位无效。
PSEN
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当 AT89C52 由外部
程序存储器取指令(或数据)时,每个机器周期两次 PSEN 有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次 PSEN 信号。
EA/VPP
外部访问允许。欲使 CPU 仅访问外部程序存储器(地址为 0000H—FFFFH),EA
端必须保持低电平(接地)。需注意的是:如果加密位 LB1 被编程,复位时内部会
锁存 EA 端状态。如 EA 端为高电平(接 Vcc 端),CPU 则执行内部程序存储器中
的指令。Flash 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须
是该器件是使用 12V 编程电压 Vpp。
XTAL1
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2
振荡器反相放大器的输出端。
特殊功能寄存器
在 AT89C52 片内存储器中,80H-FFH 共 128 个单元为特殊功能寄存器(SFE),
SFR 的地址空间映象如表 2 所示。并非所有的地址都被定义,从 80H—FFH 共 12
8 个字节只有一部分被定义,还有相当一部分没有定义。对没有定义的单元读写将是
无效的,读出的数值将不确定,而写入的数据也将丢失。不应将数据“1”写入未定义的
单元,由于这些单元在将来的产品中可能赋予新的功能,在这种情况下,复位后这些
单元数值总是“0”。AT89C52 除了与 AT89C51 所有的定时/计数器 0 和定时/计数器 1
外,还增加了一个定时/计数器 2。定时/计数器 2 的控制和状态位位于 T2CON(参
见表 3)T2MOD(参见表 4),寄存器对(RCAO2H、RCAP2L)是定时器 2 在 16
位捕获方式或 16 位自动重装载方式下的捕获/自动重装载寄存器。
数据存储器
AT89C52 有 256 个字节的内部 RAM,80H-FFH 高 128 个字节与特殊功能寄
存器(SFR)地址是重叠的,也就是高 128
字节的 RAM 和特殊功能寄存器的地址是相同的,但物理上它们是分开的。
当一条指令访问 7FH 以上的内部地址单元时,指令中使用的寻址方式是不同的,
也即寻址方式决定是访问高 128 字节 RAM 还是访问特殊功能寄存器。如果指令是
直接寻址方式则为访问特殊功能寄存器。
例如,下面的直接寻址指令访问特殊功能寄存器 0A0H(即 P2 口)地址单元。
MOV 0A0H,#data
间接寻址指令访问高 128 字节 RAM,例如,下面的间接寻址指令中,R0 的内
容为 0A0H,则访问数据字节地址为 0A0H,
而不是 P2 口(0A0H)。
MOV @R0,#data
堆栈操作也是间接寻址方式,所以,高 128 位数据 RAM 亦可作为堆栈区使用。
·定时器 0 和定时器 1:
AT89C52 的定时器 0 和定时器 1 的工作方式与 AT89C51 相同。
定时器 2
定时器 2 是一个 16 位定时/计数器。它既可当定时器使用,也可作为外部事件
计数器使用,其工作方式由特殊功能寄
存器 T2CON(如表 3)的 C/T2 位选择。定时器 2 有三种工作方式:捕获方式,
自动重装载(向上或向下计数)方式和波
特率发生器方式,工作方式由 T2CON 的控制位来选择。
定时器 2 由两个 8 位寄存器 TH2 和 TL2 组成,在定时器工作方式中,每个机
器周期 TL2 寄存器的值加 1,由于一个机
器周期由 12 个振荡时钟构成,因此,计数速率为振荡频率的 1/12。
在计数工作方式时,当 T2 引脚上外部输入信号产生由 1 至 0 的下降沿时,寄
存器的值加 1,在这种工作方式下,每个
机器周期的 5SP2 期间,对外部输入进行采样。若在第一个机器周期中采到的值
为 1,而在下一个机器周期中采到的值为 0,
则在紧跟着的下一个周期的 S3P1 期间寄存器加 1。由于识别 1 至 0 的跳变需
要 2 个机器周期(24 个振荡周期),因此,最
高计数速率为振荡频率的 1/24。为确保采样的正确性,要求输入的电平在变化前
至少保持一个完整周期的时间,以保证输
入信号至少被采样一次。
捕获方式
在捕获方式下,通过 T2CON 控制位 EXEN2 来选择两种方式。如果 EXEN2=0,
定时器 2 是一个 16 位定时器或计数器,
计数溢出时,对 T2CON 的溢出标志 TF2 置位,同时激活中断。如果 EXEN2=
1,定时器 2 完成相同的操作,而当 T2EX 引
脚外部输入信号发生 1 至 0 负跳变时,也出现 TH2 和 TL2 中的值分别被捕获
到 RCAP2H 和 RCAP2L 中。另外,T2EX 引
脚信号的跳变使得 T2CON 中的 EXF2 置位,与 TF2 相仿,EXF2 也会激活中
断。捕获方式如图 4 所示。
自动重装载(向上或向下计数器)方式
当定时器 2 工作于 16 位自动重装载方式时,能对其编程为向上或向下计数方式,
这个功能可通过特殊功能寄存器 T2CON
(见表 5)的 DCEN 位(允许向下计数)来选择的。复位时,DCEN 位置“0”,
定时器 2 默认设置为向上计数。当 DCEN
置位时,定时器 2 既可向上计数也可向下计数,这取决于 T2EX 引脚的值,参
见图 5,当 DCEN=0 时,定时器 2 自动设置
为向上计数,在这种方式下,T2CON 中的 EXEN2 控制位有两种选择,若 EX
EN2=0,定时器 2 为向上计数至 0FFFFH 溢
出,置位 TF2 激活中断,同时把 16 位计数寄存器 RCAP2H 和 RCAP2L 重装
载,RCAP2H 和 RCAP2L 的值可由软件预置。
若 EXEN2=1,定时器 2 的 16 位重装载由溢出或外部输入端 T2EX 从 1 至 0
的下降沿触发。这个脉冲使 EXF2 置位,如果
中断允许,同样产生中断。
定时器 2 的中断入口地址是:002BH ——0032H 。
当 DCEN=1 时,允许定时器 2 向上或向下计数,如图 6 所示。这种方式下,T
2EX 引脚控制计数器方向。T2EX 引脚为逻
辑“1”时,定时器向上计数,当计数 0FFFFH 向上溢出时,置位 TF2,同时把 1
6 位计数寄存器 RCAP2H 和 RCAP2L 重装
载到 TH2 和 TL2 中。 T2EX 引脚为逻辑“0”时,定时器 2 向下计数,当 TH2
和 TL2 中的数值等于 RCAP2H 和 RCAP2L
中的值时,计数溢出,置位 TF2,同时将 0FFFFH 数值重新装入定时寄存器中。
当定时/计数器 2 向上溢出或向下溢出时,置位 EXF2 位。
波特率发生器
当 T2CON(表 3)中的 TCLK 和 RCLK 置位时,定时/计数器 2 作为波特率发
生器使用。如果定时/计数器 2 作为发送器或
接收器,其发送和接收的波特率可以是不同的,定时器 1 用于其它功能,如图 7
所示。若 RCLK 和 TCLK 置位,则定时器 2
工作于波特率发生器方式。
波特率发生器的方式与自动重装载方式相仿,在此方式下,TH2 翻转使定时器 2
的寄存器用 RCAP2H 和 RCAP2L 中的 16
位数值重新装载,该数值由软件设置。
在方式 1 和方式 3 中,波特率由定时器 2 的溢出速率根据下式确定:
方式 1 和 3 的波特率=定时器的溢出率/16
定时器既能工作于定时方式也能工作于计数方式,在大多数的应用中,是工作在
定时方式(C/T2=0)。定时器 2 作为波
特率发生器时,与作为定时器的操作是不同的,通常作为定时器时,在每个机器
周期(1/12 振荡频率)寄存器的值加 1,
而作为波特率发生器使用时,在每个状态时间(1/2 振荡频率)寄存器的值加 1。
波特率的计算公式如下:
方式 1 和 3 的波特率=振荡频率/{32*[65536-(RCP2H,RCP2L)]}
式中(RCAP2H,RCAP2L)是 RCAP2H 和 RCAP2L 中的 16 位无符号数。
定时器 2 作为波特率发生器使用的电路如图 7 所示。T2CON 中的 RCLK 或 T
CLK=1 时,波特率工作方式才有效。在
波特率发生器工作方式中,TH2 翻转不能使 TF2 置位,故而不产生中断。但若
EXEN2 置位,且 T2EX 端产生由 1 至 0 的
负跳变,则会使 EXF2 置位,此时并不能将(RCAP2H,RCAP2L)的内容重新
装入 TH2 和 TL2 中。所以,当定时器 2 作
为波特率发生器使用时,T2EX 可作为附加的外部中断源来使用。需要注意的是,
当定时器 2 工作于波特率器时,作为定
时器运行(TR2=1)时,并不能访问 TH2 和 TL2。因为此时每个状态时间定时
器都会加 1,对其读写将得到一个不确定的数值。
然而,对 RCAP2 则可读而不可写,因为写入操作将是重新装载,写入操作可能
令写和/或重装载出错。在访问定时器 2 或 RCAP2 寄存器之前,应将定时器关闭(清
除 TR2)。
可编程时钟输出
定时器 2 可通过编程从 P1.0 输出一个占空比为 50%的时钟信号,如图 8 所示。
P1.0 引脚除了是一个标准的 I/O 口外,还可以通过编程使其作为定时/计数器 2 的
外部时钟输入和输出占空比 50%的时钟脉冲。当时钟振荡频率为 16MHz 时,输出时
钟频率范围为 61Hz—4MHz。当设置定时/计数器 2 为时钟发生器时,C/T2(T2CO
N .1)=0,T2OE (T2MOD.1) =1,必须由 TR2(T2CON.2)启动或停止定时器。
时钟输出频率取决于振荡频率和定时器 2 捕获寄存器(RCAP2H,RCAP2L)的重新
装载值,公式如下:输出时钟频率=振荡器频率/{4*[65536-(RCP2H,RCP2L)]}
在时钟输出方式下,定时器 2 的翻转不会产生中断,这个特性与作为波特率发
生器使用时相仿。定时器 2 作为波特率发生器使用时,还可作为时钟发生器使用,
但需要注意的是波特率和时钟输出频率不能分开确定,这是因为它们同使用
RCAP2L 和 RCAP2L。
UART AT89C52 的 UART 工作方式与 AT89C51 工作方式相同。
中断
AT89C52 共有 6 个中断向量:两个外中断(INT0 和 INT1),3 个定时器中断
(定时器 0、1、2)和串行口中断。所有这些中断源如图 9 所示。
这些中断源可通过分别设置专用寄存器 IE 的置位或清 0 来控制每一个中断的
允许或禁止。IE 也有一个总禁止位 EA,它能控制所有中断的允许或禁止。
注意表 5 中的 IE.6 为保留位,在 AT89C51 中 IE.5 也是保留位。程序员不应
将“1”写入这些位,它们是将来 AT89 系列产品作为扩展用的。
定时器 2 的中断是由 T2CON 中的 TF2 和 EXF2 逻辑或产生的,当转向中断服
务程序时,这些标志位不能被硬件清除,
事实上,服务程序需确定是 TF2 或 EXF2 产生中断,而由软件清除中断标志位。
定时器 0 和定时器 1 的标志位 TF0 和 TF1 在定时器溢出那个机器周期的 S5P
2 状态置位,而会在下一个机器周期才查
询到该中断标志。然而,定时器 2 的标志位 TF2 在定时器溢出的那个机器周期
的 S2P2 状态置位,并在同一个机器周期内查询到该标志。
时钟振荡器
AT89C52 中有一个用于构成内部振荡器的高增益反相放大器,引脚 XTAL1 和
XTAL2 分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,
振荡电路参见图 10。外接石英晶体(或陶瓷谐振器)及电容 C1、C2 接在放大器的
反馈回路中构成并联振荡电路。对外接电容 C1、C2 虽然没有十分严格的要求,但
电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序
及温度稳定性,如果使用石英晶体,我们推荐电容使用 30pF±10pF,而如使用陶瓷
谐振器建议选择 40pF±10F。用户也可以采用外部时钟。采用外部时钟的电路如图 1
0 右图所示。这种情况下,外部时钟脉冲接到 XTAL1 端,即内部时钟发生器的输入
端,XTAL2 则悬空。由于外部时钟信号是通过一个 2 分频触发器后作为内部时钟信
号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的
低电平持续时间应符合产品技术条件的要求。
空闲节电模式
在空闲工作模式状态, CPU 自身处于睡眠状态而所有片内的外设仍保持激活状态,
这种方式由软件产生。此时,同时将片内 RAM 和所有特殊功能寄存器的内容冻结。
空闲模式可由任何允许的中断请求或硬件复位终止。由硬件复位终止空闲状态只需两
个机器周期有效复位信号,在此状态下,片内硬件禁止访问内部 RAM,但可以访问
端口引脚,当用复位终止空闲方式时,为避免可能对端口产生意外写入,激活空闲模
式的那条指令后一条指令不应是一条对端口或外部存储器的写入指令。
掉电模式
在掉电模式下,振荡器停止工作,进入掉电模式的指令是最后一条被执行的指令,
片内 RAM 和特殊功能寄存器的内容在终止掉电模式前被冻结。退出掉电模式的唯一
方法是硬件复位,复位后将重新定义全部特殊功能寄存器,但不改变 RAM 中的内容,
在 Vcc 恢复到正常工作电平前,复位应无效,且必须保持一定时间以使振荡器重启动
并稳定工作。
程序存储器的加密
AT89C52 有 3 个程序加密位,可对芯片上的 3 个加密位 LB1、LB2、LB3 进
行编程(P)或不编程(U)来得到。当加密位 LB1 被编程时,在复位期间,EA 端
的逻辑电平被采样并锁存,如果单片机上电后一直没有复位,则锁存起的初始值是一
个随机数,且这个随机数会一直保存到真正复位为止。为使单片机能正常工作,被锁
存的 EA 电平值必须与该引脚当前的逻辑电平一致。此外,加密位只能通过整片擦除
的方法清除。
Flash 存储器的编程
AT89C52 单片机内部有 8k 字节的 Flash PEROM,这个 Flash 存储阵列出厂时
已处于擦除状态(即所有存储单元的内容均为 FFH),用户随时可对其进行编程。编
程接口可接收高电压(+12V)或低电压(Vcc)的允许编程信号。低电压编程模式适
合于用户在线编程系统,而高电压编程模式可与通用 EPROM 编程器兼容。
AT89C52 单片机中,有些属于低电压编程方式,而有些则是高电压编程方式,
用户可从芯片上的型号和读取芯片内的签名字节获得该信息。
AT89C52 的程序存储器阵列是采用字节写入方式编程的,每次写入一个字节,
要对整个芯片内的 PEROM 程序存储器写入一个非空字节,必须使用片擦除的方式
将整个存储器的内容清除。
编程方法
编程前,须按表 9 和图 11 所示设置好地址、数据及控制信号, AT89C52 编
程方法如下:
1. 在地址线上加上要编程单元的地址信号。
2. 在数据线上加上要写入的数据字节。
3. 激活相应的控制信号。
4. 在高电压编程方式时,将 EA/Vpp 端加上+12V 编程电压。
5. 每对 Flash 存储阵列写入一个字节或每写入一个程序加密位,加上一个 AL
E/PROG 编程脉冲。每个字节写入周期是自身定时的,通常约为 1.5ms。重复 1—5
步骤,改变编程单元的地址和写入的数据,直到全部文件编程结束。
数据查询
AT89C52 单片机用 Data Palling 表示一个写周期结束为特征,在一个写周期
中,如需读取最后写入的一个字节,则 出的数据的最高位(P0.7)是原来写入字节