计算机组成原理--8255 的直接连接方法

  8255 是单片微型计算机系统中,用来扩充接口的芯片。
  用上一片 8255,就可以为系统增加 3 个 8 位的 IO 接口。
  在单片机的教材上,总是使用 “三总线” 的方式来连接 8255。
  在这样的条件下,传输数据的速度,确实是比较快的,一般用 2 个机器周期,就可以读/写一次 8255。
  但是,采用这种形式,电路设计则是相当麻烦的。首先是必须加上一个锁存器芯片(74LS373),并且,还要使用单片机的 P0、P2 引脚,以及 P3.6、P3.7。占用的引脚,也太多了吧。 而且,这些引脚,都是固定使用的,不可变通。
  占用单片机自身 2 个半的并行接口,仅仅换来 3 个并行接口,真有点得不偿失啊,呵呵

  如果搞清楚了 8255 的读写时序,那么,使用单片机的接口引线 “直接控制” 8255,效果则要好的多。下图就是一个 “直接控制” 8255 的电路。

  由图可见,仅仅使用了单片机一个半的并行接口(P2 和 P3 的四个引脚)和 8255 进行连接,就可以了。这不但节省了引脚数目,而且非常灵活。在设计实际应用的电路板时,可以随意的就近使用引脚,而不必拘泥于图中所画的 P2、P3 等引脚。

  如果想把上图中 8255 PC 所接入的拨动开关所设定的开关量输入进来,再从 8255 PA 输出,驱动 LED 发光二极管,使用如下程序即可。

;汇编语言,直接驱动 8255
;-----------------------------------
sbit	RD_8255 = P3^4		;设定相关引脚
sbit	WR_8255 = P3^5
sbit	A0_8255 = P3^6
sbit	A1_8255 = P3^7
;-----------------------------------
	ORG 	00H
	MOV 	P3, #255	;关闭8255
	MOV 	P2, #8BH	;PA方式0输出, PB PC输入
	SETB    A1_8255		;选定控制寄存器
	SETB	A0_8255
	CLR 	WR_8255		;写入控制寄存器
	SETB	WR_8255
;---------------------
LOOP:
	MOV 	P2, #255	;输出1
	SETB	A1_8255		;选定PC
	CLR 	A0_8255
	CLR 	RD_8255		;读
	NOP 			;稍延时,以保证宽度
	MOV 	A, P2		;读出
	SETB	RD_8255		;关闭8255
;---------------------
	CLR 	A1_8255		;选定PA
	CLR 	A0_8255
	MOV 	P2, A		;写
	CLR 	WR_8255		;写入
	SETB	WR_8255
;---------------------
	SJMP	LOOP
END
;-----------------------------------

  程序的运行结果,可见上面给出的电路图。

  如果有人喜欢用 C 语言,那么,就用下面的吧。

#include<reg52.h> 

sbit	RD_8255 = P3^4;
sbit	WR_8255 = P3^5;
sbit	A0_8255 = P3^6;
sbit	A1_8255 = P3^7;

main()
{
    char  aa;
    P3 = 255;
    P2 = 0x8B;		//控制字: PA输出, PB PC输入
    A1_8255 = 1; A0_8255 = 1;	//选中控制寄存器
    WR_8255 = 0; WR_8255 = 1;	//写
    while(1)  {
      P2 = 255;			        //先输出1
      A1_8255 = 1; A0_8255 = 0;	//选中PC
      RD_8255 = 0;
      aa = P2;
      RD_8255 = 1;	        	//读
      P2 = aa;		        	//这就是刚刚读入的
      A1_8255 = 0; A0_8255 = 0; //选中PA
      WR_8255 = 0; WR_8255 = 1; //写
    } 
}

  执行这个 C 程序,单片机工作的画面,也可见上面给出的电路图。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  因为没有使用 “三总线” 方式,所以,也就没有接口地址的问题。
  那么,一般的单片机教材中所说的片外地址,就没有用了。
  而且,下面这些 C 语言中的头文件、宏定义,也都用不上了:
   #include<absacc.h>
   #define PA XBYTE[0xE000]         //PA口地址 
   #define PB XBYTE[0xE001]        //PB口地址 
   #define PC XBYTE[0xE002]        //PC口地址 
   #define CON XBYTE[0xE003]     //控制字地址 

  呵呵,经过做而论道这么一弄,书上的好多知识,统统都没有用了,罪过罪过 ...

  按照这种方式,读写 IO 口外接设备的速度,确实是降低了一些,多用了几个微秒。但是,对于速度要求不太敏感的场合,还是非常适用的。
  按照这种方式,还节省了一个锁存器芯片,那么,PCB 板的面积,也可以缩小,这就直接使硬件成本得到降低。
  有时,一个产品,是否能够占领市场,成本才是关键,读写速度慢上几个微秒,对性能的影响极其微小。

--本文完--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值