⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51_8259.txt.txt

📁 PC机与单片机之间进行通讯连接的C51代码和PC机的VC++代码
💻 TXT
字号:
MCS-51和8259的接口程序 

1. MCS-51和8259的接口电路

8259是专门为8086/8088和8080/8085系列芯片设计的可编程程序中断控制器,它和51系列芯片的特性不完全兼容,使用时必须加以调整。

(1)8259需要CPU在INTA线上连续送三个中断应答信号,以控制8259给CPU发送一条三字节CALL nn指令。但是,MCS-51不会自动发INTA信号。为此,我们在中断服务程序中必须连续安排三条MOVX A,@R0指令,以利用MOVX指令时序RD信号和8259的INT相结合(在此期间INT一直有效)就可以得到所需INTA信号。8259的INT线上信号经反相器后和8031的INTA相连,用来向MCS-51请求中断。

(2)MCS-51不能直接使用8259送来的CALL nn指令,因为两者的机器码并不兼容。但是,CALL nn中所包含的16位中断矢量nn还是可以利用的。为此,MCS-51把收到CALl nn指令的第一字节操作码CDH丢弃不用,而把收到的第二和第三字节(中断矢量nn)数相拼,按照它的数值转入相应的中断服务程序。

2. MCS-51和8259的接口程序

设8259工作于全嵌套中断模式,故只需为它送ICW1和ICW2;中断矢量间址4字节;根据上图可知8259的端口地址为FFH和FEH。设中断矢量转移地址为:

21 00 H

21 04 H

21 08 H

21 0C H

21 10 H

21 14 H

21 18 H

21 1C H

程序如下所示

#include<reg51.h>

#define P8259A XBYTE[0x00FE]

#define P8259B XBYTE[0x00FF]

void int_IR0();

void int_IR1();

...

void int_IR7();

void main()

{

P8259A=0x16; /*ICW1送8259*/

P8259B=0x21; /*ICW2送8259*/

EA=1; /*开所有中断*/

EX0=1; /*开INT0中断*/

IT0=1; /*令INT0为边沿触发*/

for(;;); /*等待中断*/

}

 

void int_8259(void) using 2 interrupt 0 /*INT0中断,使用第二组寄存器*/

{

unsigned char int_add_l;

unsigned char int_add_h;

int_add=P8259A; /*读CALL操作码,丢弃*/

int_add_l=P8259A; /*读低8位中断矢量*/

int_add_h=P8259A; /*读高8位中断矢量*/

/*因为高8位中断矢量相同,所有只要判断低8位中断矢量*/

switch(int_add_l){

case 0x00 :

int_IR0();

break;

case 0x04 :

int_IR1();

break;

...

case 0x1c:

int_IR7();

break;

default:

break;

}

}

void int_IR0()

{

.....

P8259A=0x20H; /*非指定EOI命令送8259*/

 

}

void int_IR1()

{

......

P8259A=0x20H;

}

 

摘自〈单片机的C语言应用程序设计〉

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -