外设芯片学习之路_8155原理分析和仿真实验

1.芯片概述

8155 是一种通用的多功能可编程RAM/IO 扩展器,可编程是指其功能可由计算机的指令来加以改变。8155 片内不仅有3 个可编程并行I/O 接口(A 口、B 口为8 位、C 口为6 位),而且还有256B SRAM 和一个14 位定时/计数器,常用作单片机的外部扩展接口,与键盘、显示器等外围设备连接。

2.芯片引脚分析

8155各引脚功能说明如下:
RESET:复位信号输入端,高电平有效。复位后,3个I/O口均为输入方式。
AD0~AD7:三态的地址/数据总线。与单片机的低8位地址/数据总线(P0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。
RD:读选通信号,控制对8155的读操作,低电平有效。
WR:写选通信号,控制对8155的写操作,低电平有效。
CE:片选信号线,低电平有效。
IO/M :8155的RAM存储器或I/O口选择线。当IO/M =0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/M =1时,选择 8155的I/O口,AD0~AD7上的地址为8155 I/O口的地址。
ALE:地址锁存信号。8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及 ,IO/ 的状态都锁存到8155内部锁存器。因此,P0口输出的低8位地址信号不需外接锁存器。
PA0~PA7:8位通用I/O口,其输入、输出的流向可由程序控制。
PB0~PB7:8位通用I/O口,功能同A口。
PC0~PC5:有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。
TIMER IN:定时/计数器脉冲输入端。
TIMER OUT:定时/计数器输出端。
VCC:+5V电源。

3.8155的地址编码及工作方式

在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线 提供, CE=0,选中该片。
当 CE=0,IO/M =0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;当 CE=0,IO/M =1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定,如表6-6所示。这时,A、B、C口的口地址低8位分别为01H、02H、03H(设地址无关位为0)。
下表为8155芯片的I/O口地址:
在这里插入图片描述

8155的A口、B口可工作于基本I/O方式或选通I/O方式。C口可工作于基本I/O方式,也可作为A口、B口在选通工作方式时的状态控制信号线。当C口作为状态控制信号时,其每位线的作用如下:
PC0:AINTR(A口中断请求线)
PC1:ABF(A口缓冲器满信号)
PC2:(A口选通信号)
PC3:BINTR(B口中断请求线)
PC4:BBF(B口缓冲器满信号)
PC5: (B口选通信号)
8155的I/O工作方式选择是通过对8155内部命令寄存器设定控制字实现的。命令寄存器只能写入,不能读出,命令寄存器的格式如图6-16所示。
在ALT1~ALT4的不同方式下,A口、B口及C口的各位工作方式如下:
ALT1:A口,B口为基本输入/输出,C口为输入方式。
ALT2:A口,B口为基本输入/输出,C口为输出方式。
ALT3:A口为选通输入/输出,B口为基本输入/输出。PC0为AINTR,PC1为ABF,PC2为 ,PC3~PC5为输出。
ALT4:A口、B口为选通输入/输出。PC0为AINTR,PC1为ABF,PC2为 ,PC3为BINTR,PC4为BBF,PC5为 。
下图为8155命令寄存器格式
在这里插入图片描述

8155内还有一个状态寄存器,这里这节没用到,就不多说明了。

4.Proteus仿真实验

上面的虽然都是知识点,但是对接下来的理解很有帮助,接下来我们只是简单的设计一下,对8155的端口的输出和输入设计,用到PA和PB口,用PA做输出,PB做输入,理解这次的实验后,你会对8155控制有些许的了解,基本可以设计出自己想要的东西,接下来说一下设计的内容,一对数码管,显示一样的内容,这里本来想做动态数码管的,但是想让8155的输入和输出都涉及到,所以就没做动态数码管了,理解的同学自己设计动态数码管即可,接下来就开始吧。
首先先画图,Proteus仿真图如下:
在这里插入图片描述
接下来就是程序了,也比较简单,就是开个定时器,让它自己跑时间,按下按键不让数码管显示,这里需要注意的是,COMMAND、PA和PB的地址,地址是根据连接线来进行设置的,这里的连接线得到的地址是0x1F00开始的,根据不同的连接方式可以修改相应的地址,这个地址可以去查询51单片机的手册,接下来就是配置了,根据上面的图进行PA和PB的输入输出设置,最后编写出如下代码:

#include "reg52.H"
#include "absacc.h"

#define uchar unsigned char
#define uint unsigned int

#define COMMAND XBYTE[0x1F00]  //控制位地址
#define PA XBYTE[0x1F01]	   //PA地址
#define PB XBYTE[0x1F02]	   //PB地址

sbit cs = P2^5;	//片选
sbit om = P2^4;	//IO选择线

uchar miao=0;	//set_cnt 0正常显示,1设置时,2设置分,3设置秒
uchar time0_cnt=0; //用于定时器统计进入几次

uchar code table[]={  //共阴数码管段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delayms(uint xms);
void display1(uchar miao);
void init(void);
void keyscan(void);

void main()
{
	init();	//开启定时器,用于增加时间
	
	cs=0;	//片选拉低
	om=1;	//IO使能
	COMMAND=0X01;	//设置PA为输出,PB为输入
	
	PB=0XFF;
	while(1)
	{	
		keyscan();	//按键扫描
	}
}

//按键扫描
void keyscan(void) 
{
	if(PB==0x00)	//按键按下
		PA=0x00;
	else
		PA=table[miao];	//显示内容
}

//初始化定时器
void init(void)
{
	TMOD=0x11;	 //定时器模式
	TH0=(65536-50000)/256;	 //初始值,50ms
	TL0=(65536-50000)%256;
	EA=1;	//中断总开关
	ET0=1;	//定时器中断开启
	TR0=1;	//定时器开启
}

//定时器0执行函数
void T0_time()interrupt 1
{
	TH0=(65536-50000)/256;	//初始值,50ms
	TL0=(65536-50000)%256;
	
	time0_cnt++;   //定时器进入一次
	
	if(time0_cnt>=20)  //50ms*20 = 1S,所以1S进入一次
	{
		time0_cnt=0;//重新计数
		miao++;	//秒加1
		if(miao>=10)
		{
			miao=0;	 //清除秒
		}
	}
}

运行结果如下图:
在这里插入图片描述

画出仿真图可以直接运行代码,想偷懒的同学可以直接从这个地址下载进行下载,刚接触不久8155,有任何问题欢迎提出!
仿真图和程序下载地址:https://download.csdn.net/download/qq_38390060/12839788

  • 13
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哲科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值