📄 c51_8259.txt.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 + -