![单片机C语言程序设计实训100例:基于STC8051+Proteus仿真与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/270/43738270/b_43738270.jpg)
3.11 INT0中断计数
在仿真电路中用3只分立式数码管显示按键计数值,由于它们各自分立,对它们无须处理数码管动态扫描刷新显示问题。前面有关案例已涉及按键处理功能,图3-12中的清零按键控制方式与之类似,但计数按键则使用了新的外部中断技术。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-78-1.jpg?sign=1739309426-mmj18p95CPXUzO3hvMZ5zGYqWlIYiCUk-0-379246875fc3fa48bff988d590977204)
图3-12 INT0中断计数电路
1. 程序设计与调试
传统型8051单片机共有5个中断源,而STC15最高可支持21个中断源。对于传统型8051单片机,其支持的中断源包括两个外部中断(、
),两个定时中断(TIMER0、TIMER1)及一个串口中断(Serial Port Interrupt)。如图3-13列出传统型8051单片机的中断源及STC15的部分对应中断源。这些中断源的中断触发标志位均属于TCON寄存器。表3-2列出了该寄存器的所有位。传统型8051单片机与STC15的TCON寄存器完全相同。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-78-2.jpg?sign=1739309426-biJ11rzNlDbsRjsl1Kpjizanm3u687ig-0-4608c51c07b23149365208b0fae65d51)
图3-13 传统型8051单片机中断源与STC15中断源(部分)
表3-2 定时/计数控制寄存器TCON
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-1.jpg?sign=1739309426-H5B0pUGC9nMvmhYsNBBzGfhPYCEBlc5K-0-4ee61aba530ce2e8f08ac84ea90a68a1)
中断使能寄存器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
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-2.jpg?sign=1739309426-QEW7s6DJgEaxOSczIvOq3i6iZzht8bIu-0-4140e0cb6500fd8c0ad7af9726f2c348)
在本案例仿真电路中,计数按键连接单片机P3.2引脚(INT0),主程序设置IEI0x81(10000001),并设置EA=1(开中断)、EX0=1(允许INT0中断)。IE=0x81可以用以下语句代替:
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-3.jpg?sign=1739309426-FJOu6o1GGSpPVIHpqxkVTazesJWbmohx-0-075250fe8190f289633166b4495bfe7f)
另外,由于IT0为TCON寄存器的最低位,设置IT0=1还可以写成:
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-4.jpg?sign=1739309426-Xc2fXdrPFUEbrgcGRejleAh5NGvbIxmR-0-963142d612f3e9609c0d5ff8b8c79ebf)
主程序中所设置的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则表示清零按键被按下。
2. 实训要求
① 改用查询方式判断计数按键,用中断方式控制清零按键,实现相同的运行效果。
② 将计数按键连接P3.3引脚,编写INT1中断子程序实现计数。
3. 源程序代码
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-5.jpg?sign=1739309426-epJwYHxqx9GUehpajMbHN5T2WXpzToo4-0-48e2efb9e02212054bd3f7df6759cdf9)
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-80-1.jpg?sign=1739309426-UyF0bdNjhL3pQtF9UHElWfHBIqaS3pSN-0-a171b8e76e87e57084ddc34aff00b18c)
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-81-1.jpg?sign=1739309426-5jllCNgyx7p2Y0SufhkTa96jR7s00yFS-0-bba0bc73ad933b451133e8e6282c9c77)