第 10章
AT89C2051 Flash单片机
AT89C系列与 MCS— 51系列单片机相比有两大优势:第一,
片内程序存储器采用闪速存储器, 使程序的写入更加方便;第
二, 提供了更小尺寸的芯片 (AT89C2051/ 1051),使整个硬件
电路的体积更小 。
AT89C系 列 单 片机 有 4种型号,AT89C51, AT89C52、
AT89C1051,AT89C2051,其中 AT89C2051/ 1051是 ATMEL公司
AT89C系列的新成员 。 它以较小的体积, 良好的性能价格比倍
受青睐, 在家电产品, 工业控制, 计算机产品, 医疗器械, 汽
车工业等应用方面成为用户降低成本的首选器件 。 这里以
AT89C2051为代表对 AT89C系列单片机作一阐述 。
10.1 AT89C2051内部结构与功能
10.1.1 AT89C2051主要性能
AT 89C2051是 ATMEL公司生产的带 2K字节闪速可编程可
擦除只读存储器 (EEPROM)的 8位单片机, 它具有如下主要特性:
· 和 MCS-51产品的兼容 · 2K字节可重编程闪速存储器
· 耐久性,1,000写/擦除周期 · 2.7V~ 6V的操作范围
· 全静态操作,0Hz~ 24MHz · 两级加密程序存储器
· 128× 8位内部 RAM · 15根可编程 I/O引线
· 两个 16位定时器 /计数器 · 六个中断源
· 可编程串行 UART通道 · 直接 LED驱动输出
· 片内模拟比较器 · 低功耗空载和掉电方式
RST
(RXD) P3.0
(TXD) P3.1
XTAL2
XTAL1
(INT0)P3.2
(INT1)P3.3
(T0)P3.4
(T1)P3.5
GND
VCC
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1(AIN1)
P1.0(AIN0)
P3.7
AT89C2051
1
10 11
20
图 10.1 AT89C2051的结构框图
10.1.2 AT 89C2051的结构框图
AT89C2051是一带有 2K字节闪速可编程可擦除只读存储体
(EEPROM)的低电压, 高性能 8位 CMOS微型计算机 。 如图 10.2所
示 。 它采用 ATMEL的高密非易失存储技术制造并和工业标准
MCS— 51指令集和引脚结构兼容 。 通过在单块芯片上组合通用
的 CPL1和闪速存储器, ATMEL AT89C2051是一强劲的微型计算
机, 它对许多嵌入式控制应用提供一高度灵活和成本低的解
决办法 。
图 10.2 AT89C2051内部结构图
R A M 地址寄存器 RAM PEROM
程序地址
寄存器
缓冲器
P C 增量器
程序计数器
DPTR
B 寄存器 ACC 堆栈指示器
TMP2 TMP1
ALU
中断、串行端口
与定时器单元
PSW
同步与控制 指令寄存器
端口1
锁存
端口3
锁存
端口1 驱动 端口3 驱动
振荡器
RST
VCC
GND
P1.0 -- P1.7 P 3, 0 –- P 3, 5 P 3, 7
此外, 从 AT89C2051内部结构图也可看出, 其内部结构
与 8051内部结构基本一致 ( 除模拟比较器外 ), 引脚 RST、
XTAL1,XTAL2的特性和外部连接电路也完全与 51系列单片机
相应引脚一致, 但 P1口, P3口有其独特之处 。
10.1.3 AT 89C2051的引脚说明
AT89C2051是一个有 20个引脚的芯片, 引脚如图 10.1
所示, 与 8051内部结构进行对比可发现, AT89C2051减少
了两个对外端口 ( 即 P0,P2口 ), 使它最大可能地减少
了对外引脚, 因而芯片尺寸有所减少 。
AT89C2051芯片的 20个引脚功能为:
1,Vcc:电源电压 。
2,GND:地 。
3,P1口,P1口是一 8位双向 I/O口 。 口引脚 P1.2~
P1.7提供内部上拉电阻 。
4,P3口,P3口的 P3.0~ P3.5,P3.7是带有内部上拉
电阻的七个双向 I/0引脚 。 P3.6用于固定输入片内比较器
的输出信号并且它作为一通用 I/O引脚而不可访问 。
P3口还用于实现 AT89C2051的各种功能, 如下表 10-1
所示 。
P3口还接收一些用于闪速存储器编程和程序校验的控
制信号 。
5,RST:复位输入 。
6,XTAL1:作为振荡器反相放大器的输入和内部时钟
发生器的输入 。
7,XTAL2:作为振荡器反相放大器的输出 。
表 10-1 P3口的功能
从上述引脚说明可看出, AT89C2051没有提供外部扩
展存储器与 I/O设备所需的地址, 数据, 控制信号, 因此
利用 AT89C2051构成的单片机应用系统不能在 AT89C2051
之外扩展存储器或 I/O设备, 也即 AT89C2051本身即构成
了最小单片机系统 。
P3口引脚 功能
P3.0 RXD(串行输入端口 )
P3.1 TXD(串行输出端口 )
P3.2 INT0(外中断 0)
P3.3 INT1(外中断 1)
P3.4 TO(定时器 0外部输入 )
P3.5 T1(定时器 1外部输入 )
10.2 振荡器和专用寄存器功能
10.2.1振荡器特征
AT89C2051
XTAL1
XTAL2
Vcc
外部
时钟
输入
TTL
NC
AT89C2051
XTAL1
XTAL2
C1
C2
图 10.3 振荡的外部连接方法 图 10.4 外部时钟驱动结构
10.2.2专用功能寄存器 ( SFR)
AT 89C2051中特殊功能寄存器描述如表 10-2所示, 它们
共占用了 19字节, 其功能与 8051SFR功能相对应 。
表 10-2 专用寄存器地址和复位值
寄存器符号 寄存器 地址 复位值 寄存器 符号 寄存器 地址 复位值
B 0F0H 00000000 TMOD 89H 00000000
ACC 0E0H 00000000 TL0 8AH 00000000
PSW 0D0H 00000000 TL1 8BH 00000000
IP 0B8H ××× 00000 TH0 8CH 00000000
P3 0B0H 11111111 TL0 8DH 00000000
IE 0A8H 0×× 00000 SP 82H 00000111
SCON 98H 00000000 DPL 83H 00000000
SBUF 99H ×××××× DPH 84H 00000000
P1 90H 11111111 PCON 87H 0××× 0000
TCON 88H 00000000
10.3 指令约束条件和 CPU的工作方式
10.3.1指令约束条件
AT89C2051是 ATMEL微控制器家族 —— 经济中低价成员 。 它含
有 2K字节的闪速程序存储器, 完全和 MCS— 51结构兼容并可用
MCS— 51指令集进行编程 。 但是在使用有关指令进行编程时, 程
序员必须记住 — 些注意事项 。
跳转或分支相关的全部指令必须进行空间约束, 这样目的地
址就会落在 AT89C2051 2K字节的物理程序存储器空间内 。 这一点
编程人员必须注意 。 例如, 对于 2K字节存储器的 AT89C2051来说,
LJMP 7E0H是一有效的指令而 LJMP 900H则是无效的 。
1,分支指令
对于 LCALL,LJMP,ACALL,AJMP,SJMP,JMP @A+DPTR等
指令, 只要编程人员记住这些分支指令的目的地址落在程序存
储器大小的物理范围内 (89C2051的 00H至 7FFH单元 ),这些无条
件分支指令就会正确执行 。 违背物理空间的限制会引起不可知
的程序出错 。
2,和 MOVX相关的指令, 数据存储器
AT89C2051 包含 128 字 节 内 部 数 据 存 储 器 。 这样,
AT89C205l中的堆栈深度局限于内部 RAM的 128字节范围内 。 它
既不支持外部数据存储器的访问, 也不支持外部程序存储器的
执行 。 因此, 程序中不应包括 MOVX[? ]指令 。
10.3.2 程序存储器加密位
可对芯片上的两个加密位不进行编程 ( U) 或进行
编程 ( P) 来获得下表 10-3所列的功能:
表 10-3 加密位
程序加密位
保护类型
方式 LB1 LB2
1
2
3
U
P
P
U
U
P
没有程序加密功能。
禁止进一步进行闪速编程。
同方式 2,还禁止校验。
10.3.3 CPU工作方式
1,空闲方式
当利用软件使空闲方式位 IDL(PCON,0)= 1时,
单片机进入空闲方式 。 此时, CPU处于休眠状态, 而
片内所有其他外围设备保持工作状态, 片内 RAM和所
有特殊功能寄存器内容保持不变 。
2,掉电方式
掉电方式由掉电方式位 PD(PCON.1)= 1设置 。 此
时, 振荡器停止工作, 设置掉电方式的指令成为最后
执行的 1条指令, 片内 RAM和特殊功能寄存器内容保
持不变 。
10.4 对 Flash存储器的编程
10.4.1编程闪速存储器
AT89C2051内 Flash存储器的编程和校验如图 10.5,图
10.6,图 10.7所示 。
1,内部地址计数器,AT89C2051包含一内部 EEPROM地址
计数器, 它总是在 RST上升沿复位到 000H并在 XTAL1引脚有一
正跳变脉冲时进行计数 。
2,编程算法:要编程 AT89C2051,则建议下列步骤 。
(1) 上电次序:
在和 GND引脚之间加上电源;
设置 RST和 XTAL1为 GND;
所有其它引脚浮空, 至少等待 10ms。
(2) 设置 RST引脚为高 ‘ H’, 设置 P3.2引脚为高 ‘ H’ 。
(3) 对引脚 P3.3,P3.4,P3.5,P3.7加上逻辑电平高
‘ H’ 或低 ‘ L’ 的正确组合, 来选择 EEPROM编程方式如表
10.4中所示中的一种编程操作 。
编程和校验存储器阵列, 由下列 (4)~ (10)点实现:
(4) 在 000H单元对 P1.0~ Pl.7加人数据代码字节 。
(5) 升高 RST到 12V来激活编程 。
(6) 使 P3.2跳变一次来编程 EEPROM阵列中的一字节或
者加密位 。 写字节周期是自身定时的, 一般需用 l.2ms。
(7) 校验已被编程的数据, 使 RST从 12V降到逻辑电平
‘ H’ 并设置 P3,3~ P3,7引脚到正确的电平 。 可在 P1口引
脚输出数据 。
(8) 在下一地址单元编程字节, 使 XTAL1跳变一次提升
内部地址计数器 。 对 P1口引脚加入新数据 。
(9) 重复步骤 5至 8,对整个 2K字节阵列改变数据并提
升地址计数器或者一直到目标文件的结束 。
(10) 下电次序:
设置 XTAL1为, L” 设置 RST为, L”
浮空所有其它 I/0引脚 关闭电源
图 10.5 Flash存储器编程结构 图 10.6 Flash存储器校验结构
+5V
VCC
P1
RSTXTAL1
GND
P3.2
P3.3
P3.4
P3.5
P3.7
VIH
V1H
编程数据
参阅闪速
编程模式表
AT89C2051
VCC
P1
RSTXTAL1
GND
P3.1
P3.2
P3.3
P3.4
P3.5
P3.7
RDY/BSY
PROG
V I H / V P P
编程数据
参阅闪速
编程模式表
增量地址
计数器
+5VAT89C2051
3,数据查询,AT89C2051具有指示写周期结束的数据
查询功能 。 在写周期期间, 对最后写入字节的试图读将令
P1.7上写入数据的操作结束 。 一旦写周期完成, 则全部输
出端的真实数据有效, 同时下一个周期开始 。 数据查询可
在写周期被初始化的任一时刻开始 。
4,RDY/BSY:字节编程的进度还可由, /, 输出信
号监控, 编程期间, P3.1引脚在 P3.2变, 高, 后被拉低来
指示,, 。 P3.1在编程结束时被再次拉高来指示,” 。
5,程序校验:如果加密位 LB1和 LB2没进行编程, 则代
码数据可通过校验数据线读回:
(1) 使 RST从 ‘ L’ 变到 ‘ H’, 复位内部地址计数器
000H。
(2) 对读代码数据加入正确的控制信号并在 P1口引脚
读输出数据 。
(3) 使 XTAL1引脚跳变一次来提升内部地址计数器 。
(4) 在 P1 口引脚读下一个代码数据字节 。
(5) 重复步骤 (3)和 (4)直到读完整个阵列 。
加密位不可直接进行校验 。 加密位的校验可通过对存储
器的校验和写入状态来得到 。
6,片擦除:利用控制信号的正确组合并保持 P3.2引脚
10ms的低电平就可电擦除整个 EEPROM阵列 (2K字节 )和两个加
密位 。 代码阵列在片擦除操作中写入全, 1” 并必须在任何
非空存储器字节可被再编程之前执行 。
7,读特征字节:除 P3.5和 P3.7必须被拉成逻辑低电平
外, 读特征字节的过程和单元 000H,001H以及 002H的正常校
验过程相同 。 返回值如下:
(000H)=1EH指示产品由 ATMEL制造
(001H)=21H指示 89C2051单片机
图 10.7 AT89C2051的校验与编程波形
端口1
P3.2
(P R O G )
RST
(V P P )
P3.4
ENABLE
P3.4
(RDY/BSY)
XTAL1
D A T A  I N D A T A  O U T
t
DVGL
t
GHDX
t
SHGL
t
GHSL
t
GLGH
t
EHSH
t
GHBL
BUSY
t
WC
t
BHIH
t
IHIH
t
EHQZ
t
ELQV
READY
10.4.2 编程接口
闪速阵列中的每一代码字节可进行写入并且
整个阵列可用控制信号的正确组合进行擦除 。 写
操作周期是自身定时的, 一旦初始化它将自动定
时到操作完成 。
表 10-4 闪速编程方式
方式 RST P3.2/PROG P3.3 P3.4 P3.5 P3.7
写代码数据 12V L H H H
读代码数据 H H L L H H
写加密 位 -
1 12V H H H H
位 -2 12V H H L L
片擦除 12V H L L L
读特征字节 H H L L L L
【 例 10-1】 要求,P1口做输出口, 接八个发光二极
管, 编写程序, 使发光二极管循环点亮 。
一, 硬件电路设计
P
1
.
0
P
1
.
1
P
1
.
2
P
1
.
3
P
1
.
4
P
1
.
5
P
1
.
6
P
1
.
7
+5V
AT89C2051
100 100 100 100 100 100 100 100
L1 L2 L3
L4 L5 L6 L7 L8
二, 程序清单
ORG OOOOH
START,MOV A,#01H ;使 L1灯亮, 其它不亮
LOOP, MOV P1,A ;从 P1口输出到发光二极管
MOV R1,#10H ;延时 1秒
DEL1, MOV R2,#200
DEL2, MOV R3,#126
DEL3, DJNZ R3,DEL3
DJNZ R2,DEL2
DJNZ R1,DEL1
RL A ;左移一位, 下一个发光二极管亮
AJMP LOOP ;循环
END