一、准备工作
1、KEIL C51编译环境
2、CodeGen8 代码生成器
3、MC96F6332D 开发板
4、USB-OCD II仿真器
二、生成外部引脚中断的代码
1、在CodeGen8 代码生成器的外设窗口中选择内部RC时钟作为时钟源,设置时钟源的频率为8MHz,配置GPIO引脚P02和P52分别为外部的可中断输入引脚,使能MCU内部的上拉电阻和防抖动功能;具体配置如下图①、②所示,GPIO配置生成的代码如下图⑧所示:
2、配置外部中断引脚的中断方式为下降沿触发(因为有配置引脚内部的上拉电阻),使能引脚的中断功能;GUI的配置见下图⑤、⑥所示,在下图⑦中可以看到配置后的引脚高亮显示了当前的引脚复用功能;中断功能配置生产的代码如上图③所示;
3、点击CodeGen8 中的C 图标,自动打开KEIL C51软件;下一步进行代码的修改、编译和程序下载
4、在中断函数中添加代码,对外部中断进行状态标志,避免在中断函数中进行数据的处理(中断函数讲究快进快出);
//定义2个全局变量,用来表示外部中断的状态
unsigned char EXIT8_STA = 0;
unsigned char EXIT0_STA = 0;
//======================================================
// interrupt routines
//======================================================
void INT_Ext8() interrupt 6
{
// External interrupt 8
EXIT8_STA = 1; //外部中断8标志使能
}
void INT_Ext0_7() interrupt 5
{
// External interrupt 0 ~ 7
//判断外部引脚0是否被按下
if(EIFLAG0 & 0x01)
{
EIFLAG0 &= 0xFE;
EXIT0_STA = 1; //外部中断0标志使能
}
}
特别注意:外部中断0-7中断后需要软件手动清除标志位;在规格书中也同样有体现:
5、关于引脚的方向和上拉寄存器在此不再赘述,之前的GPIO章节有详细讲解;
此处针对消抖做下介绍:现代单片机MCU内部可以对引脚进行消抖处理,所以引脚外部可以不增加滤波电容或电阻等硬件电路;关于消抖的使用:需要先配置消抖的时钟,然后对需要消抖的I/O口进行配置即可;消抖时钟寄存器和端口引脚的消抖配置如下图所示:
6、关于外部中断的触发条件配置:MCU外部的中断触发有3种可供选择,一般情况下会选用最多的是上升或下降沿触发,因为之前GPIO引脚有配置内部的上拉电阻,所以此处配置为下降沿触发;
特别注意:在代码生成器中自动生成的EIPOL1寄存器配置为了0x56;见文章前面的图④所示:此处应该配置0x02即可;
建议:因为外部中断设置都是单独打开和关闭,所以只要使用的中断引脚触发条件配置正确即可,当然还是推荐采用正确配置,便于之后代码的调试工作。
7、使能外部引脚对应的中断,可以看到总中断的开关也是在IE寄存器中进行配置。
外部中断8在IE1寄存器中进行配置,如下图所示:
8、在主函数中增加判断外部中断标志的代码
//主函数中增加如下代码
if(EXIT8_STA) //判断外部中断8是否存在
{
EXIT8_STA = 0;
printf("EXIT 8 Interrupt.\r\n");
}
else if(EXIT0_STA) //判断外部中断0是否存在
{
EXIT0_STA = 0;
printf("EXIT 0 Interrupt.\r\n");
}
9、点击编译器的下载按钮,将刚刚编译好的代码下载到MCU中进行调试仿真。
10、连接串口助手到PC端,可以看到代码可以正常运行。
三、实验现象(具体内容可以参考工程中的Readme.txt文件)
1、MCU主频选择为内部8MHz;
2、当引脚P02和P52有下降沿时会触发中断,在主函数中会判断对应的中断状态是否为真,如果为真,串口会打印对应的中断内容提示有中断触发,见上图;
3、具体的代码可以访问链接:https://share.weiyun.com/5efkBCB;进行免费下载。
因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢。