AT89C51单片机基于GAL16V8的I/O接口扩展技术

时间:2022-04-24 06:24:32

AT89C51单片机基于GAL16V8的I/O接口扩展技术

(内蒙古工业大学,内蒙古 呼和浩特 010051)

摘要:该文介绍了一种基于GAL16V8的51系列单片机I/O接口扩展技术,并给出了具体的实现方法及原理。

关键词:单片机;GAL16V8;I/O接口扩展

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)28-8056-02

The I/O Interface Extending Technology of AT89C51 Single-Chip Microcontroller based on GAL16v8

ZHANG Jun-feng

(Inner Mongolia University of Technology, Hohhot 010051, China)

Abstract: The I/O Interface Extending Technology of 51 Single-Chip Microcontroller based on gal16v8 had been introduced in this paper; and a detailed introduction had been given to explain its methods and theories.

Key words: single-chip microcontroller; GAL16V8; I/O interface extending

在应用51系列单片机进行实际项目的开发过程中,开发者常常会面临I/O接口资源紧张的问题。这时就需要对I/O接口进行扩展。通常的做法是使用8255等芯片进行扩展,这样做虽能解决I/O接口资源紧张的问题,但是,同时也增加了主板的成本(需增加专门的扩展芯片,PCB板的面积也随之增加),软件的设计也相对变的复杂;也有人使用现在较流行的CPLD,然而,其成本相对较高。该文以AT89C51为例,介绍一种简单、高效、廉价的51单片机I/O接口扩展技术。

1 设计方法总体介绍

图1为笔者节选自AT89C51单片机实际开发电路的一部分原理图,如图所示,使用一片GAL16V8芯片,既解决了外部数据空间地址译码的问题,同时也配合74LS273把外部设备直接当作外部数据存储单元来处理,使得开发者可以方便的连接足够多的设备到51单片机。下面先介绍GAL16V8芯片,然后详述它在电路中配合74LS273对51单片机I/O接口进行扩展的方法及原理。

2 GAL16V8介绍

GAL是Generic Array Logic的缩写,即通用可编程阵列逻辑。GAL是早期可编程逻辑器件的发展形式,其特点是大多基于EECMOS工艺,结构简单,可编程逻辑多为与、或阵列,价格低廉,适用于简单的数字逻辑电路设计。GAL16V8是GAL家族中适用于5V系统的一种。

3 GAL16V8配合74LS273对51单片机I/O接口进行扩展的方法及原理

在工程开发过程中,由于51单片机的I/O接口资源有限,需要对其进行扩展,本文选用GAL16V8,使其既担当了地址译码的任务,同时又配合74LS273扩展了单片机的I/O接口,把器件和外部数据存储器统一编址,使51单片机能够像访问外部数据存储器一样对器件进行读写操作(本文只介绍了写操作,读操作类似)。

3.1 GAL16V8编程

除了按照原理图进行布线制板外,还需要对GAL16V8进行编程,其详细的编程过程在此不再赘述,只列出编程后各引脚间的逻辑关系,如下:

1) Reduced Equations:

P19 = !(!A13 & !A14 & !A15);

P18 = !(A13 & !A14 & !A15);

P17 = !(!A13 & A14 & !A15);

P16 = !(!P17 & !RD);

P15 = !(!A13 & !A14 & A15 & !WR);

P14 = !(A13 & !A14 & A15 & !RD);

P13 = !(!A13 & A14 & A15 & !WR);

P12 = !(!P17 & !WR);

3.2 51单片机访问器件的示例程序

在图1所示电路中,51单片机使用外部数据存储器访问指令对器件进行访问的Keil C51示例程序如下:

void delay(void); //延时函数声明

#define UCunsigned char //宏定义 unsigned char 为 UC

#define O_CTRL_PORT 0x8000//宏定义I/O扩展芯片(74ls273)片选地址

UC Out_val = 0; //8位控制字变量定义

main( ) //主函数

{Out_val |= 0x08;//打开蜂鸣器

*((UC xdata *) O_CTRL_PORT) = Out_val;//调用外部数据写操作指令对I/O接口扩展

//芯片74LS273写控制字Out_val

delay( ); //延时

Out_val &= 0xF7; //关闭蜂鸣器

*((UC xdata *) O_CTRL_PORT) = Out_val;

while(1);

}

void delay(void)//延时函数

{UC i,j;

for(i = 0; i < 255 ,i++)

for(j = 0; j < 255 ,j++);

}

3.351单片机对74LS273一次写操作的时序分析

如给出的事例程序,单片机的一次外部设备控制操作只是一次对外部数据存储器的写操作,其具体的时序如图2所示,由于是使用此时序去写74LS273,其写入时序需要GAL16V8的参与 (如图1所示)。74LS273写入控制端口CP(上升沿有效)与GAL16V8的第15管脚 ― P15相连,而P15管脚的逻辑表达式为: P15 = !( !A13 & !A14 & A15 & !WR ) (以下用逻辑式1代替);往地址0X8000写入一次控制字Out_val的过程如下:

1) 首先,51单片机P0口输出低位地址0X00 ,并把它锁存在74LS373里,P2口输出高位地址0X80,在P2口输出高位地址0X80的同时,GAL16V8根据逻辑式1 开始译码,由于此时写信号为高,则P15=!(!0 & !0 & 1 & !1) = 1 ;与之相连的74LS273写入控制端口CP也变为高电平。

2) 51单片机写信号变为低,P0口输出控制字Out_val ,同时GAL16V8由逻辑式1决定,使P15 = !(!0 & !0 & 1 & !0) = 0;与之相连的74LS273写入控制端口CP也变为低电平。

3) 51单片机写信号变为高,而在此之后的tWHQX (在写信号由低变为高后,数据总线上有效数据的保持时间,最小值为33ns)时间内P0口输出的控制字Out_val保持有效,同时GAL16V8由逻辑式1决定,使P15 = !(!0 & !0 & 1 & !1) =1;与之相连的74LS273写入控制端口CP也变为高电平。这样就在端口CP产生了一个上升沿,由于74ls273从CP端到输出端的信号最大传播时延为27ns < tWHQX,利用这段时间,74LS273把左边的控制字信号Out_val锁存并输出到输出端。74LS273有8个输出引脚,可以为电路提供8路驱动信号。

参考文献:

[1] 朱善君,孙新亚,古吟东.ASP 单片机接口技术与应用[M].北京:清华大学出版社,2005.

[2] 唐继贤.51单片机工程应用实例[M].北京:北京航空航天大学出版社,2009.

[3] Lattice Semiconductor Corporation.GAL16V8 Data Sheet (16lv8.pdf).Aug 2008

[4] Atmel Corporation. AT89C51 Data Sheet (AT89C51.pdf),2000.

上一篇:Hadoop框架下的容灾系统研究 下一篇:集成Delphi和MathImage实现弹药装载效果可视化