单片机中断原理执行程序在主函数里运行好还在中断函数运行稳定呢

单片机定时任务与中断一个相对复杂的定时任务函数,放在主循环和放在中断里面执行,哪个更优?背景,一个主循环的运行时间大概是16ms,而中断也是定时的,5ms进一次中断。现在的定时函数放在主循环里面,这样的话,它的最小精确度就是以个主循环的时间即16ms,而如果放在中断里面的话就是5ms。。刚刚也请教了一下身边的朋友,讨论的结果大概是进中断处理复杂的函数,会因为处理哪个函数的时候,数据的保存和读取会花多余的时间。我现在的理解大概也是这样的。如果要定时任务更精确,就可以放在中断里面,反之,放主函数。不知道大婶们,有没有别的想法。
回答1:我还记得老师告诉,复杂的功能或者带循环的代码最好不要放在中断函数里面,为了保证中断函数执行的效率....就记得这些了。。。
按你目前的代码现状肯定是放主循环。中断中断的代码都是很小的。否则会减少中断效率。比如你那段代码放在5ms中断中,它要话50us的话。500/5000=10%。另外实时性不高的话就放在16ms的时间片中也不要紧啊!另外,你这么复杂的任务能不能再分成小的时间片?如,一个大任务拆分成三个阶段的小任务。
回答3:看情况,如果你的中断中需要执行马上反应的任务,放在main 中的反应速度不够。。。。本帖子已过去太久远了,不再提供回复功能。求助啊。跪求!! - 初学园地 -
51单片机学习论坛
- Powered by Discuz!
求助啊。跪求!!
单片机幼儿园
求助啊。跪求!!
#include&reg52.h&
sbit& & & & wela=P2^7;
sbit& & & & dula=P2^6;
sbit led1=P1^0;
unsigned code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(unsigned char y)
& & & & unsigned int a,b;
& & & & for(a=y;a&0;a--)
& & & & for(b=0;b&500;b++);
void main()
& & & & & & & & led1=1;
& & & & & & & & EA=1;
& & & & & & & & EX0=1;
& & & & & & & & IT0=0;
& & & & & & & & wela=1;
& & & & & & & & P0=0x00;
& & & & & & & & wela=0;
& & & & & & & & while(1)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & for(num=0;num&16;num++)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & dula=1;
& & & & & & & & & & & & & & & & & & & & P0=table[num];
& & & & & & & & & & & & & & & & & & & & dula=0;
& & & & & & & & & & & & & & & & & & & & delay(200);
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & &&&}
void stop() interrupt 0
& & & & & & & & led1=0;
看郭天祥的教学视频,做的差不多的程序。为什么下载到板上,运行,数码管数字持续变化,但是led1也亮了。程序不中断。
用杜邦线给P3.2接GND,程序并不是一直中断,只是数码管的数字变换速度变慢了。求助各位大大
单片机高中生
因为外部中断配置的是低电平中断,程序肯定是不断的进入中断,所以数码管的数字变化速度变慢是正常的,LED1一直亮也是正确的,因为程序里就只做了点亮LED的指令,没有关的指令啊。
单片机幼儿园
2L不明白,求详细解释
我在主程序那有一条led1=1;的
在不输入中断信号的时候不应该运行& && && && &
这一条指令。但是为什么我在没送入中断信号就执行了呢?
还有就是进入中断程序应该不会继续执行主程序的了吧,直到我不再输入中断信号。为什么数码管的数字还是会变化。
还是弱弱的求解释。
单片机高中生
单片机上电后跳转至main函数,执行第一句led1=1;把LED灯关掉,然后一句一句执行到while(1),然后就会一直执行while内的数码管显示程序,在外部中断0有效时进入中断程序,把LED点亮,然后返回接着执行数码管显示程序,但是中断信号一直没有撤销,所以从中断程序返回后执行一条显示指令会再次进入中断程序,当然中断程序还是把LED点亮,然后再返回……不断的这么执行下来,就是你看到的结果了
单片机幼儿园
哦,就是一直送中断信号的话程序执行完中断程序,就算中断信号不撤销程序也会自动转回原来的程序吗?我还以为只要不撤销中断信号,程序就会一直停在中断程序那里。
但是为什么不送中断信号程序会执行
void stop() interrupt 0
& && && && && & led1=0;
就是一启动led1就亮了。
单片机高中生
看看你的硬件图,LED是如何驱动的?
单片机幼儿园
我觉得是程序按步的执行,但是把我的中断程序也执行一次了。
void main()
& & & & EA=1;
& & & & IT0=0;
& & & & EX0=1;& & & &
& && && && && && && &wela=1;
& & & & P0=0
& & & & wela=0;
& & & & & & & & for(num=0;num&16;num++)
& & & & & & & & {
& & & & & & & & & & & & dula=1;
& & & & & & & & & & & & P0=table[num];
& & & & & & & & & & & & dula=0;
& & & & & & & & & & & & delay(200);
& & & & & & & & & & & & led1=1;
& & & & & & & &&&
& & & & & & & & }
void st() interrupt 0
每次数字显示到F以后,然后led1就亮,然后等数显显示1的时候led1才灭。
单片机幼儿园
我看见我的原理图上,INT0口还接了个CSDA,我把ADC0804还有DAC832都拔了,还有把位选锁存器输出CSDA的口都设置1还是不行。
[ 本帖最后由 wowmen011 于
13:42 编辑 ]
单片机高中生
把你原理图发出来吧,大家可以帮你分析一下哪里的问题
单片机幼儿园
我想可能是P3^2口电压不稳定的原因,用杜邦线把VCC接到P3^2口就不然在运行中不时的进入中断
我想发原理图,但是不知道哪个网站传图能外链
单片机高中生
那就在P3.2口上接一个上拉电阻,你直接接到VCC上,就不能控制它进入中断了,不过51的片子内部有弱上拉的,可能是外部的其它器件引起的,所以还是要好好看看原理图,是不是还有什么地方共用了,如果确实是外部其它器件引起的误中断,即使加上拉也是没用的
单片机小学生
问一下高手们。。函数的声明什么时候用啊。。。楼主怎么没有对延时子函数进行声明呢???请高手指点,谢谢!
单片机幼儿园
回复 12# tianjian 的帖子
我觉得函数要声明是因为函数是写在主程序后面的。单片机的程序是逐步来扫描的。如果函数写在主程序后面,那在运行主程序的时候单片机还没能给子函数分配运行空间。主程序里面要引用到子函数的指令就会出错了吧。
单片机幼儿园
我的子函数是写在程序的开头,所以不用声明
单片机小学生
哦,明白了。。谢谢哈。君,已阅读到文档的结尾了呢~~
单片机基础学习53690,单片机零基础学习,单片机学习网站,单片机学习,学习单片机有前途吗,如何学习单片机,单片机学习网,stc单片机学习,pic单片机学习网,单片机学习书籍
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机基础学习53690
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 单片机中断优先级 的文章

 

随机推荐