![单片机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=1739099407-w53nMPkBvOB3wSip0SNLfclxgQbPSEAV-0-8a2b1a2136fb2159c7395906fb835947)
图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=1739099407-ZjocJMXKy4uTKisEhxd5VXEqKN34N1Ve-0-9ff8d80095ed962abd5b4774b48ba812)
图3-13 传统型8051单片机中断源与STC15中断源(部分)
表3-2 定时/计数控制寄存器TCON
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-1.jpg?sign=1739099407-VgeQ6gscyV9j6RZZnxkXSlsK1o3W1nCG-0-7c1f2af054f4d0deeb199aa1ab974152)
中断使能寄存器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=1739099407-odPJtr2wzqk1cZvJ4ozR0QRGLUBL0a2c-0-1798c1241b45395d7b7e915874de7c4e)
在本案例仿真电路中,计数按键连接单片机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=1739099407-cTH1XXY41FzrUyQYmmMsVT99RafUkCHE-0-1bd044cace9f91a73d5a2492ec2e0100)
另外,由于IT0为TCON寄存器的最低位,设置IT0=1还可以写成:
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-79-4.jpg?sign=1739099407-PpGXJn06PvTfJgG7KIYIFD3P1BO1OsE4-0-47fc5bc8b8fda14b2bcf01ba3af511ef)
主程序中所设置的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=1739099407-Ln4rCB6fNFoKliE5cBtksbgU6q3YPCYa-0-2e4bf33a489ce24daadd85f4c7840b0e)
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-80-1.jpg?sign=1739099407-j6vhGOFjYQdOwpe3RUzK1Qr74HLPntNC-0-149675ea4f54cb766ea90342fc041b8b)
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-81-1.jpg?sign=1739099407-PTYCfXnHLZXtaLUzprC85wJNqR76MTtJ-0-b3b9a6773ea769f71cb21784b3f52ef9)