3.11 INT0中断计数 |
|
仿真电路中用3只分立式数码管显示按键计数值,不需要处理数码管动态刷新显示的问题。案例3.7已设计了按键计数功能,电路图3-11中的清零键与该例实现方式相同,但计数键则使用了新的外部中断技术。
图3-11 INT0中断计数电路
8051单片机共有5个中断源,包括两个外部中断(INT0、INT1),两个定时中断(TIMER0、TIMER1)及一个串口中断(Serial Port Interrupt)。如图3-12所示,各中断源的中断触发标志位保存于TCON寄存器(Timer/Counter Control Register),表3-1列出了该寄存器的所有位。
图3-12 8051单片机的中断源
表3-1 定时/计数控制寄存器TCON
中断使能寄存器IE(Interrupt Enable Register)如表3-2所示,最高位为中断许可位EA(Enable Interrupt),右边第0~4位为EX0,ET0,EX1,ET1,ES,分别独立使能或禁止INT0,INT1,TIMER0,TIMER1中断及串口中断,置1时使能,置0则禁止,最高位EA则用于一次性开启所有使能的中断或屏蔽所有中断。
表3-2 中断使能寄存器IE
本例仿真电路中,计数按键连接单片机P3.2引脚(INT0),主程序设置IE=0x81(即10000001),其他设置EA=1(开中断)、EX0=1(允许INT0中断)。IE=0x81可以用以下语句代替:
EA = 1; //开中断
EX0 = 1; //允许INT0中断
另外,由于IT0为TCON寄存器的最低位,设置IT0=1还可以写成:
TCON = 0x01; //即IT0 = 1;
主程序中所设置的IT0(Interrupt Trigger INT0),它是TCON寄存器中控制INT0中断方式的配置位,设置IT0=1将INT0的中断触发方式配置为下降沿触发,设置IT0=0则为低电平触发。本例设为下降沿触发可以使计数按键按下时,P3.2上由高到低的跳变将触发中断。如果按下后没有释放,中断则不会持续触发,只有在释放按键后再次按下时,才会因为又出现了高电平到低电平的跳变而再次触发中断,这样设置会使计数值仅在计数键每次重新按下时累加。
为了使计数按键能够稳定地进行操作,在实物电路上测试时注意添加消抖语句。计数键是通过中断触发来识别的,每次中断触发时即表示计数键按下,中断例程EX_INT0被自动调用,全局变量Count随之累加,INT0的中断号为0,中断函数用interrupt指明中断号0。
清零键由主程序中的while循环来轮询判断,它持续不断地查看P3.6引脚是否变为0,如果变为0则表示清零键按下。
① 改用查询方式判断计数键,用中断方式控制清零键,实现相同的运行效果。
② 将计数键连接P3.3,编写INT1中断子程序实现计数。