51单片机中断程序执行中断服务程序时,为什么一般

51单片机定时器/计数器定时溢出时,在执行中断程序的同时内部硬件计数还在继续的吗?_百度知道
51单片机定时器/计数器定时溢出时,在执行中断程序的同时内部硬件计数还在继续的吗?
这个问题知道有人问过,我想知道的是如果定时器中断服务程序中不关定时器,而且一进服务程序就赋初值,那么,如果在执行中断服务程序的时候,单片机会怎么工作?能响应中断么,如果不能,是不是一定要等到服务程序执行完,而且又计数溢出才会中断呢?
我有更好的答案
1,cpu运行,和定时器是并行进行的.2,cpu在工作中,得到了定时中断,那么它停止手头的工作去中断请求中服务,完成服务,返回原来的断点位置继续工作,3,如果在中断服务中,定时器不关,那么在cpu执行服务时,定时器是工作的.一般建议关掉,执行完再打开.
如果在执行中断服务程序的时候,这个计数器又溢出了,单片机会怎么做?
1如果在中断执行中再溢出了,它的标识位没法清零(只有进入中断标识函数中,才能硬件自动清零),只能等待cpu执行完当前中断,才能进入下次中断.2如果有中断优先级的中断来了,(IP中设置了),那么就去执行哪个高级别中断,完了再回来执行,如果,(IP中没设置),那么继续执行当前中断,执行完再去执行其他中断.3如果在此时间时,有比它低的中断来了,不去中断,但因为低的中断标识位没有手工清零,那么执行完当前中断后就继续执行这个低中断
我经验实验得到的结果是,如果在执行T0中断服务程序的时候,这个T0又溢出了,单片机等到执行完T0中断服务程序之后,马上就会再次执行这个中断服务程序,因为标志位在执行前次中断服务程序的时候已经置1,所以刚退出T0服务程序,又会再次进入。和你说的差不多,谢谢拉~~~
采纳率:46%
定时器产生中断后,在中断服务里应先关闭所有中断,执行完服务程序后再开中断。如果不关闭则会继续执行继续,如果此时有其他中断(如外部中断)此时会按中断优先级执行级别高的中断,中断优先级自己设置,~~~
能响应中断,只要你没关闭定时器,定时器会一直工作的
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机原理_期末考试试题_(附答案)_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机原理_期末考试试题_(附答案)
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩8页未读,
定制HR最喜欢的简历
你可能喜欢单片机中使用中断程序会延长主程序执行的时间吗?具体会造成什么影响? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。1被浏览581分享邀请回答暂时还没有回答,开始写第一个回答用机器的视角思考,单片机是怎么执行程序的
> 用机器的视角思考,单片机是怎么执行程序的
用机器的视角思考,单片机是怎么执行程序的
你准备写第一个单片机程序了,在此之前我假设你已经会使用编译器,也会下载程序了。P.S. 因为这些工作确实很简单,在网上找份教程看看就会了。一般刚开始学一种单片机的时候,写的第一个程序都是&点亮第一个LED&。这个程序很经典,它代表你已经成功学会操控单片机的IO端口,学51单片机亦是如此。代码如下(我使用ATMEL 公司的AT89S52):#include sbit LED = P1^0 ;void Delay(unsigned int t){
unsigned int i,
for(i=t;i>0;i--)
for(j=100;j>0;j--);}void main(void){
Delay(500);
}}单片机会从main函数开始执行,所以我们把思绪拉到main函数。一开始用了&LED = 1 ;&,初始化IO端口,让它设定在某个状态。接下来使用一个while大循环语句,调用Delay函数,时间一到就把LED取反,再回到循环,周而复始。在高级语言里面看起来这个过程貌似很简单,小学生都会理解了。但是你知道把它翻译成机器码之后是什么样的吗?在这里我不想把产生的汇编代码贴出来,免得你难以接受。不过我可以把执行过程详细地讲给你听。首先,所有的CPU,它们在执行指令的时候都是从程序段的0地址(也就是程序最开始的地方)开始的,而且CPU永远只做两件事情,一是从程序区里取出指令,二是执行这条指令,然后再回去取指令。。这样说很简单嘛,把main函数的代码从程序区的0地址开始一条条存放不就行了吗。其实不是这样的,一般0地址里存放的都不会是main函数的真实代码,它会放一条跳转指令(就是一条指令后面跟一个地址,告诉CPU要跳到那个地方去工作),这条指令跟着的是main函数的入口地址,把单片机指到main函数真正的地址去执行。为什么要这样做?看下面的图:程序存储区的固定前面几个地址是要用来存放中断服务程序的地址的(中断?后面会讲,先不管),称之为&中断向量&。程序在执行过程中遇到中断的时候,它就会根据中断信号的类型跳回到这些固定的地址,再由这些地址里面存储的指令指引,跳转到中断服务程序真正开始的地方去执行。所以,最开始的一系列地址是不能存放另的东西的,不然程序会乱掉。如果你把main函数定义在这里,没遇到中断之前当然可以正常运行,但如果你在程序中使用了中断,后果就不堪设想了。总而言之,main不是放在最开始的地方的!那它放在哪里?理论上只要避开了中断向量地址的冲突,你可以放在任何地方,你用C语言编写的时候编译器会自动处理这个问题,不用你操心,如果以后你要用汇编写了,你就必须自己定义main函数的地址了。好了,那我们就进入main函数里面看看吧。根据这段代码,你觉得第一句应该执行的语句应该是&LED = 1 ;&,然后是while循环。。BLA..BLA..错了,进入main函数之后首先要做的事情是初始化相关寄存器。因为芯片刚开始工作的时候,寄存器都处于一种未知的状态,你必须首先赋给它一个初值才行,在这个main函数中没有使用变量,所以可以不用初始化内存区,但至少CPU必须初始化一个很重要的寄存器:SP堆栈指针。关于这家伙以后再讲,总之就是先初始化。初始化完毕之后才开始执行你的真正的代码,先让LED设置为1,然后进入一个循环结构,调用延时函数Delay,等待它执行完毕之后再回来把LED取反,然后返回继续周而复始地执行。等等,有一个很重要的问题:单片机是怎么延时的?在延时的时间里它都在干什么?我们知道,单片机的一个主要性能就是执行速度,也就是一秒钟能执行多少条指令,一般速度越快代表性能越好,比如51单片机如果你在外面给它接上一个12M Hz的晶振,它的CPU就会以一百万条/秒的速度工作,即是说它执行一条指令要花费一百万分之一秒的时候即一微秒(是不是觉得很快?其实以现在的标准来说已经算很慢了,慢得像乌龟)。按照这个道理,如果我们想要让单片机延时,比如延时1ms,我们可以让CPU空转1000次,因为CPU空转一次也需要一条指令的时间。让它转上1000次之后结束,那么就相当于它延迟了1ms,延时函数就是这样写出来的,工作原理如果下图:这就是Delay函数的作用,但是这样的延时不能做到很精确,因为在这段时间里CPU要执行判断、赋值等等一系列指令,在C语言写的代码里面你不能准确预测到编译器会把你这段代码转换为怎么样的汇编指令,所以你也就无法计算出精确的变量值,只能在一个大概的范围里面选取。虽然C语言写起程序来很方便,但同时它的缺点也显现在这里:无法控制编译器写出精确的延迟函数,在有些对时间要求很高的场合里C语言无法胜任,只能用汇编来写;同时用C语言写出的程序产生的机器码一般都比用汇编写的要多,即不够精简,效率不高,在有些单片机里面程序存储容量不高的话就比较麻烦,不过现在的单片机程序存储容量普遍都比较高了。这样说来用C语言来写一些对时间性要求不高的程序是很有优势的,开发周期比汇编要高得多。
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机练习题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 单片机中断程序编写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信