购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.12 INT0~INT3中断计数

传统型8501单片机仅支持两个外部中断,即 。STC15支持的外部中断为INT0~INT4。本案例同时启用STC15的INT0~INT3中断。当连接P3.2/INT0和P3.3/INT1引脚的两个计数按键触发中断时,对应的中断子程序分别执行累加计数操作,两组计数值分别显示在左、右各3位数码管上。另外两个连接在P3.6/INT2与P3.7/INT3引脚上的计数按键触发中断时,分别执行对应计数的清零操作。INT0~INT3中断计数电路如图3-14所示。

图3-14 INT0~INT3中断计数电路

1. 程序设计与调试

为同时允许INT0和INT1中断,主程序设置IE I 0x05(00000101)。另外,为了将这两个中断触发方式均设为下降沿触发,主程序中将IT0和IT1均置1(注:将IT0置1时INT0被配置为下降沿触发,由于当前版Proteus存在BUG,仿真时仍显示为上、下沿均被触发)。

对于STC15扩展的外部中断 (本案例使用 ),要使用STC15系列单片机新增寄存器INT_CLKO(AUXR2)对其进行设置。STC15外部中断允许和时钟输出寄存器INT_CLKO(AUXR2)如表3-4所示。其中,EX2~EX4分别对 进行设置,置1表示使能,置0表示禁止,且均只允许下降沿触发。程序通过语句INT_CLKO|=(1<<4)|(1<<5)来使能 中断。

表3-4 STC15外部中断允许和时钟输出寄存器INT_CLKO(AUXR2)

由STC15技术手册可知,INT0~INT4的中断号分别为0,2,10,11,16。本案例程序中对前4个中断分别给出了服务器程序。其中,EX_INT0()、EX_INT1()这两个中断服务程序分别对计数变量Count_A与Count_B进行累加;EX_INT2()、EX_INT3()这两个中断服务程序则分别对计数变量Count_A与Count_B执行清零。

由于主程序的while循环语句内有对显示计数函数Show_Counts()的循环调用,因此中断子程序无须处理计数值的显示,只要累加计数即可。显示计数函数Show_Counts()首先完成两个计数值的数位分解,然后将Count_A分解后放入显示缓冲数组disp_buff的高3位,将Count_B分解后放入disp_buff的低3位,最后将这6个数位分别刷新显示到6位数码管。

2. 实训要求

① 源程序中两组计数值的分解均使用整除及取余运算符实现,完成调试后重新改用循环递减的方法实现数位分解。

② 使用移位运算符控制6位数码管扫描显示。 EClNYB+jqxTZEBFcN5oPrdmAGQjNmJfLewrSLXKUFg1H5PK2RV2MciaRtEu6ABdQ

3. 源程序代码

点击中间区域
呼出菜单
上一章
目录
下一章
×