51单片机定时器中断一次后不再中断

2019-11-26 13:28发布

<p> 如附图</p><p> 想用定时器来定时产生中断的方式做流水灯。</p><p> 程序跑起来后,可以产生10次中断,10次过后,程序停在SJMP $,这个位置。</p><p> 请大神帮指出是什么原因</p><pre style="max-width: 100%;"><code class="cpp hljs" codemark="1">ORG <span class="hljs-number">0000</span>H LJMP AA ORG <span class="hljs-number">000</span>BH <span class="hljs-comment">//定时器T0中断入口</span> AJMP IT0P <span class="hljs-comment">//转中断处理程序</span> AA:CLR A <span class="hljs-comment">//累加器A清零</span> MOV A,<span class="hljs-meta">#11111110B <span class="hljs-comment">//累加器A赋初值 </span></span> tiME:MOV TMOD,<span class="hljs-meta">#01H <span class="hljs-comment">//设定工作模式,T0为16位定时器</span></span> CLR TF0 <span class="hljs-comment">// 定时器溢出标志清零</span> SETB TR0 <span class="hljs-comment">//允许开启定时器</span> SETB ET0 <span class="hljs-comment">// 中断允许寄存器IE中,设定允许定时器T0中断</span> SETB PT0 <span class="hljs-comment">//将定时器T0中断设定为最高优先级</span> SETB EA <span class="hljs-comment">//总中断允许</span> Initial:MOV R7,<span class="hljs-meta">#0AH <span class="hljs-comment">//R7作为计数器,装入初值</span></span> MOV TH0,<span class="hljs-meta">#00H <span class="hljs-comment">//装入定时器高8位</span></span> MOV TL0,<span class="hljs-meta">#00H <span class="hljs-comment">//装入定时器低8位</span></span> SJMP [ DISCUZ_CODE_1 ]nbsp; IT0P: DJNZ R7,RE <span class="hljs-comment">//若计数器减1不为0,则中断时间不够,中断返回</span> RL A <span class="hljs-comment">//</span> MOV P0,A <span class="hljs-comment">// 设定P0口</span> SJMP TIME RE: RETI&nbsp;</code></pre><p><span style="background-color: rgb(248, 248, 248); color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: inherit; white-space: pre-wrap;">END </span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><br> <ignore_js_op> <dl class="tattl attm"> <dd> <img src="data/attach/1911/uz6ccdgcjap5ogvk237gcm4t4pts1sen.png" alt="捕获.PNG" title="捕获.PNG"> </dd> </dl> </ignore_js_op> <p><br></p>
3条回答
人中狼
1楼 · 2019-11-26 17:17.采纳回答
主要原因是堆栈崩了,不管其他的问题,当R7递减到0时,中断程序直接跳到了TIME,没有执行RETI,所以堆栈会崩了。
你需要看初始化的例程,初始化内容一般都是只执行一次,需要多次重新设置的内容应该是叫重装载,用法不同的。
另外好好学习一下模块化编程,不要随便在多个程序模块间任意跳转。
阿信509
2楼-- · 2019-11-26 16:42
R7你送的就是10,所以10次后就再也进不去中断了,
还有,你的程序有问题,没有在中断里反复初始化的,
你找个定时中断的程序看看就明白了
alonggege
3楼-- · 2019-11-26 19:47
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢

一周热门 更多>