📄 dpjjx20.htm
字号:
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">PX0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
</TR>
<TR><TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">1</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">1</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P ALIGN="CENTER">0</FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
<TD WIDTH="6%" VALIGN="TOP">
<FONT FACE="System" LANG="ZH-CN"><P> </FONT></TD>
</TR>
</TABLE>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">因此,最终,</font><FONT FACE="System" LANG="ZH-CN">IP</FONT><FONT FACE="宋体" LANG="ZH-CN">的值就是</FONT><FONT FACE="System" LANG="ZH-CN">06H</FONT><FONT FACE="宋体" LANG="ZH-CN">。</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">例:在上例中,如果</font><FONT FACE="System" LANG="ZH-CN">5</FONT><FONT FACE="宋体" LANG="ZH-CN">个中断请求同时发生,求中断响应的次序。</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">响应次序为:定时器</font><FONT FACE="System" LANG="ZH-CN">0</FONT><FONT FACE="宋体" LANG="ZH-CN">->外中断</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋体" LANG="ZH-CN">->外中断</FONT><FONT FACE="System" LANG="ZH-CN">0</FONT><FONT FACE="宋体" LANG="ZH-CN">->实时器</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋体" LANG="ZH-CN">->串行中断。</font></P><OL>
<FONT FACE="宋体" LANG="ZH-CN">
</font><FONT FACE="System" LANG="ZH-CN"><P ALIGN="JUSTIFY"></FONT><LI><FONT FACE="System" LANG="ZH-CN">MCS</font><FONT FACE="宋体" LANG="ZH-CN">-</FONT><FONT FACE="System" LANG="ZH-CN">51</FONT><FONT FACE="宋体" LANG="ZH-CN">的中断响应过程:</font></LI><FONT FACE="宋体" LANG="ZH-CN"><p></P></font></OL>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">1</font><FONT FACE="宋体" LANG="ZH-CN">、中断响应的条件:讲到这儿,我们依然对于计算机响应中断感到神奇,我们人可以响应外界的事件,是因为我们有多种“传感器“――眼、耳可以接受不同的信息,计算机是如何做到这点的呢?其实说穿了,一点都不希奇,</FONT><FONT FACE="System" LANG="ZH-CN">MCS51</FONT><FONT FACE="宋体" LANG="ZH-CN">工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋体" LANG="ZH-CN">“,如果是</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋体" LANG="ZH-CN">,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可计算机本来就是这样,它根本没人聪明。</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">	了解了上述中断的过程,就不难解中断响应的条件了。在下列三种情况之一时,</font><FONT FACE="System" LANG="ZH-CN">CPU</FONT><FONT FACE="宋体" LANG="ZH-CN">将封锁对中断的响应:</font></P><OL>
<FONT FACE="宋体" LANG="ZH-CN">
</font><FONT FACE="System" LANG="ZH-CN"><P ALIGN="JUSTIFY"></FONT><LI><FONT FACE="System" LANG="ZH-CN">CPU</font><FONT FACE="宋体" LANG="ZH-CN">正在处理一个同级或更高级别的中断请求。</font></LI><FONT FACE="宋体" LANG="ZH-CN"><p></P>
<P ALIGN="JUSTIFY"><LI>现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。</LI><p></P>
<P ALIGN="JUSTIFY"></FONT><LI><FONT FACE="宋体" LANG="ZH-CN">当前正执行的指令是返回批令(</font><FONT FACE="System" LANG="ZH-CN">RETI</FONT><FONT FACE="宋体" LANG="ZH-CN">)或访问</FONT><FONT FACE="System" LANG="ZH-CN">IP</FONT><FONT FACE="宋体" LANG="ZH-CN">、</FONT><FONT FACE="System" LANG="ZH-CN">IE</FONT><FONT FACE="宋体" LANG="ZH-CN">寄存器的指令,则</FONT><FONT FACE="System" LANG="ZH-CN">CPU</FONT><FONT FACE="宋体" LANG="ZH-CN">至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问</FONT><FONT FACE="System" LANG="ZH-CN">IP</FONT><FONT FACE="宋体" LANG="ZH-CN">、</FONT><FONT FACE="System" LANG="ZH-CN">IE</FONT><FONT FACE="宋体" LANG="ZH-CN">则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才可以响应中断。</font></LI><FONT FACE="宋体" LANG="ZH-CN"><p></P></font></OL>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">2</font><FONT FACE="宋体" LANG="ZH-CN">、中断响应过程</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">CPU</font><FONT FACE="宋体" LANG="ZH-CN">响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将相应的中断入口地址送入</FONT><FONT FACE="System" LANG="ZH-CN">PC</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">PC</FONT><FONT FACE="宋体" LANG="ZH-CN">是程序指针,</FONT><FONT FACE="System" LANG="ZH-CN">CPU</FONT><FONT FACE="宋体" LANG="ZH-CN">取指令就根据</FONT><FONT FACE="System" LANG="ZH-CN">PC</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值,</FONT><FONT FACE="System" LANG="ZH-CN">PC</FONT><FONT FACE="宋体" LANG="ZH-CN">中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了</FONT><FONT FACE="System" LANG="ZH-CN">8</FONT><FONT FACE="宋体" LANG="ZH-CN">个单元,如</FONT><FONT FACE="System" LANG="ZH-CN">0003</FONT><FONT FACE="宋体" LANG="ZH-CN">-</FONT><FONT FACE="System" LANG="ZH-CN">000B</FONT><FONT FACE="宋体" LANG="ZH-CN">,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个</FONT><FONT FACE="System" LANG="ZH-CN">LJMP</FONT><FONT FACE="宋体" LANG="ZH-CN">指令,不就可以把中断程序跳转到任何地方了吗?</font></P><FONT FACE="宋体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">一个完整的主程序看起来应该是这样的:</P>
</FONT><FONT FACE="System" LANG="ZH-CN"><P ALIGN="JUSTIFY">ORG	0000H</P>
<P ALIGN="JUSTIFY">LJMP	START</P>
<P ALIGN="JUSTIFY">ORG	0003H</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">LJMP	INT0	</font><FONT FACE="宋体" LANG="ZH-CN">;转外中断</FONT><FONT FACE="System" LANG="ZH-CN">0</font></P><FONT FACE="System" LANG="ZH-CN">
<P ALIGN="JUSTIFY">ORG	000BH</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">RETI	</font><FONT FACE="宋体" LANG="ZH-CN">;没有用定时器</FONT><FONT FACE="System" LANG="ZH-CN">0</FONT><FONT FACE="宋体" LANG="ZH-CN">中断,在此放一条</FONT><FONT FACE="System" LANG="ZH-CN">RETI</FONT><FONT FACE="宋体" LANG="ZH-CN">,万一</FONT> <FONT FACE="宋体" LANG="ZH-CN">“不小心“产生了中断,也不会有太大的后果。</font></P><FONT FACE="宋体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">。</P>
<P ALIGN="JUSTIFY">。</P>
<P ALIGN="JUSTIFY">。</P>
<P ALIGN="JUSTIFY">。</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN"> 中断程序完成后,一定要执行一条</font><FONT FACE="System" LANG="ZH-CN">RETI</FONT><FONT FACE="宋体" LANG="ZH-CN">指令,执行这条指令后,</FONT><FONT FACE="System" LANG="ZH-CN">CPU</FONT><FONT FACE="宋体" LANG="ZH-CN">将会把堆栈中保存着的地址取出,送回</FONT><FONT FACE="System" LANG="ZH-CN">PC</FONT><FONT FACE="宋体" LANG="ZH-CN">,那么程序就会从主程序的中断处继续往下执行了。注意:</FONT><FONT FACE="System" LANG="ZH-CN">CPU</FONT><FONT FACE="宋体" LANG="ZH-CN">所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程序中用到了如</FONT><FONT FACE="System" LANG="ZH-CN">A</FONT><FONT FACE="宋体" LANG="ZH-CN">、</FONT><FONT FACE="System" LANG="ZH-CN">PSW</FONT><FONT FACE="宋体" LANG="ZH-CN">等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。</font></P></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -