1、本例使用8-3编码芯片74HC148实现外部中断扩展,可以实现对8路外部中断信号按优先级进行处理
2、74HC148是带优先级的编码芯片,对于外部的8根数据输入线,只要有一根或者几根被置0,编码芯片会按照又搞到低的优先级进行编码,由ABC引脚输出3位2进制数,而且GS引脚会自动变为0,本例将GS引脚连接到说、单片机的外部中断10,当GS为0时即会触发外部中断
3、在keil c51中新建工程ex64,编写如下程序代码,编译并生成ex64.hex文件
// 利用74HC148芯片扩展外部中断数量
#include <reg51.h>
#include <intrins.h>
#include <reg51.h>
#include <intrins.h>
//外部中断0中断服务函数
void EX_INT0(void) interrupt 0
{
unsigned char temp = P2 & 0x07;
P0 = _cror_(0x7f,temp); //中断控制点亮拨码开关对应的LED
}
//主函数
void main(void)
{
unsigned int i;
IE = 0x81; //外部中断0寄存器设置
IT0 = 0; //低电平触发中断
while(1)
{
for(i = 0;i < 30000;i++); // 延时
if(INT0 == 1) // INT0为1(即CS为1),拨码开关全部处于断开状态,关闭所有LED
{
P0 = 0xff;
}
}
}
void main(void)
{
unsigned int i;
IE = 0x81; //外部中断0寄存器设置
IT0 = 0; //低电平触发中断
while(1)
{
for(i = 0;i < 30000;i++); // 延时
if(INT0 == 1) // INT0为1(即CS为1),拨码开关全部处于断开状态,关闭所有LED
{
P0 = 0xff;
}
}
}
4、在proteus中新建仿真文件ex64.dsn,电路原理图如下所示
5、将ex64.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果