关于51单片机的外部中断使用方法

关于51单片机的外部中断使用方法,第1张

这堆问题让我很尴尬。。。。一个一个来吧

为什么要使用外部中断?   这个问题可以和第二个一起回答。 首先,你要知道什么是中断。中断顾名思义,就是当达到某种条件或遇到某个事件时,单片机立刻停下当前工作,马上去处理这个条件,或解决事件,当处理完之后,又回到事件前工作状态。外部中断,就是当单片机某个管脚的电平触发设置条件后进行的中断。之所以要是用外部中断,就是为了在外部事件发生的第一时间就对这个事件进行处理。

为什么要设置IT1、0?     IT1(IT0同理,下不详细描述)是中断的其中一个寄存器,通过设置寄存器的值,可以选择中断的触发条件。

为什么要把P1赋值为0f   这个就跟电路有关了,根据注释可以理解为,P1的8个口连接了8个LED,0x0f是16进制写法,换算成二进制就是00001111,分别对应P1的8个口,也就是P1的前四个口输出高电平,后四个口输出低电平

51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这个原理很好理解。但应用时需要特别注意的几点:

1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

2) 边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。

3) 中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。就如同没有发生一样。

4) 选择电平触发还是边沿触发方式,TCON 控制寄存器

设置。应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上说(《Keil C51使用技巧及实战》),就有类似的观点。

使用方法:

单片机的P25,P26,P27口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P10口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。

中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P32口就行,这样,就满足了你的要求了。

外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。

灯不是一定要接到P32口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。

代码如下:

#include

#define

uchar

unsigned

char

sbit

led=P1^0;

uchar

code

duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar

code

wei[3]={0x06,0x05,0x03};

void

delay(uchar

c);

void

ini_()

//初始化函数,设置中断触发方式,开中断

{

EA=1;

IT0=0;

EX0=1;

}

void

main()

{

uchar

i;

ini_();

led=0;

//由于单片机上电之后,所有的IO口默认是高电平,而要求是开始不亮,所以要将P10口开始设置为低电平。

while(1)

{

for(i=0;i<3;i++)

动态数码管闪烁

{

P2=wei[i];

P0=duan[i];

delay(35);

}

}

}

void

led_()

interrupt

0

//外部中断0函数,中断函数不需要申明

{

uchar

i;

led=1;

//在中断中让灯亮起来

while(1)

{

for(i=0;i<3;i++)

{

P2=wei[i];

P0=duan[i];

delay(1);

}

}

}

void

delay(uchar

c)

{

uchar

a,b;

for(c;c>0;c--)

for(a=38;a>0;a--)

for(b=80;b>0;b--);

}

1、打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUPA51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。

2、导入51单片机的头文件,否则后续使用的端口都会出现未定义的情况,然后在主函数中,使得EA=1,即总中断允许,打开中断的总开关。

3、分别打开外部中断0和外部中断1的分开关,即EX0=1和EX1=1,同时设置中断的触发方式为跳沿触发,可以避免增加额外的电路。

4、如果不添加别的代码的话,此时这两个中断的优先级是外部中断0>外部中断1,如果一个中断正在执行来了另外一个中断是不会打断前一个中断的执行过程的,这里需要为中断设置优先级。

5、编写完主函数后,我们要为两个中断分别编写对应的中断服务函数,才能在中断发生后产生相应的响应,注意外部中断0和外部中断1的中断号分别是0和2。

6、然后到Project菜单中的output项目中勾选Create Hex  File,OK后点击编译按钮,如果没有错误,即可生成可以烧录或者仿真的hex文件。

7、最后把生成出的hex烧入进51单片机进行运行或者装载入Proteus仿真系统进行仿真。

以上就是关于为什么要使用外部中断 外部中断是干嘛的 为什么要设置IT1和IT0 为什么要把P1赋值为0f全部的内容,包括:为什么要使用外部中断 外部中断是干嘛的 为什么要设置IT1和IT0 为什么要把P1赋值为0f、51单片机外部中断的触发方式、关于51单片机的外部中断使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/8860551.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存