单片机开发中的一些实用技巧(上)
二。用软件扩展外部中断
大家知道,51单片机的外部中断只有2个,书本上曾介绍了一种扩展外部中断源的方法,但是需增加硬件开销(见图5)。经或非门引入外中断源输入端(/INT0或/INT1),同时又连到某I/0口。这样,每个“源”都可能引起中断,在中断服务程序中通过软件查询便可确定哪一个是正在申请的中断源,其查询的次序则由中断源优先级决定,这就可实现多个外部中断源的扩展。
图5
这种方法尽管扩展了外部中断源,但也有不尽人意之处,如设计一个具有8个中断源的电路,则需一个8输入端的或非门(或门),显然,对体积与成本都不利。这里介绍笔者设计的扩展外部中断源的方法,由纯软件实现,不添加一个元件(见图6)。
图6
#include P>
static unsigned char data m;//m为全局变量
/*-------延时子程序-------*/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i
for(j=0;j121;j++)
{;}}
}
/*---外部中断INT0子程序---*/
void init0()interrupt 0
{
delay(10);//延时10mS抗抖动干扰
if(P3_2==0)
{
EX0=0;//关INT0中断
EA=0;//关总中断
P3_2=0;//置P3.2为低电平
P2=0xff;//置P2口为全1
m=P2;//读取P2口状态至m
P2=0x00;//恢复P2口为全0
P3_2=1; //置P3.2为高电平
IT0=1;//置INT0为边沿触发
EX0=1; //开INT0中断
EA=1;} //开总中断
}
/********主程序*********/
void main(void)
{
P2=0x00;// 置P2口为全0
P3_2=1;// 置P3.2为高电平
IT0=1;// 置INT0为边沿触发
EX0=1;// 开INT0中断
EA=1; //开总中断
while(1)//无限循环
{
P0=m;//将全局变量m中的内容输出至P0口
P3_0=!P3_0;//P3.0取反,指示程序状态
delay(500);//延时500mS
}
}
程序解释:无按键按下时,P3.0的发光管闪亮,作程序状态显示。主程序初始化时,置P2口为全0,置P3.2为高电平,同时置INT0为边沿触发,并开放中断。8个按键的任一个按下时都会引起INT0中断,进入中断服务子程序后,首先关闭中断,然后置P3.2为低电平,置P2口为全1,再读取P2口状态至m,通过查询m的状态字即可知道正在申请的中断源。这里我们采用的方法是将m输出至P0口点亮LED作指示。退出中断时,重新开放中断。
评论