当前位置:文档之家› 8255的应用(C语言版本)

8255的应用(C语言版本)

8255的应用(C语言版本)
8255的应用(C语言版本)

【实例24】用8243扩展I/O端口

#include

sbit ContrBit0=P1^0;

sbit ContrBit1=P1^1;

sbit ContrBit2=P1^2;

sbit ContrBit3=P1^3;

sbit PROG=P1^4;

sbit CS=P1^5;

char driver8243(char sele_P,char sele_M,char out_data)

{

char in_data=0;

char data_buf;

PROG=1;

//置PROG为高电平

//----------------------------------------------开始写控制字-----------------------------------------------

if((sele_P&0x01)==0) //将控制字最低位送到8243的p2.0

ContrBit0=0;

else

ContrBit0=1;

if((sele_P&0x02)==0) //将控制字第二位送到8243的p2.1

ContrBit1=0;

else

ContrBit1=1;

//以上两位共同指定端口地址

//----------------------------------------写端口工作模式控制字----------------------------------------

if((sele_M&0x01)==0) //将端口工作模式控制字低位送到8243的p2.2

ContrBit2=0;

else

ContrBit2=1;

if((sele_M&0x01)==0) //将端口工作模式控制字高位送到8243的p2.3

ContrBit3=0;

else

ContrBit3=1;

//完成写控制字

PROG=0;

//在PROG上产生下降沿

switch(sele_M&0x03) //判断工作模式

{

case 0: break;

//sele_M=B00为输入,不处理,等待上升沿

case 1: data_buf=out_data;

break;

//sele_M=B01为输出,直接送数据

case 2: data_buf=out_data;

break;

//sele_M=B10为逻辑或,直接送数据

case 3: data_buf=out_data;

break;

//sele_M=B11为逻辑与,直接送数据

}

PROG=1;

//产生上升沿

if((sele_M&0x03)==0) //sele_M=B00为输入,接收数据

in_data=(data_buf&0x0F);

return(in_data);

//sele_M=B00,返回接收到的数据

}

//sele_M!=B00,返回0

void main( void)

{

char receive_data;

receive_data=driver8243(1,0,5);

}

【实例25】用8255A扩展I/O口

//----------------------------------------------------------------------------------------------------

// 函数名称:rd_PA

// 输入函数:无

// 输出参数:PA_data,PA输入的数据

// 功能说明:驱动PA实现输入功能,读入PA的并行数据

//----------------------------------------------------------------------------------------------------

unsigned char rd_PA(void) //读PA

(1)管脚定义及函数声明

//-------------------------------------------函数声明,管脚定义------------------------------------------- #include

#include

#define a8255_PA XBYTE[0x7F7C] //PA地址

#define a8255_PB XBYTE[0x7F7D] //PB地址

#define a8255_PC XBYTE[0x7F7E] //PC地址

#define a8255_CON XBYTE[0x7F7F] //控制字地址

unsigned char bdata IO_flags;

//用于表示PA、PB、PC的当前输入输出状态

//内容不能被其他程序改写

sbit IO_flagsA=IO_flags^0;

//PA的当前输入输出状态

sbit IO_flagsB=IO_flags^1;

//PB的当前输入输出状态

sbit IO_flagsC=IO_flags^2;

//PC的当前输入输出状态

unsigned char const cfg_table[8]=

{

0x80, //10000000b, c=out b=out a=out 0x90, //10010000b, c=out b=out a=in

0x82, //10000010b, c=out b=in a=out 0x92, //10010010b, c=out b=in a=in

0x89, //10001001b, c=in b=out a=out 0x99, //10011001b, c=in b=out a=in

0x8B, //10001011b, c=in b=in a=out 0x9B, //10011011b, c=in b=in a=in }

unsigned char rd_PA(void);

//读PA

unsigned char rd_PB(void);

//读PB

unsigned char rd_PC(void);

//读PC

void wr_PA(unsigned char PA_data);

//写PA

void wr_PB(unsigned char PB_data);

//写PB

void wr_PC(unsigned char PC_data);

//写PC

void set_PC(unsigned char PC_num);

//PC位操作,置位,PC_num为端口号0~7

void clr_PC(unsigned char PC_num);

//PC位操作,复位,PC_num为端口号0~7

void PABC_config(void);

//写8255A控制字

(2)端口A、B、C读写函数

{

unsigned char PA_data;

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

do

{

IO_flagsA=1;

//置PA状态标志位为高--输入

IO_flags=ACC;

PABC_config();

//调用配置子程序,完成对8255的设置

ACC=IO_flags;

}

while(IO_flagsA==0);

//判断状态标志位是否为高

//控制字设置完成

PA_data=a8255_PA;

//把PA的数据读到PA_data

return(PA_data);

//返回PA_data

}

//---------------------------------------------------------------------------------------------------- // 函数名称:rd_PB

// 输入函数:无

// 输出参数:PB_data,PB输入的数据

// 功能说明:驱动PB实现输入功能,读入PB的并行数据

//---------------------------------------------------------------------------------------------------- unsigned char rd_PB(void) //读PB

{

unsigned char PB_data;

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

do

{

IO_flagsB=1;

//置PB状态标志位为高--输入

IO_flags=ACC;

PABC_config();

//调用配置子程序,完成对8255的设置

}

while(IO_flagsB==0);

//判断状态标志位是否为高

//控制字设置完成

PB_data=a8255_PB;

//把PB的数据读到PB_data

return(PB_data);

//返回PB_data

}

//---------------------------------------------------------------------------------------------------- // 函数名称:rd_PC

// 输入函数:无

// 输出参数:PC_data,PC输入的数据

// 功能说明:驱动PC实现输入功能,读入PC的并行数据

//---------------------------------------------------------------------------------------------------- unsigned char rd_PC(void) //读PC

{

unsigned char PC_data;

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

do

{

IO_flagsC=1;

//置PC状态标志位为高--输入

IO_flags=ACC;

PABC_config();

//调用配置子程序,完成对8255的设置

//ACC=IO_flags;

}

while(IO_flagsC==0);

//判断状态标志位是否为高

//控制字设置完成

PC_data=a8255_PC;

//把PC的数据读到PC_data

return(PC_data);

//返回PC_data

}

//---------------------------------------------------------------------------------------------------- // 函数名称:wr_PA

// 输入函数:PA_data,送PA输出的数据

// 输出参数:无

// 功能说明:驱动PA实现输出功能,输出数据到PA

//---------------------------------------------------------------------------------------------------- void wr_PA(unsigned char PA_data) //写PA

{

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

{

IO_flagsA=0;

//置PA状态标志位为低--输出

IO_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

PABC_config();

//调用配置子程序,完成对8255的设置

ACC=IO_flags;

}

while(IO_flagsA==1);

//判断状态标志位是否为高,

//为高,设置未完成,需从新设置

a8255_PA=PA_data;

//将PA_data的内容送到PA

}

//---------------------------------------------------------------------------------------------------- // 函数名称:wr_PB

// 输入函数:PB_data,送PB输出的数据

// 输出参数:无

// 功能说明:驱动PB实现输出功能,输出数据到PA

//---------------------------------------------------------------------------------------------------- void wr_PB(unsigned char PB_data) //写PB

{

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

{

IO_flagsB=0;

//置PB状态标志位为低--输出

IO_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

PABC_config();

//调用配置子程序,完成对8255的设置

ACC=IO_flags;

}

while(IO_flagsB==1);

//判断状态标志位是否为高,为高,设置未完成,

//需从新设置

a8255_PB=PB_data;

//将PB_data的内容送到PB

}

//---------------------------------------------------------------------------------------------------- // 函数名称:wr_PC

// 输入函数:PC_data,送PC输出的数据

// 输出参数:无

// 功能说明:驱动PC实现输出功能,输出数据到PC

//---------------------------------------------------------------------------------------------------- void wr_PC(unsigned char PC_data) //写PC

{

ACC=IO_flags;

//把状态标志字读到ACC便于进行位操作

{

IO_flagsC=0;

//置PC状态标志位为低--输出

IO_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

PABC_config();

//调用配置子程序,完成对8255的设置

ACC=IO_flags;

}

while(IO_flagsC==1);

//判断状态标志位是否为高,

//为高,设置未完成,需从新设置

a8255_PC=PC_data;

//将PC_data的内容送到PC

}

(3)端口C配置函数

//---------------------------------------------------------------------------------------------------- // 函数名称:set_PC

// 输入函数:PC_num,范围0~7

// 输出参数:无

// 功能说明:对PC进行位操作,置PC(PC_num)为高

//----------------------------------------------------------------------------------------------------

void set_PC(unsigned char PC_num)

{

ACC=IO_flags;

IO_flagsC=0;

ACC=IO_flags;

PC_num=PC_num<<1;

PC_num=(PC_num|0x01);

a8255_CON=PC_num;

}

//---------------------------------------------------------------------------------------------------- // 函数名称:clr_PC

// 输入函数:PC_num,范围0~7

// 输出参数:无

// 功能说明:对PC进行位操作,清PC(PC_num)为低

//----------------------------------------------------------------------------------------------------

void clr_PC(unsigned char PC_num)

{

ACC=IO_flags;

IO_flagsC=1;

ACC=IO_flags;

PC_num=PC_num<<1;

PC_num=(PC_num&0xFE);

a8255_CON=PC_num;

}

(4)写控制字函数

//---------------------------------------------------------------------------------------------------- // 函数名称:PABC_config

// 功能说明:写8255A的控制字寄存器

//----------------------------------------------------------------------------------------------------

void PABC_config(void)

{

a8255_CON=cfg_table[IO_flags];

}

【实例26】用8155扩展I/O口

(1)相关函数声明及管脚定义

//-----------------------------------函数声明,管脚定义----------------------------------------*/ #include

#include

#define a8155_PA XBYTE[0x7E00] //控制字地址

#define a8155_PB XBYTE[0x7E01] //PA地址

#define a8155_PC XBYTE[0x7E02] //PB地址

#define a8155_CON XBYTE[0x7E03] // PC地址

#define Timer_A XBYTE[0x7E04] // 定时器寄存器A

#define Timer_B XBYTE[0x7E05] // 定时器寄存器B

#define mem_head XBYTE[0x7F00] // 存储器首地址

unsigned char bdata IO_flags;

//用于表示PA、PB、PC的当前输入输出状态

//内容不能被其他程序改写

sbit IO_flagA=IO_flags^0;

//PA的当前输入输出状态

sbit IO_flagB=IO_flags^1;

//PB的当前输入输出状态

sbit IO_flagC=IO_flags^2;

//PC的当前输入输出状态

sbit IO_flagC1=IO_flags^3;

//PC的当前输入输出状态

sbit Int_flagA=state_flags^4;

//PA的当前输入输出状态

sbit Int_flagB=state_flags^5;

//PB的当前输入输出状态

sbit Timer_flag1=state_flags^6;

sbit Timer_flag2=state_flags^7;

//Timer 的状态置位表示计数中

unsigned char rd_mem(unsigned char mem_ad);

//读存储器

void wr_mem(unsigned char mem_ad,unsigned char mem_data);

//写存储器

char rd_PA(void);

//读PA

char rd_PB(void);

//读PB

char rd_PC(void);

//读PC

void wr_PA(unsigned char PA_data);

//写PA

void wr_PB(unsigned char PB_data);

//写PB

void wr_PC(unsigned char PC_data);

//写PC

void Dint_PA(void);

//关端口A中断

void Eint_PA(void);

//开端口A中断

void Dint_PB(void);

//关端口B中断

void Eint_PB(void);

//开端口B中断

void setting_PC0int(void);

void setting_PC4int(void);

void start_timer(void);

//开始计数器计数

void stop_timer(void);

//停止计数器计数

void setting_zero_stop(void);

//设定计数到零停止计数

int rd_timer(void);

//读计数值

void setting_timerout_mode(unsigned char mode);

//设定输出模式

(2)读写外RAM函数

读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下://-------------------------------------------------------------------------------------------------------------- // 函数名称:rd_mem

// 输入函数:mem_ad,范围0~255

// 输出参数:mem_data,存储对应数据

// 功能说明:读外部RAM,输入相对地址,返回数据

//-------------------------------------------------------------------------------------------------------------- unsigned char rd_mem(unsigned char mem_ad) //读存储器

{

unsigned char mem_data;

unsigned int AD_mem;

AD_mem=&mem_head;

AD_mem=AD_mem+mem_ad;

mem_data=XBYTE[AD_mem];

return(mem_data);

//--------------------------------------------------------------------------------------------------------------

// 函数名称:wr_mem

// 输入函数:mem_ad,mem_data 相对地址和数据

// 输出参数:无

// 功能说明:写数据到外部RAM,把数据写到相应的地址

//--------------------------------------------------------------------------------------------------------------

void wr_mem(unsigned char mem_ad, unsigned char mem_data) //写存储器

{

unsigned int AD_mem;

AD_mem=&mem_head;

AD_mem=AD_mem+mem_ad;

XBYTE[AD_mem]=mem_data;

}

(3)端口PA、端口PB以及端口PC的读写设置函数

端口PA、端口PB以及端口PC的读写设置函数主要完成对8155端口的输入输出设置及

数据读写,程序代码如下:

//----------------------------------------------------------------------------------------------------

// 函数名称:rd_PA

// 输入函数:无

// 输出参数:PA_data

// 功能说明:返回PA数据

//----------------------------------------------------------------------------------------------------

char rd_PA(void) //读PA

{

unsigned char PA_data;

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

do

{

IO_flagA=0;

//置PA状态标志位为低--输入

state_flags=ACC;

a8155_CON=state_flags;

//重写控制字,完成对8155的设置

}

while(IO_flagA==1);

//判断状态标志位是否为高

//控制字设置完成

PA_data=a8155_PA;

//把PA的数据读到PA_data

return(PA_data);

//返回PA_data

//----------------------------------------------------------------------------------------------------

// 读PB、PC的函数:rd_PB和rd_PC程序代码与rd_PA类似,不再赘述

//----------------------------------------------------------------------------------------------------

// 函数名称:wr_PA

// 输入函数:PA_data

// 输出参数:无

// 功能说明:把PA_data送到PA输出

//----------------------------------------------------------------------------------------------------

void wr_PA(unsigned char PA_data) //写PA

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

{

IO_flagA=1;

//置PA状态标志位为高--输出

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

while(IO_flagA==0);

//判断状态标志位是否为低

//为低,设置未完成,需从新设置

a8155_PA=PA_data;

//将PA_data的内容送到PA

}

//----------------------------------------------------------------------------------------------------

// 写PB、PC的函数:wr_PB和wr_PC程序代码与wr_PA类似,不再赘述

//----------------------------------------------------------------------------------------------------

(4)端口PA、端口PB以及端口PC的中断设置函数

端口PA、端口PB以及端口PC的中断设置函数完成各个端口的中断开启和关断,程序代码如下:

// 函数名称:Eint_PA

// 输入函数:无

// 输出参数:无

// 功能说明:PA中断允许

//----------------------------------------------------------------------------------------------------

void Eint_PA(void) //开端口A中断

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Int_flagA=1;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//----------------------------------------------------------------------------------------------------

// 函数名称:Dint_PA

// 输入函数:无

// 输出参数:无

// 功能说明:PA中断禁止

//----------------------------------------------------------------------------------------------------

void Dint_PA(void) //关端口A中断

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Int_flagA=0;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//----------------------------------------------------------------------------------------------------

// 开关PB中断的函数Eint_PB、Dint_PB和Eint_PA、Dint_PA程序代码类似,不再赘述

//----------------------------------------------------------------------------------------------------

端口PC上下半口配置函数:

端口PC上下半口配置函数可实现端口PC上半口配置为PA状态输出和PC下半口配置为PB状态输出。程序代码如下:

//--------------------------------------------------------------------------------------------------------------

// 函数名称:PC0_PAint

// 输入函数:无

// 输出参数:无

// 功能说明:设置PC上半口为PA状态输出,PC0=INTRa,PC1=BFa,PC3=/STBb

//--------------------------------------------------------------------------------------------------------------

void PC0_PAint(void) //PC上半口为PA状态输出

{

//PC0=INTRa,PC1=BFa,PC3=

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Int_flagA=1;

IO_flagC1=1;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//--------------------------------------------------------------------------------------------------------------

// 函数名称:PC4_PBint

// 输入函数:无

// 输出参数:无

// 功能说明:设置PC下半口为PB状态输出,PC4=INTRb,PC5=BFb,PC6=

//--------------------------------------------------------------------------------------------------------------

void PC4_PBint(void) //PC下半口为PB状态输出

{

//PC0=INTRa,PC1=BFa,PC3=

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Int_flagA=1;

IO_flagC1=1;

IO_flagC=1;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

计数器设置函数:

计数器设置函数完成计数器的起停和读写和输出模式设置,具体程序代码如下://--------------------------------------------------------------------------------------------------------------

// 函数名称:start_timer

// 输入函数:无

// 输出参数:无

// 功能说明:开始计数器计数

//--------------------------------------------------------------------------------------------------------------

void start_timer(void) //开始计数器计数

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Timer_flag1=1;

Timer_flag2=1;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//--------------------------------------------------------------------------------------------------------------

// 函数名称:stop_timer

// 输入函数:无

// 输出参数:无

// 功能说明:停止计数器计数

//--------------------------------------------------------------------------------------------------------------

void stop_timer(void) //停止计数器计数

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Timer_flag1=1;

Timer_flag2=0;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//-------------------------------------------------------------------------------------------------------------- // 函数名称:size_zero_stop

// 输入函数:无

// 输出参数:无

// 功能说明:设定计数到零停止计数

//-------------------------------------------------------------------------------------------------------------- void stop_timer(void) //停止计数器计数

{

ACC=state_flags;

//把状态标志字读到ACC便于进行位操作

Timer_flag1=1;

Timer_flag2=0;

state_flags=ACC;

//位操作完成,把ACC的内容写回状态标志字

a8155_CON=state_flags;

//写控制字,完成对8155的设置

}

//-------------------------------------------------------------------------------------------------------------- // 函数名称:rd_timer

// 输入函数:无

// 输出参数:time

// 功能说明:读计数值

//-------------------------------------------------------------------------------------------------------------- int rd_timer(void) //读计数值

{

int time;

char timea;

time=Timer_B;

timea=Timer_A;

time=time<<8;

time=((time&timea)&0x3F);

return(time);

}

//-------------------------------------------------------------------------------------------------------------- // 函数名称:setting_timerout_mode

// 输入函数:mode,范围0~3

// 输出参数:无

// 功能说明:设定输出模式

//-------------------------------------------------------------------------------------------------------------- void setting_timerout_mode(unsigned char mode)//设定输出模式

{

Timer_B=(mode&0x03);

//写控制字

}

数字电子钟8255 8253 8259

Hefei University 微机原理与接口技术课程设计 学科专业:自动化(3)班 课程题目:数字电子钟 完成时间:2011-1-12

自动化专业微机原理课程设计任务书 引言 (3)

1.设计目的 (1) 2.设计要求 (1) 3.总体设计: (1) 4.硬件设计: (2) 4.1、8259A芯片的内部结构及引脚 (2) 4.2、8255芯片的内部结构及引脚 (3) 4.3、8253芯片的内部结构及引脚 (3) 4.4.设计方案 (5) 5.软件设计: (6) 5.1原理框图 (6) 5.2系统模块详细设计与调试 (6) 5.3用定时器8253输出的脉冲 (7) 5.4完整程序如下: (9) 6.设计总结: (15) 引言 计算机的产生加快了人类改造世界的步伐,但是体积大,随着人们的生活越来越离不

开计算机。微型处理器在这种情况下应运而生。纵观各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及生活中使用的各种智能IC卡、电子宠物等,这些都离不开微型计算机。微机即是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。 这次课程设计的题目是:数字电子钟的设计。计时精确的电子钟在我们生活中能处处能见到。钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。通过对一个学期的微机原理与接口技术的学习,我们可以利用我们所学过的知识来实现数字电子钟的工作过程。我们选择LED显示, 8253定时功能、8255基本输入输出的功能、8259的中断功能来实现数字电子钟的设计。其中附有电路原理图,电路接线图和源程序。因水平有限,难免有疏落不足之处,敬请指导老师批评指正。

实验2:8253、8255接口实验

实验二:8253、8255接口实验 实验目的: 1. 学习8253、8255接口芯片的功能 2. 掌握8253、8255的使用方法 3. 了解PC机发声系统及程序控制方法 实验内容: 1. 使用8086汇编语言控制PC机发声系统,编制一个“电子琴”弹奏程序(必做) 2. 利用PC机发生系统播放歌曲(选做) 实验方法:编制程序上机调试 实验要求:(见参考程序)根据要求绘制程序流程图并解释说明 实验步骤:编制子程序及主程序后上机运行调试 实验分析:输入数据;观察并记录运行结果 一、电子琴参考程序: 实验要求:从键盘输入一个字符1~8,弹奏出对应的声调 ;实验二8253、8255接口实验(电子琴) STACKS SEGMENT WORD STACK 'STACK' DW 100H DUP(?) STACKS ENDS DA TAS SEGMENT WORD PUBLIC 'DATD' PLB DW 262,294,330,349 ;频率表 DW 392,440,494,523 DA TAS ENDS CODES SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:CODES,SS:STACKS,DS:DATAS,ES:DA TAS START: MOV AX,DA TAS MOV DS,AX MOV ES,AX MOV AL,03H OUT 61H,AL ;打开声音输出 M1: MOV AH,1 INT 21H ;键盘输入 SUB AL,'1' JL ME ;<1结束 CMP AL,7 JG M1 ;>8继续 SHL AL,1 ;乘以2 MOV BL,AL XOR BH,BH ;查找频率 MOV BX,[BX+PLB] CALL SZPL ;设置频率 JMP M1 ME: MOV AL,0 OUT 61H,AL ;关闭声音输出 MOV AH,4CH INT 21H ;返回DOS ;设置频率(入口: BX=声音频率) SZPL: MOV AL,0B6H ;控制字=B OUT 43H,AL MOV DX,12H ;fo=1193000(123428H) MOV AX,3428H DIV BX ;AX=fo/声音频率 OUT 42H,AL MOV AL,AH OUT 42H,AL ;写8253计数器初值

8255,8253交通灯模拟实验

微机原理课程设计——8255,8253交通灯模拟实验 文档介绍:交通信号灯的控制: 1.通过8255A并口来控制LED发光二极管的亮灭。 2.A口控制红灯,B口控制黄灯,C口控制绿灯。 3.输出为0则亮,输出为1则灭。 4.用8253定时来控制变换时间。 要求:设有一个十字路口,1、3为南,北方向,2、4为东西方向,初始态为4个路口的红灯全亮。之后,1、3路口的绿灯亮,2、4路口的红灯亮,1、3路口方向通车。延迟30秒后,1、3路口的绿灯熄灭,而1,3路口的黄灯开始闪烁(1HZ)。闪烁5次后,1、3路口的红灯亮,同时2、4路口的绿灯亮,2、4路口方向开始通车。延迟30秒时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁。闪烁5次后,再切换到1、3路口方向。之后,重复上述过程。 系统原理 工作原理说明: 此方案是通过并行接口芯片8255A和8086计算机的硬件连接,以及通过8253延时的方法,来实现十字路口交通灯的模拟控制。 如硬件连接图所示,红灯(RLED),黄灯(YLEDD)和绿灯(GLED)分别接在8255的A,B,C口的低四位端口,PA0,PA1,PA2,PA3分别接1,2,3,4路口的红灯,B,C口类推。8086工作在最小模式,低八位端口AD0~AD7接到8255和8253的D0~D7,AD8~AD15通过地址锁存器8282,接到三八译码器,译码后分别连到8255和8253的CS片选端。8253的三个门控端接+5V,CLOCK0接由分频器产生的1MHZ的时钟脉冲,OUT0接到CLOCK1和CLOCK2,OUT1接到8086的AD18,8086通过检测此端口是否有高电平来判断是否30S定时到。OUT2产生1MHZ 方波通过或门和8255的B口共同控制黄

8255A应用举例

4 8255A应用举例 在很多应用系统中,用LED作状态指示器具有电路简单、功耗低、寿命长、响应速度快等特点。LED显示器是由若干个发光二极管组成显示字段的显示器件,应用系统中通常使用7段LED显示器,如图8-15所示。 b)c) a)共阴型b)共阳型c)管脚分布 图8-15 七段数码管 以共阳极为例,各LED公共阳极接电源,如果向控制端a,b,c, …,g,dp送入00000011信号,则该显示器显示“0”字型。 控制显示各数码加在数码管上的二进制数据称为段码,显示各数码共阴和共阳七段LED数码管所对应的段码见表8-3。 表8-3 七段LED数码管的段码

下面用8255A 作为LED 数码管及4位开关与CPU 的接口,要求按照开关的二进制编码状态,显示相应的数码。如图8-16所示。 图8-16 80x86CPU 通过8255A 同开关与7段LED 显示器的接口 设当开关K3、K2、K1、 K0未合上时,各开关控制的位线为高电平1;开关接通时,各开关控制的位线为低电平0。各开关状态、数字及LED 段码的关系如表8-4所示。 表8-4 开关状态、数字及LED 段码的关系

例如:当K2未合上,K3、K1、K0均合上接通时状态为0100,表示数字4,显示代码应为99H。 设8255A端口地址为0FFFAH、0FFFBH、0FFFCH、0FFFDH。 源程序如下: DATA SEGMENT XSHDM DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H DB 98H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH CNT DB 10 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE , DS:DA TA START: MOV AX,DA TA MOV DS,AX ;以上为源程序结构通用部分. ;下面为8255A初始化程序块 MOV AL,82H MOV DX,0FFFDH OUT DX,AL LOP: MOV DL,0FBH IN AL,DX ;读B口 AND AL,0FH MOV BX,OFFSET XSHDM XLAT MOV DL,0FAH OUT DX,AL ;写入A口 CALL DELAY JMP LOP MOV AH, 4CH INT 21H DELAY PROC MOV DX,0500H LOP1: MOV CX,0FFH LOP2: NOP NOP LOOP LOP2 DEC DX JNZ LOP1 RET DELAY ENDP

8086应用举例

应用举例 利用8086处理器设计一个简单的电加热炉的温度控制系统, 要求:1|、目标温度可以设置、显示;(XXX) 2、炉内实际温度可以显示(XXX) 3、温度控制过程中,每秒种测量、调节1次 4、通过固体继电器调节电阻丝对电炉加温 5、加热速度:1度/分钟,到200度后保持稳定 (一) 设计要点: 1、以8086为处理器 2、用3个8位锁存器锁存20位地址(AD0-AD15 ;A16-A19 ;BHE ) 3、RAM存储器地址从00000H -03FFFH连续空间(16K*8)6264*2 数据及中断矢量表 4、ROM存储器地址从FC000H-FFFFFH的连续空间(16K*8)2762*2 程序和程序中用到的固定参数 5、定时器8253控制时间(端口地址0020H,0022H,0024H,0026H) 6、16键、6位LED显示器通过8255A的A、B、C口接口(端口地址0030H,0032H,0034H,0036H) 7、电阻加热:8255的C口控制0809的状态由C口查询 8、温度测量:ADC0809 8位输入0-5V (启动转换的控制端口0040H 读转换结果端口0042H ) (二) 系统组成

(三) 硬件设计及地址分配 3.1 存储器的作用: 1、数据及中断矢量表 2、程序和程序中用到的固定参数 组织方式: 按字节(BYTE)组织,支持字(WORD)读写操作 RAM :偶地址+奇地址体(A0 ,D0-D7;BHE,D8-D15),可读可写ROM :偶地址+奇地址体(A0 ,D0-D7;BHE,D8-D15),可读不写地址范围: RAM存储器00000H -03FFFH连续空间(16K*8)6264*2 ROM存储器FC000H-FFFFFH连续空间(16K*8)2764*2 存储器的地址译码与读写控制电路真值表: 3.2 IO接口设计 I/O组织方式: 按字节(BYTE)组织,但不支持字(WORD)读写操作。

基于8253和8255的模拟交通灯控制系统

广东外语外贸大学信息科学技术学院 《微型计算机接口技术》大作业设计报告 基于8255,8253的 发声人性化交通灯控制设计 日期:2011-1-7

摘要 十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。井然秩序的实现,靠的是交通信号灯的自动指挥系统。交通信号灯控制方式有很多。本系统采用8255A芯片实现了A口设置红、绿、黄灯点亮时间的功能,从而控制LED发光二极管实现红、黄、绿灯循环点亮。另外结合日常生活经验,并且从亚残会中对残疾人的生活不便中得出感悟,采用8253进行控制扬声器,在红、绿灯变换之间黄灯闪烁时,同时添加了“声音提示"功能。整个系统具有固定的“红灯—黄灯—绿灯”转换间隔,并自动切换,对东西南北方向的道路进行“自动”的控制。但是,经过小组成员提出的各种假设,发现此系统需要加入更多人性化的元素:交警可以根据实际的路面情况,针对不同的突发事件,进行手工控制红绿灯的转换。例如救护车警车执行紧急任务;例如东西道路塞车,南北道路空闲无车辆行驶时,需要灵活调节红绿灯的转化。通过8255并口控制,可以达到更加人性化的效果从而方便各种人群。 关键字:8255 交通灯控制8253 发声人性化 第一部分概论 1.1设计任务:交通信号灯的控制 (1)通过8255并行接口来控制LED发光二极管的亮灭,并适当延时。(2)黄灯闪烁时,通过8253控制扬声器发出声音,以提醒灯的转换。(3)通过8255并口控制,人工进行交通灯的转换。 1.2 任务要求 (1)南北路口的绿灯、东西路口的红灯同时亮5秒左右。 (2)南北路口的黄灯闪烁若干次,扬声器鸣叫,同时东西路口的红灯闪烁。(3)南北路口的红灯、东西路口的绿灯同时亮5秒左右。

8253工作方式以及应用举例

第27课 8253工作方式以及应用举例 8253的六种工作方式,8253的实际应用举例。本课主题: 教学目的:掌握8253六种工作方式的特点以及使用方法,通过实际应用举例强化8253的使用方法。 教学重点:8253的硬件连接和软件初始化方法。 教学难点:8253的在系统中的应用。 授课内容: 8253的每个通道都有6种不同的工作方式,下面分别进行介绍。 1.方式0--计数结束中断方式(Interrupt on Terminal Count) 2.方式1--可编程单稳态输出方式(Programmable One-short) 3.方式2--比率发生器(Rate Generator) 4.方式3--方波发生器(Square Wave Generator)

5.方式4--软件触发选通(Software Triggered Strobe) 6.方式5--硬件触发选通(Hardware Triggered Strobe) 由上面的讨论可知,6种工作方式各有特点,因而适用的场合也不一样。现将各种方式的主要特点概括如下: 对于方式0,在写入控制字后,输出端即变低,计数结束后,输出端由低变高,常用该输出信号作为中断源。其余5种方式写入控制字后,输出均变高。方式0可用来实现定时或对外部事件进行计数。 方式1用来产生单脉冲。 方式2用来产生序列负脉冲,每个负脉冲的宽度与CLK脉冲的周期相同。 方式3用于产生连续的方波。方式2和方式3都实现对时钟脉冲进行n分频。

方式4和方式5的波形相同,都在计数器回0后,从OUT端输出一个负脉冲,其宽度等于一个时钟周期。但方式4由软件(设置计数值)触发计数,而方式5由硬件(门控信号GATE)触发计数。 这6种工作方式中,方式0、1和4,计数初值装进计数器后,仅一次有效。如果要通道再次按此方式工作,必须重新装入计数值。对于方式2、3和5,在减1计数到0值后,8253会自动将计数值重装进计数器。 8.2 8253的应用举例 一、8253定时功能的应用例子 1(用8253产生各种定时波形 在某个以8086为CPU的系统中使用了一块8253芯片,通道的基地址为310H,所用的时钟脉冲频率为1MHz。要求3个计数通道分别完成以下功能: (1)通道0工作于方式3,输出频率为2kHz的方波; (2)通道l产生宽度为480us的单脉冲; (3)通道2用硬件方式触发,输出单脉冲,时间常数为26。 2.控制LED的点亮或熄灭 用8253来控制一个LED发光二极管的点亮和熄灭的例子,要求点亮10秒钟后再让它熄灭10秒钟,并重复上述过程。假设这是一个8086系统,8253的各端口地址为81H、83H、85H和87H。

8253、8255、8259和8251实现电子琴的自动弹凑和手动弹凑

汇编与微机接口技术试验 二、实验项目名称:用8253、8255、8259和8251实现电子琴的自动弹凑和手动弹凑 三、实验学时:2学时 四、实验原理: 用8253做定时器输出音频信号,控制喇叭发出声音。利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调. 五、实验目的: a)加强8088CPU的汇编程序设计 b)加强对8253定时/计数器芯片的应用理解 c)加强对8255可编程并口芯片的应用理解 d)加强对8259可编程中断控制器芯片的应用理解 e)加强对8251可编程串口芯片的应用理解 f)了解计算机发声原理 六、实验内容: a)利用8088外接8253可编程定时器/计数器音符音频的频率输出, 用8255的PA口接8只按键,作为电子琴1、2、3、4、5、6、 7、i数字键按键,编程完成按下数字键按键即发出相应的音调。 b)利用8251串口实现与PC机的超级终端程序通讯,可在PC上 按键大写字母‘A’能转换为自动弹凑,大写字母‘M’能转换 为手动弹凑,在手动弹凑方式下,能用PC机的1、2、3、4、5、

6、7、8按键替代试验箱按键弹凑音乐。 七、实验器材(设备、元器件): DVCC试验箱,PC机; 八、实验步骤: a)、阅读ppt掌握理解试验内容; b)、按照试验要求连接电路; c)、连接试验箱与电脑主机; d)、打开试验所需软件,输入代码; f)、运行,观察实验结果; 九、实验数据及结果分析: 1.该实验主要程序段如下: CODE SEGMENT CS_8259_P0 EQU 20H CS_8259_P1 EQU 21H CS_8255_CTRL EQU 73H CS_8255_PA EQU 70H CS_8253_CTRL EQU 4BH CS_8253_CH0 EQU 48H CS_8253_CH2 EQU 4AH CS_8251_STAT EQU 51H CS_8251_DATA EQU 50H ASSUME CS:CODE ORG 1000H START: JMP MAIN MODE DB 0 ;0为手动弹凑模式,非0为自动手动弹凑模式 TONELEN DW 0 TONEFR DW 2,3030,2865,2551,2273,2024,1912,1704,1517,1433,1276,1136,1012 TABLE DB 42H,82H,82H,82H,84H,02H,72H DB 62H,72H,62H,52H,48H DB 0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H DB 12H,0A2H,0D2H,92H,88H DB 82H,0B2H,0B2H,0A2H,84H,02H,72H DB 62H,72H,62H,52H,44H,02H,12H

8253+8255+8259 电子时钟

一、课程设计目的和意义 通过本次课程设计要掌握此三种芯片使用的方法,灵活运用课本知识,加深所学的知识,对所学的相关芯片的原理、内部结构、使用方法等有更加深刻的了解,学会利用课本知识联系实际应用及编程。同时并了解综合问题的程序设计掌握实时处理程序的编制和调试方法,掌握一般的设计步骤和流程,使我们以后搞设计时逻辑更加清晰。 二、开发环境及设备 ①设计环境 PC机一台、windows XP系统、实验箱、导线若干。 ②设计所用设备 8254定时器:用于产生秒脉冲,其输出信号可作为中断请示信号送IRQ2。8255并口:用做接口芯片,和小键盘相连。 8259中断控制器:用于产生中断。 LED:六个LED用于显示时:分:秒值。 小键盘:用于控制设置。 三、设计思想与原理 1、设计思想 本系统设计的电子时钟以8088微处理器作为CPU,用8254做定时计数器产生时钟频率,8255做可编程并行接口显示时钟和键盘电路,8259做中断控制器产生中断。在此系统中,8254的功能是定时,接入8254的CLK信号为周期性时钟信号。8254采用计数器0,工作于方式2,使8254的OUT0端输出周期性的负脉冲信号。即每隔20ms,8254的OUT0端就会输出一个负脉冲的信号,此信号接8259的IR2,当中断到50次数后,CPU即处理,使液晶显示器上的时间发生变化。 其中8259只需初始化ICW1,其功能是向8259表明IRx输入是电瓶触发方式还是上升沿触发方式,是单片8259还是多片8259。8259接收到信号后,产生中断信号送CPU处理。 2、设计原理 利用实验台上提供的定时器8254和扩展板上提供的8259以及键盘和数码显

8253使用详解

第二章 可编程定时/计数器8253 1引言 1定时/计数用处 机内日历,时钟,喇叭,发声(30HZ~20KHZ ) 定时中断 秒计数器产生周T =18.2ms 的方波 1秒=1000/18.2=55个 2产生方法 ??? ????利用率高优点:发出中断信号并行工作,时间到,向定时芯片与硬件:计数 他任务,效率低在延时期间不能执行其(不实用)缺点 :达 到延时软件:软件执行指令,C P U C P U C P U C P U / 3 8253作用:8253是一个可编程接口芯片 ①有三个独立16位定时/计数器,可对3个独立事件定时/计数 ②每个通道有6种工作方式 ③可按2# 或10# 方式定时/计数 4 定时/计数 控制定时时间 ①定时 ②计数 数脉冲个数

2 8253工作原理 一 内部结构 P244 1通道0~通道2 (定时/计数0~定时/计数2) 16位初始值计数器放计数初始值,减法计数器对外界输入脉冲减1操作,减到0时,使OUT 输出电平变化 计数锁存器用来锁存计数值,看中间结果 ①计数 从CLK i 输入频率未知的脉冲,在计数锁存器中得到一定时间内脉冲个数 ②定时 从CLK i 输入频率已知的脉冲,然后根据定时时间算出计数初始值,并放入初始计数器中,当减到0时,OUT i 电平变化 如定时1s 初始值= 1kHz 11000ms =1000 1ms ×1001=1.001s 2 8253的引脚 24角IC ①与CPU 连 D 0~D 7 数据线(双向)

②与外设连CLK 2~CLK ——计数脉冲输入 OUT 2~OUT ——时间到,输出电平变化 GATE 2~GATE ——门控信号 三、8253硬件连接 四、8253编程初始化,写命令字,送控口 D 7D 6 D 5 D 4 D 3 D 2 D 1 D SC 1SC RW 1 RW M 2 M 1 M BCD (6种)

8253计数器的应用

8253计数器的应用 intel8253是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异,例如8253(2.6MHz),8253-5(5MHz) 8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。 执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。顺便提一下,CR、CE 和OL都是16位寄存器,但是也可以作8位寄存器来用。 在微型机应用系统中,往往要求有一些外部实时时钟,以实现定时或延时控制,也往往要求能对外部事件进行计数控制的计数器。有3种常用实现定时延时的控制方法:软件延时,不可编程硬件定时和可编程的硬件定时。 软件定时是用汇编语言编写的循环程序来实现,定时较准确,但在定时过程中,CPU 不能执行其它程序,浪费了CPU的时间。 不可编程硬件定时由定时器件来实现,如定时器555。也可利用计数直接对系统时钟脉冲计数。这种方式不占用CPU的时间,且很容易产生确定宽度的单脉冲或固定频率的连续脉冲,但一旦硬件电路确定后,定时特性不易改变。 可编程的硬件定时器是直接对系统时钟脉冲或某一固定频率的时钟脉冲进行计数的,计数多少则由编程确定。当计数到预定的脉冲数时给出定时时间信号,从而得到所需要的定时时间间隔。大部分可编程定时器都兼有计数功能,不仅可对系统时钟脉冲计数,也可对非周期性的外部事件进行计数。可编程定时器/计数器都以减1计数器作为其主要部件,通过编程设置不同的计数常数或分频系数,就可实现各种不同的定时或计数的要求。 可编程计数器/定时器8253就是用软、硬技术相结合的方法实现定时和计数控制。其主要有以下特点: (1) 有3个独立的16位计数器,每个计数器均以减法计数。 (2) 每个计数器都可按二进制计数或十进制(BCD码)计数。 (3) 每个计数器都可由程序设置6种工作方式。 (4) 每个计数器计数速度可达2 MHz。 (5) 所有I/O都可与TTL兼容。

8253--8255芯片

8253芯片 基本概述 8253内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。 执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU 可以对此进行读操作。顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用。 工作原理 8253具有3个独立的计数通道,采用减1计数方式。在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。当计数脉冲是已知周期的时钟信号时,计数就成为定时。 一、8253内部结构 8253芯片有24条引脚,封装在双列直插式陶瓷管壳内。 1.数据总线缓冲器 数据总线缓冲器与系统总线连接,8位双向,与CPU交换信息的通道。这是8253与CPU之间的数据接口,它由8位双向三态缓冲存储器构成,是CPU与8253之间交换信息的必经之路。 2.读/写控制 读/写控制分别连接系统的IOR#和IOW#,由CPU控制着访问8253的内部通道。接收CPU送入的读/写控制信号,并完成对芯片内部各功能部件的控制功能,因此,它实际上是8253芯片内部的控制器。A1A0:端口选择信号,由CPU输入。8253内部有3个独立的通道和一个控制字寄存器,它们构成8253芯片的4个端口,CPU可对3个通道进行读/写操作3对控制字寄存器进行写操作。这4个端口地址由最低2位地址码A1A0来选择。如表9.3.1所示。 3.通道选择 (1) CS#——片选信号,由CPU输入,低电平有效,通常由端口地址的高位地址译码形成。

8255芯片说明及其应用

8255芯片 8255是可编程I/O口扩展芯片。可作为CPU总线与外围的接口.对8255输入不同的指令可改变I/O口的工作方式。 8255具有24个可编程设置的I/O口,即使3组8位的I/O口为PA口,PB 口和PC口.它们又可分为两组12位的I/O口,A组包括A口及C口(高4 位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3).A组可设置为基本的I/O 口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定. 8255内部有4个寄存器:分别为寄存器A、B、C和控制寄存器。A、 B、C寄存器的数据就是引脚PA7~PA0、PB7~PB0、PC7~PC0上输 入或输出的数据。而控制寄存器的数据则表明PA、PB、PC的工作方式。 通过CS、A0、A1、RD和WR对4个寄存器进行操作。CS为低电平时选通8255;A1、A0为地址选通;RD和WR为读、写信号:RD为低、WR为高时为读方式,RD为高、WR为低时为写方式。 向控制寄存器写入不同的数据可以使8255工作在三种不同的方式下。这里只介绍应用最多的方式0。方式0下8255的PA、PB及PC口上半部分(PC7~PC4)和下半部分(PC3~PC0)中任何一个端口都可以设定为输入或输出,PC口还可以进行位操作。 8255引脚功能 RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 CS:芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输. RD:读信号线,当这个输入引脚为低电平时,即/RD=0且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低电平时,即/WR=0且/CS=0时,允许CPU将数据或控制字写入8255。

8255 8253流水灯...

8255流水灯显示代码 ; You may customize this and other start-up templates; ; The location of this template is c:\emu8086\inc\0_com_template.txt org 100h ;T8255-2.asm ;8255流水灯显示实验 ;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 00H ;片选IOY0对应的端口始地址 ;************************************************************* **** MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址 DATA SEGMENT LA DB 1 DUP LB DB 1 DUP AXX DW 1 BUP CXX DW 1 BUP DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,MY8255_MODE ;定义8255工作方式 MOV AL,80H ;工作方式0,A口和B口为输出 OUT DX,AL BEGIN: MOV DX,MY8255_A ;写A口发出的起始数据 MOV AL,01H

第六部分 8255与8253

并行接口8255A 一、单项选择题 1.8255A既可作数据输入、出端口,又可提供控制信息、状态信息的端口是( D )。 (A)B口(B)A口(C)A、B、C三端口均可以(D)C口 2.8255A的方式选择控制字为80H,其含义是( D )。 (A)A、B、C口全为输入(B)A口为输出,其他为输入 (C)A、B为方式0 (D)A、B、C口均为方式0,输出 3.8255A引脚信号WR=0,CS=0,A1=1,A0=1时,表示( B )。 (A)CPU向数据口写数据(B)CPU向控制口送控制字 (C)CPU读8255A控制口(D)无效操作 4.一微机化仪器采用8255A芯片作数据传送接口,并规定使用接口地址的最低两位作芯片内部寻址,已知芯片的A口地址为0F4H,则当CPU执行输出指令访问0F7H端口时,其操作为()。 (A) 数据从端口C送数据总线(B) 数据从数据总线送端口C (C) 控制字送控制字寄存器(D) 数据从数据总线送端口B 5.当8255A的端口A、端口B均工作在方式0的输入方式时,端口C可以作为()用。 (A)两个4位I/O端口或1个8位I/O端口(B) 状态端口 (C)部分引脚作端口A、端口B的联络信号(D)全部作联络信号 6.当并行接口芯片8255A被设定为方式2时,其工作的I/O口()。(A)既能作输入口、也能作输出口使用(B) 仅能作输入口使用 (C)仅能作不带控制信号的输入口或输出口使用(D) 仅能作输出口使用 7.当并行接口芯片8255A被设定为方式2时,其工作的I/O口()。(A) 仅能作不带控制信号的输入口或输出口使用(B)仅能作输入口使用(C) 既能作输入口、也能作输出口使用(D) 仅能作输出口使用8.intel公司生产的用于数据并行传送的可编程接口芯片是( D )。 (A)8218 (B)8251 (C)8253 (D)8255 9.一片1ntel8255A需占用(B )个端口地址。 (A)2 (B)4 (C)6 (D)8

8255A芯片简介及其应用

8255A芯片简介及其应用 班级: 姓名: 学号:

一、简介 8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 二、内部结构 8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 1)与CPU连接部分 根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C 口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下: (1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。 (2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。 (3)控制总线CB:片选信号、复位信号RST、写信号、读信号。当CPU 要对8255进行读、写操作时,必须先向8255发片选信号选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。 2)与外设接口部分 根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。各通道的引脚编号如下: (1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。 (2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。 (3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。 3)控制器 8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图(1)所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下: (1)A组控制器:控制A口与上C口的输入与输出。

8253的使用

实验一8253A定时/计数器(一) 一、实验目的 1. 学会8253芯片和微机接口原理和方法。 2. 掌握8253定时器/计数器的工作方式和编程原理。 二、实验内容 实验原理图 本实验原理图如上所示,8253A的A0、A1接系统地址总线A0、A1,故8253A有四个端口地址,如端口地址表5-2所示。8253A的片选地址为48H~ 4FH。因此,本实验仪中的8253A四个端口地址为48H、49H、4AH、4BH,分别对应通道0、通道1、通道2和控制字。采用8253A通道0,工作在方式3(方波发生器方式),输入时钟CLK0 为1MHZ,输出OUTO 要求为1KHZ的方波,并要求用接在GA TE0引脚上的导线是接地("0"电平)或甩空("1"电平)来观察GA TE对计数器的控制作用,用示波器观察输出波形。 1、实验线路连接 (1) 8253A芯片的CLK0引出插孔连分频输出插孔1MHZ。 (2) 8253A的GA TE0接+5V。 2、实验步骤 (1) 按图连好实验线路 (2) 运行实验程序 在系统显示"DVCC-86H"状态下,按任意键,系统显示命令提示符"-"。 按GO键,系统显示"1000 XX" 输入F000 :B290 再按EXEC键,显示"8253-1" 用示波器测量8253A的OUT0输出插孔,应有频率为1KHZ的方波输出。幅值0~5V。

实验二8259单级中断控制器实验 一、实验目的 1.掌握8259中断控制器的接口方法. 2.掌握8259中断控制器的应用编程. 二、实验内容 1、本系统中已设计有一片8259A中断控制芯片,工作于主片方式,8个中断请求输入端IR0~IR7对应的中断型号为8~F。 2实验原理图 使用8259单级中断控制实验原理图 根据实验原理图,8259A和8088系统总线直接相连,8259A上连有一系统地址线A0,故8259A有2 个端口地址,本系统中为20H、21H。20H 用来写ICW1,21H 用来写ICW2、ICW3、ICW4,初始化命令字写好后,再写操作命令字。OCW2、OCW3 用口地址20H,OCW1用口地址21H。图5-14中,使用了3号中断源,IR3插孔和SP插孔相连,中断方式为边沿触发方式,每按一次AN按钮产生一次中断信号,向8259A发出中断请求信号。如果中断源电平信号不符规定要求则自动转到7号中断,显示"Err"。CPU响应中断后,在中断服务中,对中断次数进行计数并显示,计满5次结束,显示器显示"8259Good"。 3、实验线路连接 8259A的IR3插孔和SP插孔相连。SP插孔初始电平为低电平。 4、实验步骤 (1) 按图5-14连好实验线路 (2) 运行实验程序 在系统显示"DVCC-86H"状态下,按任意键,系统显示命令提示符"-"。 按GO键,显示"1000 XX" 输入F000 :B2E0 按EXEC键,在DVCC-8086H上显示"8259-1"。 (3) 按AN按键,每按二次产生一次中断,在显示器左边一位显示中断次数,满5次中断,显示器显示"8259 good"。

8253、8255A、8259A初始化程序

8253的初始化程序 1.确定端口地址:0310H、0312H、0314H、0316H 2.确定工作方式(假设工作方式为): 通道0,方式3 通道1,方式1 通道2,方式5 3.确定计数值: 通道0:N0=1MHz/2KHz=500 通道1:N1=480us/(1/1mhz)=480 通道2:N2=26 4确定控制字: 通道0:00110111B 通道1:01110011B 通道2:10011011B 对3个通道的初始化程序如下: ;通道0初始化程序 MOV DX, 316H MOV AL,00110111B OUT DX,AL MOV DX,310H MOV AL,00H

OUT DX, AL MOV AL,05H OUT DX,AL ;通道1的初始化程序MOV DX, 316H MOV AL, 001110011B OUT DX, AL MOV DX, 312H MOV AL, 80H OUT DX, AL MOV AL, 04H OUT DX, AL ;通道2初始化程序MOV DX, 316H MOV AL, 10011011B OUT DX, AL MOV DX, 314H MOV AL,26H OUT DX,AL ; MOV AL,00H ; OUT DX,AL

8255A初始化程序 对8255A进行初始化,要求端口A工作于方式1,输入;端口B工作于方式0,输出;端口C的高4位配合端口A工作,低4位为输入。 1.确定控制字端口地址:006CH。 2.确定工作方式: 端口A,工作方式1,输入 端口B,工作方式0,输出 端口C,C0为输入,C4为配合工作 3.确定方式选择控制字:1 011 100 1H(B9H) 对3个端口的初始化程序如下 MOV AL,B9H MOV DX,006CH OUT DX,AL 另一个8255A初始化程序 已知某8255A在系统中占用88~8BH号端口地址,现欲安排其PA,PB,PC口全部为输出,PA,PB口均工作于方式0模式,并将PC6置位,使PC3复位,试编写出相应的初始化程序: 1.确定端口地址

8255的使用

实验八可编程并行接口芯片8255A的使用2 一、实验目的 了解可编程并行接口芯片8255的内部结构、工作方式、初始化编程及应用。 二、实验设备 (1)显示器、鼠标、键盘各一件; (2)QTH-2008PC 32位微机教学实验仪一套。 三、实验说明 1、8255A的内部结构: (1)数据总线缓冲器:这是一个双向三态的8位数据缓冲器,它是8255A与微机系统数据总线的接口。输入输的数据、CPU输出的控制字以及CPU输入的状态信息都是通过这个缓冲器传送的。 (2)三个端口A,B和C:A端口包含一个8位数据输出锁存器和缓冲器,一个8位数据输入锁存器。B端口包含一个8位数据输入/输出锁存器和缓冲器,一个8位数据输入缓冲器。C端口包含一个8位数据输出锁存器及缓冲器,一个8位数据输入缓冲器(输入没有锁存器)。 (3)A组和B组控制电路:这是两组根据CPU输出的控制字控制8255工作方式的电路,它们对于CPU而言,共用一个端口地址相同的控制字寄存器,接收CPU输出的一字节方式控制字或对C口按位复位字命令。方式控制字的高5位决定A组工作方式,低3位决定B 组的工作方式。对C口按位复位命令字可对C口的每一位实现置位或复位。A组控制电路控制A口和C口上半部,B组控制电路控制B口和C口下半部。 (4)读写控制逻辑:用来控制把CPU输出的控制字或数据送至相应端口,也由它来控制把状态信息或输入数据通过相应的端口送到CPU。 2、8255A的工作方式: 方式0—基本输入输出方式;方式1—选通输入输出方式;方式2—双向选通输入输出方式。 3、8255A的控制字: 图1 8255A方式控制字 图2 C口按位置位/复位控制字

8255的应用(C语言版本)

【实例24】用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit ContrBit2=P1^2; sbit ContrBit3=P1^3; sbit PROG=P1^4; sbit CS=P1^5; char driver8243(char sele_P,char sele_M,char out_data) { char in_data=0; char data_buf; PROG=1; //置PROG为高电平 //----------------------------------------------开始写控制字----------------------------------------------- if((sele_P&0x01)==0) //将控制字最低位送到8243的p2.0 ContrBit0=0; else ContrBit0=1; if((sele_P&0x02)==0) //将控制字第二位送到8243的p2.1 ContrBit1=0; else ContrBit1=1; //以上两位共同指定端口地址 //----------------------------------------写端口工作模式控制字---------------------------------------- if((sele_M&0x01)==0) //将端口工作模式控制字低位送到8243的p2.2 ContrBit2=0; else ContrBit2=1; if((sele_M&0x01)==0) //将端口工作模式控制字高位送到8243的p2.3 ContrBit3=0; else ContrBit3=1; //完成写控制字 PROG=0; //在PROG上产生下降沿 switch(sele_M&0x03) //判断工作模式 { case 0: break; //sele_M=B00为输入,不处理,等待上升沿 case 1: data_buf=out_data; break; //sele_M=B01为输出,直接送数据

相关主题
文本预览
相关文档 最新文档