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