单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。

单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。,第1张

跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1;

//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此

th0=(65536-45872)/256;

//重新装载初值tl0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void

t0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01;

//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?

(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)

结构很规矩,这个程序。

首先单片机上电复位,运行死循环前面的程序(,你这里就是init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )

接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。

中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。

定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号。

初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。

根据概念区别VB程序的三种模式:设计模式、运行模式和中断模式。

(1)设计模式:

创建应用程序的大多数工作都是在设计时完成的。当程序处于设计模式时,除了可以设置断点和创建监视表达式外,不能使用其它调试工具。

(2)运行模式:

在运行模式中,用户可以查看程序的代码,但却不能改动它。

(3)中断模式调试:

VB应用程序的大部分工作都要在中断模式下进行,VB的大部分调试工具也只能在中断模式下使用。下列情况都进入中断模式。

嗯,我猜你问的是PC的,不是单片机

一、汇编语言的中断分以下几种:

1BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存

2186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序

3286及以上的系统中断,PC会进入保护模式,在OS被加载后,中断由IDT控制,这一机制类似于中断向量表,只不过中断向量换成了选择子。这样的中断机制对不同型号的CPU有略微的差别,这里不细说了,我自己也没全弄明白。

二、中断实现的方式(8086下的普通中断)

听说过“优先级编码器”没?——如果同时有两个信号被接收,会指定某一个信号的优先级高,先执行它。中断就是类似的处理方法。

当CPU获取到某一高 *** 作优先级的信号时(比如时钟,每固定时间就会触发一次;比如键盘响应,用户希望通过Ctrl+C来退出任何正在执行的DOS程序),CPU会将当前正在执行的程序挂起来,转而去处理该信号(类似于Call,但略有不同,你看的书应该会讲到)。

处理中断时,系统会将其解释为一个标号,比如int 9h、int 21h等等。这个标号是一个序号,在内存某处存放着连续的一个表格,这个标号便是表格中的“行号”,只不过,每一行是两列,包括了该中断的处理程序的段基址和偏移量。中断向量表是从0000:0000开始的,每4字节为一个表项。中断标号x4就是对应的中断向量表项所存的地址,高地址是基地址,低地址是偏移。

这么说不知道你懂不懂。。。

反正总结一下你的问题吧,中断服务程序是加载到内存中的,它在加载前可能是存在BIOS芯片上,也可能是存在硬盘里的;中断向量表里只能写上中断处理程序的入口地址,要知道每个表项只有4字节;具体的中断服务程序,我不信你学汇编的书上不讲,我大概讲一下:CPU的INTR引脚获得了中断信号,得到了标号,比方说是5号,中断向量表项为0000:000A,读取这个内存,得到中断程序入口地址比方说是AAAA:BBBB,那么它会将当前的CS/IP、Flags寄存器入栈,然后转到AAAA:BBBB处去执行一直到iret指令返回原任务(或许该中断结束了这个任务,就不会返回了)。

至于保护模式的中断,相信你暂时还没遇到。到后面还有 *** 控8259A芯片来实现高级中断的,这个就不是一般需要学的了。

plc的中断事件包括输入中断、定时中断和高速计数器中断,发生中断事件时,CPU停止执行当前的工作,立即执行预先写好的相应的中断程序,这一过程不受PLC扫描工作方式的影响,因此使PLC能迅速响应中断事件。

1、用于中断的指针

用于中断的指针用来指明某一中断源的中断程序入口指针,执行到IRET(中断返回)指令时返回主程序。中断指针应在FEND指令之后使用。

输入中断用来接收特定的输入地址号的输入信号,图1给出了输入中断和定时器中断指针编号的意义,输入中断指针为1�0�,最高位X0~X5的元件号相对应。最低位为0时表示下降沿中断,反之为上升沿中断。例如中断指针1001之后的中断程序在输入信号X0的上升沿时执行。同一个输入中断源只能使用上升沿中断或下降沿中断,例如不能同时使用中断指针1000和1001。

CPU中断处理过程为首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由软件执行完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序。

中断返回过程为首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由软件执行完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。

扩展资料:

几个中断请求可能同时出现,但中断系统只能按一定的次序来响应和处理。可最先被响应的中断具有最高优先权,按优先级别顺序进行处理。优先权高低是由中断部件的中断排队线路确定的。对应于各中断级设置相应的屏蔽位。只有屏蔽位为1时,该中断级才能参加中断优先权排队。

当机器设置很多中断源时,为了简化设计,对中断源分组管理。具有相同中断优先权的中断源构成一个中断级。同一级中断使用同一个中断控制程序起点。

以上就是关于单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。全部的内容,包括:单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。、单片机中断程序、VB的三种工作模式有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10216427.html

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

发表评论

登录后才能评论

评论列表(0条)

保存