本帖最后由 SingleYork 于 2016-10-20 20:09 编辑
bg7.png
I51开发板第二十三讲 中断系统
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=66441
(出处: ICKEY BBS)
今天本菜要跟大家一起学习一下外部中断的基本使用,本帖主要以INT0的使用为例进行讲解,其他INT1/INT2/INT3/INT4的使用基本一样,就留给小伙伴们自行研究了。
首先我们来看下C51中单片机中断函数程序的一般形式:
void 函数名()
关键字interrupt后面的n是中断号,n的取值范围为0~31.编译器从8n+3处产生中断入口地址,具体的中断号n和中断向量取决于所采用的中断源。
关键字using专门用来选择单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。定义中断函数时using是一个选项,如果不用该选项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。
应该特别注意,在任何情况下都不能直接调用中断函数,因此它不能进行参数传递,也没有返回值。
I51开发板上将INT0和INT1引出来了,电路图及实物图如下:
特别声明:之前开发板上此处限流电阻(此处也有拉下作用,不仅仅是限流)用的10K是有问题的,实践证明,当此处电阻为10K,按键按下时不能将IO口完全拉低,导致按键无效,所以请收到开发板的小伙伴们在做中断实验的时候注意这个地方的电阻,至于这个阻值如何选取,且听本菜分析:
单片机的普通IO口上电复位后的工作模式基本上都是“准双向口工作模式”,下面是单片机的“准双向口工作模式结构图”:
从图中我们可以看到,准双向口有3个上拉场效应管T1、T2、T3,以适应不同的需要。根据芯片手册,其中,T1称为强上拉,上拉能力可达20mA;T2称为极弱上拉,上拉能力一般为30uA;T3称为弱上拉,一般上拉能力在150uA~250uA,典型值为200uA。在本例中,单片机的P32/INT0口使用的工作模式就是准双向口工作模式,那么在选取下拉电阻时,就对阻值有要求了。根据OC门输入口的高低电平规定,当输入电压低于0.8V时认为是低电平,当输入电压高于2V时,认为是高电平。也就是说,要想输入口输入低电平,必须使得输入口的电压低于0.8V,再根据IO口弱上拉工作模式的最低驱动能力150uA~250uA的要求,我们便可计算出最大的下拉电阻值为:R=0.8V/150uA=5.33k。也就是说,下拉电阻的值只有小于5.33K时才能将输入口下拉到低电平。实践证明,当我的下拉电阻换成4.7K时,能正常拉下,而当我再串一个1K的电阻时,即电阻为5.7K时便不能下拉。
按键K18、K19分别通过一个限流电阻连接到的单片机的INT0口和INT1口,以INT0为例,当按键K18按下时,外部中断INT0引脚电平变低,向CPU申请中断,单片机通过P30口输出低电平点亮相应的LED指示灯,再次按下INT0时,将LED取反,如此循环。
#include "config.h"
#define LED P30
void ExInt0() interrupt INT0_VECTOR //INT0中断服务程序
{
LED = !LED;
}
void main(void) //主函数
{
IT0 = 1; //设置INT0的中断类型(1:仅下降沿,0:上升沿和下降沿)
EA = 1; //开总中断
EX0 = 1; //允许INT0中断
LED = 1;
while(1);
}
其中,IT0:外部中断0中断源类型选择位。IT0=0时,INT/P32引脚上的上升沿或下降沿均可触发外部中断0.IT0=1,外部中断0为下降沿触发方式。
EA:CPU的总中断允许控制位,EA=1,CPU开发中断,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制,即各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制。
EX0:外部中断0中断允许位,EX0=1允许中断,EX0=0禁止中断。
本例中设置了INT0的触发方式为“仅下降沿触发”,也就是说,只有当INT0口有下降沿产生时,才能触发INT0中断。那么什么是上升沿和下降沿呢?
数字电路中,把电压的高低用逻辑电平来表示。逻辑电平包括高电平和低电平两种。不同的元器件形成的数字电路,电压对应的逻辑电平也不同。在TTL门电路中,把大于3.5V的电压规定为逻辑高电平,用数字1表示;把小于0.3V的电压规定为逻辑低电平,用数字0表示。数字电平从0变为1的那一瞬间叫作上升沿,从1到0的那一瞬间叫作下降沿。如下图所示:
好了,关于外部中断INT0的相关知识就介绍到这了,至于INT1~INT4的使用在此就不再赘述了,留给大家自行去学习吧。
源代码:
I51开发板第二十五讲 串行通信基础
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=69150
(出处: ICKEY BBS)
本帖最后由 SingleYork 于 2016-10-20 20:09 编辑
bg7.png
I51开发板第二十三讲 中断系统
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=66441
(出处: ICKEY BBS)
今天本菜要跟大家一起学习一下外部中断的基本使用,本帖主要以INT0的使用为例进行讲解,其他INT1/INT2/INT3/INT4的使用基本一样,就留给小伙伴们自行研究了。
首先我们来看下C51中单片机中断函数程序的一般形式:
void 函数名()
关键字interrupt后面的n是中断号,n的取值范围为0~31.编译器从8n+3处产生中断入口地址,具体的中断号n和中断向量取决于所采用的中断源。
关键字using专门用来选择单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。定义中断函数时using是一个选项,如果不用该选项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。
应该特别注意,在任何情况下都不能直接调用中断函数,因此它不能进行参数传递,也没有返回值。
I51开发板上将INT0和INT1引出来了,电路图及实物图如下:
特别声明:之前开发板上此处限流电阻(此处也有拉下作用,不仅仅是限流)用的10K是有问题的,实践证明,当此处电阻为10K,按键按下时不能将IO口完全拉低,导致按键无效,所以请收到开发板的小伙伴们在做中断实验的时候注意这个地方的电阻,至于这个阻值如何选取,且听本菜分析:
单片机的普通IO口上电复位后的工作模式基本上都是“准双向口工作模式”,下面是单片机的“准双向口工作模式结构图”:
从图中我们可以看到,准双向口有3个上拉场效应管T1、T2、T3,以适应不同的需要。根据芯片手册,其中,T1称为强上拉,上拉能力可达20mA;T2称为极弱上拉,上拉能力一般为30uA;T3称为弱上拉,一般上拉能力在150uA~250uA,典型值为200uA。在本例中,单片机的P32/INT0口使用的工作模式就是准双向口工作模式,那么在选取下拉电阻时,就对阻值有要求了。根据OC门输入口的高低电平规定,当输入电压低于0.8V时认为是低电平,当输入电压高于2V时,认为是高电平。也就是说,要想输入口输入低电平,必须使得输入口的电压低于0.8V,再根据IO口弱上拉工作模式的最低驱动能力150uA~250uA的要求,我们便可计算出最大的下拉电阻值为:R=0.8V/150uA=5.33k。也就是说,下拉电阻的值只有小于5.33K时才能将输入口下拉到低电平。实践证明,当我的下拉电阻换成4.7K时,能正常拉下,而当我再串一个1K的电阻时,即电阻为5.7K时便不能下拉。
按键K18、K19分别通过一个限流电阻连接到的单片机的INT0口和INT1口,以INT0为例,当按键K18按下时,外部中断INT0引脚电平变低,向CPU申请中断,单片机通过P30口输出低电平点亮相应的LED指示灯,再次按下INT0时,将LED取反,如此循环。
#include "config.h"
#define LED P30
void ExInt0() interrupt INT0_VECTOR //INT0中断服务程序
{
LED = !LED;
}
void main(void) //主函数
{
IT0 = 1; //设置INT0的中断类型(1:仅下降沿,0:上升沿和下降沿)
EA = 1; //开总中断
EX0 = 1; //允许INT0中断
LED = 1;
while(1);
}
其中,IT0:外部中断0中断源类型选择位。IT0=0时,INT/P32引脚上的上升沿或下降沿均可触发外部中断0.IT0=1,外部中断0为下降沿触发方式。
EA:CPU的总中断允许控制位,EA=1,CPU开发中断,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制,即各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制。
EX0:外部中断0中断允许位,EX0=1允许中断,EX0=0禁止中断。
本例中设置了INT0的触发方式为“仅下降沿触发”,也就是说,只有当INT0口有下降沿产生时,才能触发INT0中断。那么什么是上升沿和下降沿呢?
数字电路中,把电压的高低用逻辑电平来表示。逻辑电平包括高电平和低电平两种。不同的元器件形成的数字电路,电压对应的逻辑电平也不同。在TTL门电路中,把大于3.5V的电压规定为逻辑高电平,用数字1表示;把小于0.3V的电压规定为逻辑低电平,用数字0表示。数字电平从0变为1的那一瞬间叫作上升沿,从1到0的那一瞬间叫作下降沿。如下图所示:
好了,关于外部中断INT0的相关知识就介绍到这了,至于INT1~INT4的使用在此就不再赘述了,留给大家自行去学习吧。
源代码:
I51开发板第二十五讲 串行通信基础
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=69150
(出处: ICKEY BBS)