51单片机大容量数据存储器的扩展要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州航空工业管理学院
《单片机原理与应用》
课程设计说明书
10 级自动化专业 1006112 班级
题目51单片机大容量数据存储器的系统扩展姓名杨向龙学号100611234
指导教师王义琴职称讲师
二О一三年六月十日
目录
一、51单片机大容量数据存储器的系统扩展的基本原理 (4)
二、设计方案 (4)
三、硬件的设计 (5)
3.1 系统的硬件构成及功能 (5)
3.2硬件的系统组成 (5)
3.2.1、W241024A (5)
3.2.2、CPLD的功能实现 (5)
3.2.3、AT89C52简介 (6)
3.2.4、SRAM的功能及其实现 (9)
3.3、基本单片机系统大容量数据存储器系统扩展 (9)
五、结论 (13)
六、参考资料 (13)
51单片机大容量数据存储器的系统扩展
摘要:在单片机构成的实际测控系统中,仅靠单片机内部资源是不行的,单片
机的最小系统也常常不能满足要求,因此,在单片机应用系统硬件设计中首先要解决系统扩展问题。
51单片机有很强的外部扩功能, 传统的用IO口线直接控制大容量数据存储器的片选信号的扩展系统存在运行C51编译的程序时容易死机的缺点。
文中介绍了一种改进的基于CPLD的51系列单片机大容量数据存储器的扩展方法,包括硬件组成和软件处理方法。
关键字:W241024A、CPLD、AT89C52、SRAM
一、51单片机大容量数据存储器的系统扩展的基本原理
MCS-51 单片机系统扩展时,一般使用P0 口作为地址低8位(与数据口分时复用),而P2口作为地址高8位,它共有16根地址总线,最大寻址空间为64KB。
但在实际应用中,有一些特殊场合,例如,基于单片机的图像采集传输系统,程控交换机话单的存储等,需要有大于64KB 的数据存储器。
二、设计方案
在以往的扩展大容量数据存储器的设计中,一般是用单片机的IO口直接控制大容量数据存储器的片选信号来实现,但是这种设计在运行以C51编写的程序(以LARGE 方式编译)时往往会出现系统程序跑飞的问题,尤其是在程序访问大容量数据存储器(如FLASH)的同时系统产生异常(如中断),由于此时由IO 口控制的片选使FLASH 被选中而SRAM 无法被选中,堆栈处理和函数参数的传递无法实现从而导致程序跑飞的现象。
文章介绍一种基于CPLD 的大容量数据存储器的扩展系统,避免了上述问题的产生,提高了扩展大容量数据存储器系统的可靠性。
该系统MCU 采用89C52,译码逻辑的实现使用了一片EPM7128 CPLD 芯片,系统扩展了一片128K 的SRAM,一片4M 字节的NOR FLASH,以上芯片均为5V 供电。
第三节硬件设计
3.1 系统的硬件构成及功能
W241024A是128K ×8 位的静态RAM,共需17 根地址线,其A0~A7 接经CPLD 锁存输出的A0~A7,A8~A14 接89C52 的A 8 ~ A 1 4 ,A 1 5 、A 1 6 分别接C P L D 输出的S R A M _ A 1 5 、SRAM_A16;M29F032D是4M ×8 位的NOR 型FLASH,共需22 根地址线。
A0~A14 的接法与W241024A 的相同,A15~A21接经CPLD 锁存输出AL15~AL21;所有数据存储器的读写控制线与M C U 相应的读写控制线相连。
S R A M 和F L A S H 的片选信号由C P L D 内部译码产生:/ C S _ S R A M 接S R A M 的片选,/ C S _ F L A S H 接F L A S H 的片选。
3.2硬件的系统组成
3.2.1、W241024A
W 2 4 1 0 2 4 A 是1 2 8 K x 8 位的静态R A M,共需1 7 根地址线,其A O - A 7 接经 C P L D 锁存输出的 A O - A 7 , A 8 - A 1 4 接8 9 C 5 2 的A 8 - A 1 4 , A 1 5 , A 1 6 分别接C P L D输出的S R A M- A 1 5 , SRAM-A16; M 2 9 F O 3 2 D 是4 M x 8 位的N O R型F L A S H ,共
需2 2 根地址线。
A O - A 1 4 的接法与W 2 4 1 0 2 4 A 的相同,A 1 5 - A 2 1
接经 C P L D 锁存输出的A L 1 5 - A L 2 1 ; 所有数据存储器的读写控制线与M C U相应的读写控制线相连。
S R A M 和 F L A S H的片
选信号由 C P L D内部译码产生: / C S - S R A M 接S R A M 的片
选,/ C S - F L A S H接 F L A S H的片选。
3.2.2、CPLD的功能实现
CPLD就是复杂可编程逻辑器件复杂可编程逻辑器件(CPLD)。
CPLD提供了非常好的可预测性,因此对于关键的控制应用非常理想。
CPLD主要是由可编程逻辑宏单元(MC,Macro Cell)围绕中心的可编程互连矩阵单元组成。
其中MC 结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。
由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。
使用CPLD 器件可以提高系统设计的灵活性,并且可以简化电路设计,节省很多常规电路中的接口器件和I/O 口线。
系统将单片机的地址线、各种控制和
状态信号均引入CPLD,实现系统的地址译码和部分I/O 控制。
系统中C P L D 采用的是MAX7000 系列的EPM7128STC100 -10。
AL15~AL22 为系统锁存出来的高8 位地址,该地址锁存器的地址为:0x7F00;状态缓冲器地址为:0x7F20,通过状态缓冲器可以读取FLASH 的当前状态,判断FLASH 当前状态是忙还是空闲,如果应用系统中还有其它状态信号可以接至该状态缓冲器的输入端。
/CS2~/CS7 可以用作其他器件的片选。
3.2.3、AT89C52简介
89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8Kbytes的可反复擦写的只读程序存储器和256byte的随机数据存储器,器件采用ATMEL公司高密度\非易失性存储技术生产,与标准的51指令系统以8052产品引脚兼容,片内置通用8位中央处理器和FLASH存储单元,功能强大89C52单片机适合于许多较为复杂控制应用场合.
主要性能参数:
.与MCS-51产品指令和引脚完全兼容.8K字节可重擦写FLASH闪速存储器.1000次擦写周期
.全静态操作:0Hz-24 Hz
.三级加密程序存储器
.256*8字节内部RAM .32个可编程I/O口线.3个16位定时/计数器.8个中断源
.可编程串行UART通道.低功耗空闲和掉电模式
功能特性概述:
AT89C52提供以下标准功能:8K字节FLASH闪存存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两极中断结构,一个全双工串行通信口,片内振荡器及时钟电路.同时,AT89C52可降至0 Hz的静态逻辑操作,并支持两种软件可选的节电工作模式:空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
引脚功能说明
.vcc:电源电压
.GND:地
.P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据复用,在访问期间激活内部上拉电阻。
在FLASH编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
.P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时输出一个电流。
.P2口:P2是一个带有内部上拉电阻的双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉倒高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容。
FLASH编程或校验时,P2亦接收高位地址和一些控制信号。
.P3口:P3口是一组带有内部上拉电阻的双向8位I/O。
P3口输出缓冲级可驱动4个TTL逻辑门电路。
对P3口写“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流。
P3口除了作为一般的I/O线外,更重要的用途是它的第二功能
端口引脚第二功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行口输出口)
P3.2 INT0 (外中断0)
P3.3 INT1(外中断1)
P3.4 T0(定时/计数器0)
P3.5 T1(定时/计数器1)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器选通)
.RST:复位输入,当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
.ALE/PROG:当访问外部程序存储器或数据存储器时,ALE输出脉冲用于所村地址的8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外时钟或用于定时目的。
要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。
.PSEN:程序储存允许输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令时,每个机器周期两次有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
.EA/VPP外部访问允许。
欲使CPU仅访问外部程序存储器,EA端必须保持低电平。
.XTAL1:振荡器反向放大的及时内部时钟发生器的输入端。
.XTAL2:振荡器反向放大的输出端。
.特殊功能寄存器:在AT89C52片内存储器中,80H-FFH共128个单元为特殊功能寄存器。
AT89C52除了与AT89C51所有的定时/计数器和定时/计数器外,还增加了一个定时/计数器2。
定时/计数器2的控制和状态位位于T2CON T2MOD,寄存器对是定时器2在16位捕捉或16位自动重装方式下捕捉/自动重装载寄存器。
.中断寄存器:AY89C52有6个中断源,2个中断优先级,IE寄存器控制各中断位,IP寄存器中6个中断源的每一个可定为2个优先级。
.数据存储器AT89C52有256个字节的内部RAM,80H-FFH高128个字节与特殊功能寄存器地址是重叠的,也就是高128字节的RAM和特殊功能寄存器的地址是相同的,但物理上它们是分开的。
.定时器0和定时器1:AT89C52的定时器和定时器1的工作方式与AT89C51
相同。
.定时器2:定时器是一个16位定时/计数器。
它既可当定时器使用,也可作为外部时间计数器使用,其工作方式由特殊功能寄存器T2CON的C/T2位选择。
定时器2有三种工作方式:捕捉方式,自动重装载方式和波特率发生器方式,工作方式由T2CON的控制位来选择。
见表
RCLK+TCLK CP/RL2 TR2 MODE
0 0 1 16-BITAUTO-RELOAD
O 1 1 16BIT-CAPUTURE
1 X 1 BAUD RATE ENERATOR
X X 0 OFF
定时器2由两个8位寄存器TH2和TL2组成,在定时器工作方式中,每个机器周期TL2寄存器的值加1,由于一个机器周期由12个振荡时钟构成,因此,计数速率为振荡频率的1/12。
在计数工作方式时,当T2引脚上外部输入信号产生由1至0下降沿时,寄存器的值加1,在这种方式下,每个机器周期的5SP2期间寄存器加1。
由于识别1至0的跳变需要2个机器周期,因此,最高计数速率为振荡的1/24。
为确保采样的正确性,要求输入的电平在此变化前至少保持一个完整周期的时间,以保证输入信号至少被采样一次。
图AT89C52框图
3.2.4、SRAM的功能及其实现
1 2 8 K 的S R A M 被S R A M _ A 1 5 和S R A M _ A 1 6 分成4 个B A N K ,每个B A N K 均为3 2 K ,其中B A N K 0 地址范围是:0x0000~0x7EFF,当A15 为0 时BANK0 被选中,BANK0 可用来存储用户定义的各种变量,以LARGE 方式编译的C51 用户函数的参数传递也在该区实现,只要设置C51 编译器的片外SRAM 的大小为0x7F00 字节(32K -256 字节),起止地址为:0x0000。
这样当系统在访问外部大容量数据存储器(如4M 的F L A S H )并且系统产生中断时,由于系统在函数调用时自动使A15 为0 ,故此时BANK0 是可用的,这样保证了系统在这种情况下能稳定的运行。
由于访问B A N K 1 ~ B A N K 3 时A 1 5 必须为1 ,故BANK1~BANK3 的地址范围均为:0x8000~0xFEFF,通过SRAM_A15 和SRAM_A16 来区分它们是属于哪个BANK 的,访问BANK1~BANK3 的前提是AL22 为0 。
BANK1~BANK3 可用来存储用户数据。
当AL22 和A15 均为1 时4M 的FLASH 被选中,FLASH 被AL15~AL21 分成了128 页,每页为32K。
3.3、基本单片机系统大容量数据存储器系统扩展
MCS-51单片机系统扩展时,一般使用P0口作为地址低8位(与数据口分时复用),而P2口作为地址高8位,它共有16根地址总线,寻址空间为64KB。
但在实际应用中,有一些特殊场合,例如,语音信号的采集,程控交换机话单的存储,地形图信号的收取等,需要有大于64KB的数据存储器。
文章根据作者实际使用的应用系统,介绍一种大容量数据存储器的扩展系统。
该系统主机采用51芯片,扩展了三片62256,共96KB的动态数据存储器。
系统的硬件组成:
62256是32K×8位的数据存储器,共有15根地址线,扩展96KB数据存储器的硬件连接原理如图1所示:为了给系统进行其它外设的扩展,占用了系统14根地址线。
三片62256的第15根地址线都与8031的I/O口P1.0相连,而62256(1)的片选端与P1.1相连,62256(2)的片选端与P1.2相连,62256(2)的片选端与P1.3相连,这样的连接方式使96KB的存储空间分为6页,每片62256都占用2页存储空间。
各片地的地址分配如下:
62256(1):
P1.0=0 P1.1=0 P1.2=1 P1.3=1 0000H~3FFFH
P1.0=1 P1.1=0 P1.2=1 P1.3=1 0000H~3FFFH
62256(2):
P1.0=0 P1.1=1 P1.2=0 P1.3=1 0000H~3FFFH
P1.0=1 P1.1=1 P1.2=0 P1.3=1 0000H~3FFFH
62256(3):
P1.0=0 P1.1=1 P1.2=1 P1.3=0 0000H~3FFFH
P1.0=1 P1.1=1 P1.2=1 P1.3=0 0000H~3FFFH
软件处理方法:
当访问数据存储器时,采用分页查找的方法,首取找到要访问的页数,
再打开该页,在该页内查找某一单元。
软件上打开某页都事先编好子程序。
要访问96KB的存储空间,即地址范围为00000H-17FFFH,显然16位地址寄存器DPTR是无法寄存的,这里将地址装入PAM的起始三个连续单元中,即62256(1)起始三个单元中的内容(即要访问的某单元地址),将该数据除以4000H,得商即为该单元的页数,余数即为该页中的地址,然后利用MCS-51指令中的散转指令打开页,访问页中的单元。
具体软件实现见下面的程序清单。
#BUF EQU #30H
CLR P1.0
CLR P1.1
SETB P1.2
SETB P1.3
MOV DPTR,#0
MOV R7,#3
MOV R0,#20H
RDPAGE:
MOVX A,@DPTR
MOV @R0,A
INC R0
DJNZ R7,RDPAGE
LCALL FPAGE
MOV B,#3
MUL AB
MOV DPTR,#TABLE
JMP @A+DPTR
FPAGE:
MOV A,21H
ANL A,@0F0H
ADD A,20H
SWAP A
MOV B,#1
DIV AB
PUSH ACC
MOV A,21H
ANL A,0FH
XCH A,B
MOV 21H,A
POP ACC
RET
TABLE:
LJMP PAGE1
LJMP PAGE2
LJMP PAGE2
LJMP PAGE4
LJMP PAGE5
LJMP PAGE6
CLR P1.1
SETB P1.2
SETB P1.3
LJMP WRRAM
PAGE3:
CLR P1.0
SETB P1.1
CLR P1.2
SETB P1.3
LJMP WRRAM
PAGE:
SETB P1.1
SETB P1.2
CLR P1.3
LJMP WRRAM
WRRAM:
MOV DPH,21H
MOV R0,#BUF
MOV A,@R0
MOVX @DPTR,A
第四节系统的软件设计
系统主程序设计
如用KEIL 编译C51 程序时,首先设置项目的编译模式为L A R G E 模式,并设置片外X R A M 的相关参数为:S T A R T :0x0000 ,SIZE:0x7F00。
访问BANK0 时无需编写子程序,系统可以直接访问。
访问S R A M 的B A N K 1 ~ B A N K 3 步骤为:①锁存高8 位地址使AL22 为0 ,设置BANK 值(要访问SRAM的绝对物理地址除于3 2 K ,商为B A N K 值,余数为B A N K 内的偏移地址)②在0x8000~0xFEFF 地址范围内操作SRAM(A15=1)Write_Sram_Bank123 函数的功能为写一个字节数据至片外SRAM 的BANK1~BANK3,Read_Sram_Bank123 函
数的功能是从SRAM 的BANK1~BANK3 读一个字节数据。
相关C 5 1 示例代码如下:
void Write_Sram_Bank123(unsigned long address,
unsigned char val)
{
unsigned char bank;unsigned int addr_bank;
bank = address / 0x8000;// 商为BANK 值。
if ((bank > = 1 ) && (bank <= 3))
{
addr_bank = address % 0x8000;// 余数
;为B A N K 内地址。
XBYTE [0x7f00] = bank;// AL22=0,
;设置B A N K 值。
XBYTE[0x8000+addr_bank] = val; // 写S R A M 。
}
}
unsigned char Read_Sram_Bank123(unsigned longaddress)
{
unsigned char bank;unsigned int addr_bank;
bank = address / 0x8000;// 商为BANK 值。
if ((bank > = 1 ) && (bank <= 3))
{
addr_bank = address % 0x8000;// 余数为B A N K 内地址。
XBYTE [0x7f00] = bank;// AL22=0,设置BANK值。
return XBYTE[0x8000+ addr_bank];// 读S R A M 。
}
else return 0xff;
}
访问FLASH 的步骤如下:①锁存高8 位地址使AL22 为1,同时设置要访问的7 位页码值(要访问FLASH 的绝对物理地址除于3 2 K ,商为页码值,余数为页内的偏移地址)②在0 x 8 0 0 0 ~0 x F E F F 地址范围内操作F L A S H (A 1 5 = 1 )。
Write_Flash 函数实现了往4M FLASH 写一个字节的功能;Read_Flash 函数的功能是在FLASH 里读取一个字节内容。
相关C 5 1 示例代码如下:
void Write_Flash(unsigned long address,unsignedchar val)
{
unsigned char data page,unsigned int data addr_page;
page = address / 0x8000;// 商为页码值。
addr_page = address % 0x8000;// 余数为页内地址。
XBYTE [0x7f00] = 0x80 + page; // AL22=1,并设置page 值。
XBYTE[0x8000+addr_page] = val;// 写FLASH。
}
unsigned char Read_Flash(unsigned long address)
{
unsigned char data page,unsigned int data
addr_page;
page = address / 0x8000;// 商为页码值。
addr_page = address % 0x8000;// 余数为页内地址。
XBYTE [0x7f00] = 0x80 + page;// AL22=1,并设置page 值。
return XBYTE[0x8000+addr_page];// 读FLASH
}
五、结论
使用本方法可轻易地为MCS-51单片机扩展大容量的数据存储器,这对于数据量大的数据采集系统有着非常大的意义。
采用了上述硬件设计方法及软件处理方法,实践证明基于这种方法扩展大容量数据存储器的单片机应用系统具有对数据存储器操作简便、系统运行稳定的特点,解决了系统在访问大容量数据存储器并且产生异常时程序跑飞的问题。
而且,由于CPLD具有可编程重特性,因而可以根据需要方便地改变内部逻辑功能,而且简单易行,易于系统调试及升级,同时具有很高的性价比。
六、参考资料
[1]百度百科/view/2251929.htm
[2] 王艳,靳孝峰单片机原理与应用北京航空航天大学出版社2009
[3] 黄正瑾,CPLD系统设计技术入门与应用[M]. 北京: 电子工业出版社, 2002。