Keil一个关于中断的简单问题,程序如下。。。

Keil一个关于中断的简单问题,程序如下。。。,第1张

回答你的问题:

计数溢出时,执行中断程序,这里是系统跑了45872个机器周期后,开始执行中断程序,而不是你说的1S后执行中断程序,注意,这是你的错误

不管num等于多少,TR0一直都开着,因为你程序其它地方根本没有关闭,也就是说此时定时器还在计数,

所以,即使在执行if语句的时候定时器还在计数,

如果你的if语句过长的话,大于中断的延时时间45872个机器周期了,那么if语句内容根本还没有执行完,又开始下一次中断了,执行过程就是这样子的

不过,对于你的程序,你完全没有必要担心,因为:

while(1)

{

if(num==20)

{

led1=~led1;

num=0;

}

}

这句话,远远的小于45872个机器周期,也就是说,你上面那几个语句执行了好几次,中断还没发生一次

不过,一个良好的电子工程师,尤其是做工业控制的,他的定时器应该这样写:

void TO_time()interrupt 1

{

TH0=0x4C;///(65536-45872)/256;

TL0=0xD0;///(65536-45872)%256;//执行了20次中断程序后才会执行IF语句

num++;

}

即,直接把数值赋值给TH0和TL0,这样避免在中断中运算,节省时间,因为,对于所有的中断,时间越短越好

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化TIM的时间计数数据 TIM_ClearFlag(TIM2, TIM_FLAG_Update); / 清除溢出中断标志 / TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能 TIM2 中断源 TIM_Cmd(TIM2, ENABLE); //总开关

1溢出:运算结果超出了机器字长,产生溢出。溢出分为正溢出和负溢出。

两个正数相加,结果大于机器字长所能表示的最大正数,称正溢出,本来结果是正的,溢出之后变成负的,叫做正溢出。两个负数相加,结果小于机器所能表示的最小负数,成负溢出。

2 CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,当处理结束后还能返回到中止发生的地方接着执行中止之前没有完成的任务。这个过程就叫做中断。

中断意义:中断时计算机系统结构的一大变革,它是现代多道程序得以实现的基础,因为进程间的切换时依靠中断处理。中断不仅提高了处理机的效率,而且也使得外设和处理机并发工作。

我来详细解答你的问题。

1、是的,但是必须打开总中断EA和定时器0中断ET0(即给中断寄存器赋值为0x82H),编写中断程序是需要从中断入口进入的,定时器0的中断入口地址是0x000B,可以在这个地址加一个跳转到你的中断服务程序。

2、定时器0的溢出标志是TF0,定时器1的溢出标志是TF1,你现在用的是中断方式,需要在中断服务程序结束之前,加上一句CLR

TF0即可,若你想不采用中断,需要等待查询该溢出标志,当为1时,再清零,就是你说的JBC了。

3、是的。他们是独立的,否则,单片机就不能做事了。

以上就是关于Keil一个关于中断的简单问题,程序如下。。。全部的内容,包括:Keil一个关于中断的简单问题,程序如下。。。、求助,STM32 TIM2 1ms溢出中断1、1、请举例解释什么是溢出原因是什么 2、请说明什么是中断这个技术对计算机有什么意义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9852920.html

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

发表评论

登录后才能评论

评论列表(0条)

保存