当前位置:首页 » 存储配置 » 51中断函数怎么配置

51中断函数怎么配置

发布时间: 2022-05-13 18:35:06

A. C51中断函数在什么情况下被调用

一、中断函数的调用
中断函数是硬件或者操作系统自动调用的,也就是说只要满足触发条件,就会自动调用中断函数(此时主函数是停止的)。当中断函数执行完毕,又返回主函数继续执行主函数。然后这样不断的循环,反正只要是触发中断的条件一满足。就会自动进入中断(前提是你的中断的配置是正确的)
二、中断函数的定义
1、中断函数定义的格式为:
函数类型 函数名 interrupt n using n

其中: Interrupt后面的n是中断号。
关键字using后面的n是所选择的寄存器组,取值范围是0-3.
定义中断函数时,using是一个选项,可以省略不用。如果不用则由编译器选择一个寄存器组作为绝对寄存器组。
2、8051的中断过程通过使用interrupt关键字和中断号来实现,中断号告诉编译器中断程序的入口地址。中断号对应着IE寄存器中的使能位,换句话说,IE寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0. IE寄存器中的使能位与外部中断对应关系:
中断号 中断源

0 外部中断0

1 定时器0

2 外部中断1

3 定时器1中断
4 串行口中断

5 定时器2中断

B. 关于51单片机中断函数如何加入到主函数里面

中断函数不需要加到主函数,主函数打开中断允许即可
你用的是定时器中断,你的中断号写错了

void int0(void) interrupt 1 //0是外中断0,1才是定时器0

C. 51单片机中断函数问题

首先中断函数中一般是要杜绝循环的,也不用延时的。
延时通过定时器定时来实现,中断多次进入就能实现重复多次处理。


设置一个位变量,每次进入后取反,根据它的值来给P2口服不同的值。
启动前给flag赋值1,n赋值10,然后启动定时计数器,设置合适的初值,使其定时为500

bitflag;
intn;
voidhi()interrupt2using2
{
if(n-->0)
if(flag)
P2=0xf8;
else
P2=0x07;
flag=~flag;
}

D. c51中断函数如何定义,在使用时应注意哪些

C51的中断函数的格式为:
void FuncIr(void) interrupt x [using y]
以下是梦游的一些分析:
一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过
只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一
些。
二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存
器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈
的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,
有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。
三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是
这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如
果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接
写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部
分单独拉出来做成函数,可能代码和时间都会更好
四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命
的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多
堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。
五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的
函数就使用哪个寄存器组,我认为这样不好:
这样会增加额外的消耗,使用using会增加一下语句:
PUSH PSW
MOV PSW, #XX
....
POP PSW
更重要的是,使用using的函数不能有返回值,这是致命伤
个人推荐的方法有两种:
1、使用“#pragma NOAREGS”禁止使用绝对寄存器
2、使用“#pragme RB(x)”来指定本文件的工作寄存器组
六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定
时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数
也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

E. c51单片机如何使用中断

将按键接到P3.2(INT0)或P3.3(INT1)

main(){
EA=1;//EA总中断控制,EA=0关,EA=1开
EX0=1;//INT0中断控制。0关1开,按键接P3.2用这个
EX1=1;//INT1中断控制。0关1开,按键接P3.3用这个
//默认情况下,直接使EX0=1或EX1=1来打开中断,INT0、INT1中断是电平触发的
while(1){
//主程序写这里
}
}

/**外部中断0服务程序,按下接P3.2的开关k=0下面程序被执行**/
int0()interrupt0
{
//程序代码写这里面
}

/**外部中断1服务程序,按下接P3.3的开关k=0下面程序被执行**/
int1()interrupt2
{
//程序代码写这里面
}

注意,上面的中断程序,如果执行完后,按键k还没有放开,则中断程序会再次被执行。为了防止这种情况发生,有以下几种处理办法以:

(1)可以在中断程序中进行判断,只有放开了按钮k=1了中断函数才返回。

(2)可以在进入中断后关闭中断,让EX0或EX1=0。然后在主程序中,需要的时候再开起。

F. 51单片机定时器中断函数,定时器,还有while()这三个之间是怎么跳转,工作流程是什么呢

①TR0=1;//启动定时器0 这就是 定时器开始 工作了。

②程序配置了 定时器的 中断时间为 50ms(12MHz晶振),也就是每隔 50ms 就进入一次中断函数。进入中断后,程序又重新给定时器 定时 50ms,同时 对 中断次数 进行 记录(tt++)。主程序只要查询 记录值(tt),就能知道 定时器 中断了多少次了。
③主函数的 while(1)表示 系统是个 循环系统,一直在 循环,不结束。当 定时器 产生中断时,就会 暂停 主函数,这就称为 中断。等 中断执行结束后,又 会的 主函数 被打断的 地方,继续执行主函数的 内容。

G. 51单片机中断函数怎么写

51单片机的中断函数格式:


void jump_low() interrupt 2
{
P1 = ~P1; //位反转
}

interrupt函数格式:

void +函数名()+interrupt +数字0~4

0 表示外部中断0

1 表示定时器/计数器(T0)

2外部中断1

3:定时器/计数器(T1)

4:串行口

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

使用方法:
单片机的P2.5,P2.6,P2.7口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P1.0口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。
中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P3.2口就行,这样,就满足了你的要求了。
外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。
灯不是一定要接到P3.2口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。
代码如下:
#include
#define
uchar
unsigned
char
sbit
led=P1^0;
uchar
code
an[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口默认是高电平,而要求是开始不亮,所以要将P1.0口开始设置为低电平。

while(1)

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

动态数码管闪烁
{
P2=wei[i];
P0=an[i];
delay(35);
}
}
}
void
led_()
interrupt
0

//外部中断0函数,中断函数不需要申明
{
uchar
i;
led=1;

//在中断中让灯亮起来
while(1)
{
for(i=0;i<3;i++)
{
P2=wei[i];
P0=an[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--);
}

I. 在 C51 语言程序中,对于 51 系列单片机的 5 个中断源,中断函数定义格式中如何

例如定时器0中断:
void timer0_sev (void) interrupt 1
timer0_sev是中断程序名称,可自己定
interrupt 1指的是中断号,不能随意写
0 1 2 3 4 分别是外部中断0 定时器0 外部中断1 定时器1 串口中断。
有的还在中断序号后面写 using 0 using 1等,指的是用哪一个寄存器组,防止内存冲突,应该没什么用途
编程写两个中断程序,专门注明 using 1 using 2 用不同的分组
可查反汇编代码,根本没有修改PSW寄存器的语句
两个中断都是 PUSH ACC PUSH PSW
中断结束前 POP ACC POP PSW

热点内容
如何查看服务器硬盘详细信息 发布:2024-05-12 00:50:50 浏览:454
nutz上传文件 发布:2024-05-12 00:46:04 浏览:42
keil4编译 发布:2024-05-12 00:32:01 浏览:776
qq空间访问量辅助 发布:2024-05-12 00:14:10 浏览:305
android小图标 发布:2024-05-11 23:53:21 浏览:920
拉伸与压缩实验 发布:2024-05-11 23:40:36 浏览:59
沙漠压缩装备 发布:2024-05-11 23:38:53 浏览:785
c语言函数数组 发布:2024-05-11 23:37:32 浏览:840
根据高斯的算法 发布:2024-05-11 23:30:06 浏览:687
画面上传 发布:2024-05-11 23:29:58 浏览:891