单片机中中断服务函数 有哪位大神能帮我解释一下下面这段程序什么意思,就算能让我清楚一点也成,谢谢了

作者&投稿:延芳 (若有异议请与网页底部的电邮联系)
单片机中如果我开放了中断,但是在中断程序中关闭中断,那么中断程序中剩下的程序还会执行吗~

还会执行的,关闭中断的话只是关闭对中断的响应,而正在执行的中断服务函数只是一个稍微特别一些的函数,而且一般情况下都是会在中断服务函数中关闭中断的,这是因为在中断服务函数执行过程中,一般来说都是希望一次性执行完这个中断服务函数,而不希望被其它的中断打断,所以如果系统不是特别复杂,要求不是特别高的话都会在进入中断服务函数后立刻关闭中断,中断服务函数的最后再打开中断,这样一个中断服务函数就可以完全执行完成,避免了因为其它原因导致的中断服务函数无法执行完成,这点在用按键引起的中断时非常有用,因为按键按下一次并不一定就是真正的一次,可能会有轻微的抖动或是其它原因,这也是按键消抖的原因,如果不进行按键消抖或是在中断服务函数中关闭中断的话,很有可能会导致中断服务函数执行出错,而且很有可能会导致程序反反复复重复进入中断,如果中断服务函数比较短小的话可能当你按下一次按键触发中断的时候中断服务函数执行了N多次而自己却不知道。
总结来说,关闭中断只是关闭对中断的响应,所以是不会影响到现阶段的程序的执行,所以中断程序中剩下的程序还会执行。只是在中断关闭期间无法响应新的中断请求而已。

其实单片机的中断服务函数就像一个小型的操作系统,可以同时执行多个任务,中断触发之后进入中断函数,执行完之后,回到程序原先运行的位置,这样给人感觉同时在执行两个任务

void time1_int() interrupt 1//中断服务函数,1表示定时器0溢出中断
{
uc count,count1;
TL0=0xb0; //重赋初值,50毫秒中断值
TH0=0x3c;

if(flag==1) //标志位1则执行内部程序
{
count++; // 计数变量count加1
if(count==10) // 10次计数满
{
buzz=0; // 蜂鸣器开启
led=0; //LED灯点亮
}
if(count==20) //20次计数满
{
count=0; //计数变量清0
buzz=1; //关闭蜂鸣器
led=1; //LED灯灭
}
}
if(yanshi==1) //延时标志为1则执行内部程序
{
count1++; //计数变量count1加1
if(count1==10) //满10计数
{
led=0; //LED灯点亮
}
if(count1==20) //20次计数满
{
count1=0; //计数变量清0
led=1; //LED灯灭
sec++; //秒变量加1
if(sec==30) //30秒到
{
sec=0; //秒变量清0
flag3=1; //标志flag3置1
yanshi=0; //yanshi置0
on_off=1; //on_off置1
}
}
}

}

void time1_int() interrupt 1//中断服务函数,1表示定时器0溢出中断
             /* 上面这里有问题格式问题    */
{
uc count,count1;   //定义两个 UC类型。我也不知道uc是什么类型。没看到定义
TL0=0xb0;          // TL0 不知道哪里定义的,从赋值来看因该是单片机接口
TH0=0x3c;          // 同上
 
if(flag==1)        //如果标志位等于1
{  
count++;
if(count==10)      
{
buzz=0;            
led=0;             
}
if(count==20)
{
count=0;            
buzz=1;
led=1;
}
}
        /*上面这段应该在循环函数里面,count做自+1运算。当count=0的时候关闭LED灯,当count=20的时候开启LED灯。buzz应该是做LED灯的时候一起工作,关闭的时候一起关闭*/
if(yanshi==1)
{
count1++;
if(count1==10)
{
led=0;
}
if(count1==20)
{
count1=0;
led=1;
sec++;
if(sec==30)
{
sec=0;
flag3=1;
yanshi=0;
on_off=1;
}
}
}
/* 和上面的差不多应该放在循环里面。count1=10的时候,LED灯灭。count1=20的时候,LED灯亮起来。再用sec做一次++,应该用于计算led循环点亮的次数,到达30次后。停止点亮。退出循环,*/
}



各位哥哥姐姐们,谁能告诉我中断函数中的变量与主函数中所定义的变量有...
中断服务函数参数可以传递变量值到中断服务函数中。中断函数不能返回值。

单片机中断问题
是只有一个按钮么?如果是一个按钮,那就可以如图接。程序里开外部中断0,然后在中断服务程序里执行你的CON标号的那段指令。中断一旦发生,立即执行中断。如果要等待,那就要看具体的要求,可以在中断服务程序里做修改。

在单片机中,定时计数器中如果在中断中不给定时计数器重新赋初值会怎么样...
在单片机中,定时计数器中如果在中断中不给定时计数器重新赋初值,那么将从0开始计数,也就是说溢出值为65536,将是最长的定时时间。

keil51中的定时中断服务函数和主函数不在一个文件中为什么就程序就达不...
你把time0中的uint kk去掉。然后在time0函数前边定义extern unsigned int kk;。

在用51编程时,可不可以在中断函数里关掉当前中断并且打开或关上定时器...
1、在中断服务程序里,关闭中断允许标志当然可以(只是这个中断暂时被关闭了,如果在其他程序中没有开启中断,则这个中断服务程序不会再被执行),同样也可以启停定时器。看了你的追问,我觉得你的要求完全可以实现,只是在编程的时候,要细致一些,把逻辑理清楚就可以了。我以前做过一个出租车计价器,里程数据也是从外部中断...

汇编语言的中断服务的中断服务程序是什么?
嗯,我猜你问的是PC的,不是单片机 一、汇编语言的中断分以下几种:1.BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存 2.186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序 3.286及以上的系统...

单片机中既然有中断方式,为什么还要查询方式?
说个趣事,我曾经用freescale的dsp进行过开发,当时碰到一些问题,中国方面的支持工程师就给了我一段查询方式的代码,而美国的FAE给我们解决这方面问题的时候,提供的测试片断,完全用中断方式实现。国内下位机工程质量上不去的一个主要原因,也是因为大量的工程师们对硬件没有深刻地了解,而是大量粘贴供应...

51单片机控制继电器
不要用三极管放大,接上拉电阻即可。做实验直接选用线圈电压为5V的继电器就可以。单片机输出引脚与继电器之间要接一个三极管,单片机I\/O直接继电器电流不够。单片机是一个弱电器件,一般情况下它们大都工作在5V甚至更低。驱动电流在mA级以下。而要把它用于一些大功率场合,比如控制电动机,显然是不行的。...

怎样让单片机同时执行多项任务
这个也很容易做到啊,设置状态Mode如下:0、按键没有按下,P1 P2的LED都熄灭。1、P3.0按下时,P2的led跑马。2、P3.1按下时,P1的led跑马闪烁,松开按键停止跑马,按下执行。3、两按键同时按下,P1P2口的led都在跑马。没有想象中那么难,现在定时器的中断服务函数里面写好跑马灯的状态 switch( ...

MCS-51系列单片机的中断系统分为几个优先级?如何设定?
优先级设定方法:1、IP的状态由软件设定,某位设定为“1”,则相应的中断源为高优先级中断;某位设定为“0”,则相应的中断源为低优先级中断。2、同一优先级中的中断申请不止一个时,则有中断优先权排队问题。3、同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列从高到低为...

洛川县19649642906: 单片机中断函数void int0(void) interrupt 0 -
夔届和络: 这个写法有问题吧..void timer(void) interrupt 1 using 1{}timer:函数名称interrupt 1: 定时器中断0;using 1:R0~R7为第二组寄存器;希望能帮到你

洛川县19649642906: 求51单片机程序,两个计数器,主要是中断函数的函数名以及初始化设置 -
夔届和络: void into_into() interrupt 1 定时器0中断入口函数 { ....中断服务程序.... TH0=0;//TL0=0;// 重新给T0赐值 } void into_into() interrupt 3 定时器1中断入口函数 { ....中断服务程序.... TH1=0;//TL1=0;// 重新给T1赐值 } void to_...

洛川县19649642906: 单片机c语言中断程序 -
夔届和络: #include <reg51.h> void init(void)//声明中断初始化 { EA=1;//中断总开关EX0=1;//开中断0开关.中断1为,EX1=1;IT1=1;//采用边沿触发,下降沿有效.IT1=0为低电平触发中断. } main() { init();调用中断初始化函数== ===主程序; } void in_0(void)interrupt 0//中断服务函数 { == ==要服务的程序 }

洛川县19649642906: 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来打开中...

洛川县19649642906: sct89c52单片机中断函数都有哪些 -
夔届和络: Keil中51的中断服务函数是可以随意命名的,所以没有“中断服务函数都有哪些”这种问法.89C52的中断源包括:0.外部中断01.定时/计数器02.外部中断13.定时/计数器14.串口中断5.定时/计数器2

洛川县19649642906: 单片机用C语言编写中断的范例? -
夔届和络: 定时器溢出中断:#include<reg51.h> void timer0(void); //函数声明 void main() { P1^1 = 0; TMOD = 0x01; //定时模式 THO = 0xEE; TL0 = 0xFF; //定时时间 ET0 = 1; //中断允许EA = 1; //总中断使能 TR0 = 1; //开始计时 while(1); //等待中断 ...

洛川县19649642906: 51单片机设定中断函数 -
夔届和络:void main() { TMOD=0X01;//中断由这里设置决定,如果有多个中断,由优先级 决定.... }void init0() interrupt 0 { //外总中断0中断程序 } void time0() interrupt 1 { //定时器/计数器0中断程序 } void init1() interrupt 2 { //外总中断1子中断程序 } void time1() interrupt 3 { //定时器/计数器1中断程序 } void seral() interrupt 4 { //串口中断程序 }

洛川县19649642906: 51单片机 中断服务函数 -
夔届和络: 1. 可以不用中断服务,直接去判断标志位跳转相应的子程序. 2. 单片机在RI=1 时响应中断,当然你可不写中断程序,直接判断该标志位.

洛川县19649642906: 单片机 记时中断程序 -
夔届和络: 8051在晶振11.0952MHz以上,用方式0无法实现50ms中断一次.下面是11.0592MHz时,工作在方式1的代码: #include "reg51.h"void initTimer(void) // 初始化定时器 {TMOD=0x11; //设置工作模式TH0=0x4c; // 定时器0初值高位TL0=0xf...

洛川县19649642906: STM32的串口中断服务函数 -
夔届和络: 您好,以下是单片机实践团为您解答: 1、问题很简单直接说原因:你是不是使能了发送中断,在USART_Config里面关闭即可! 2、可以仔细考虑下使能发送中断和直接发送有何区别. 3、常在线,不明白的hi我!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网