📄 dpjjx10.htm
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<TITLE>单片机第八课</TITLE>
</HEAD>
<BODY LINK="#0000ff" VLINK="#800080" bgcolor="#ffffff" background="../back.jpg">
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">单片机第八课(寻址方式与指令系统)</FONT></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习</font><FONT FACE="System" LANG="ZH-CN">8051</FONT><FONT FACE="宋体" LANG="ZH-CN">的指令部份。</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">一、概述</FONT></P>
<P ALIGN="JUSTIFY"><font face="宋体">1、指令的格式</font></P>
<P ALIGN="JUSTIFY"><font face="宋体">我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,</font><font face="宋体">助记符格式,如MOV
P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。</font></P>
<P ALIGN="JUSTIFY"><font face="宋体">2、汇编</font></P>
<P ALIGN="JUSTIFY"><font face="宋体">我们写指令使用汇编格式,而计算机只懂机器码格式,所以要将我们写的汇编格式的指令转换为机器码格式,这种转换有两种方法:手工汇编和机器汇编。手工汇编实际上就是查表,因为这两种格式纯粹是格式不同,所以是一一对应的,查一张表格就行了。不过手工查表总是嫌麻烦,所以就有了计算机软件,用计算机软件来替代手工查表,这就是机器汇编。</font></P>
<P ALIGN="JUSTIFY"><font face="宋体">二、寻址</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">让我们先来复习一下我们学过的一些指令:</font><FONT FACE="System" LANG="ZH-CN">MOV
P1</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#0FFH</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">MOV
R7</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#0FFH</FONT><FONT FACE="宋体" LANG="ZH-CN">这些指令都是将一些数据送到相应的位置中去,为什么要送数据呢?第一个因为送入的数可以让灯全灭掉,第二个是为了要实现延时,从这里我们可以看出来,在用单片机的编程语言编程时,经常要用到数据的传递,事实上数据传递是单片机编程时的一项重要工作,一共有</FONT><FONT FACE="System" LANG="ZH-CN">28</FONT><FONT FACE="宋体" LANG="ZH-CN">条指令(单片机共</FONT><FONT FACE="System" LANG="ZH-CN">111</FONT><FONT FACE="宋体" LANG="ZH-CN">条指令)。下面我们就从数据传递类指令开始吧。</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN">分析一下</font><FONT FACE="System" LANG="ZH-CN">MOV
P1</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#0FFH</FONT><FONT FACE="宋体" LANG="ZH-CN">这条指令,我们不难得出结论,第一个词</FONT><FONT FACE="System" LANG="ZH-CN">MOV</FONT><FONT FACE="宋体" LANG="ZH-CN">是命令动词,也就是决定做什么事情的,</FONT><FONT FACE="System" LANG="ZH-CN">MOV</FONT><FONT FACE="宋体" LANG="ZH-CN">是</FONT><FONT FACE="System" LANG="ZH-CN">MOVE</FONT><FONT FACE="宋体" LANG="ZH-CN">少写了一个</FONT><FONT FACE="System" LANG="ZH-CN">E</FONT><FONT FACE="宋体" LANG="ZH-CN">,所以就是“传递”,这就是指令,规定做什么事情,后面还有一些参数,分析一下,数据传递必须要有一个“源”也就是你要送什么数,必须要有一个“目的”,也就是你这个数要送到什么地方去,显然在上面那条指令中,要送的数(源)就是</FONT><FONT FACE="System" LANG="ZH-CN">0FFH</FONT><FONT FACE="宋体" LANG="ZH-CN">,而要送达的地方(目的地)就是</FONT><FONT FACE="System" LANG="ZH-CN">P1</FONT><FONT FACE="宋体" LANG="ZH-CN">这个寄存器。在数据传递类指令中,均将目的地写在指令的后面,而将源写在最后。</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN">这条指令中,送给</font><FONT FACE="System" LANG="ZH-CN">P1</FONT><FONT FACE="宋体" LANG="ZH-CN">是这个数本身,换言之,做完这条指令后,我们可以明确地知道,</FONT><FONT FACE="System" LANG="ZH-CN">P1</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值是</FONT><FONT FACE="System" LANG="ZH-CN">0FFH</FONT><FONT FACE="宋体" LANG="ZH-CN">,但是并不是任何时候都可以直接给出数本身的。例如,在我们前面给出的延时程序例是这样写的:</font></P>
<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=607>
<TR>
<TD WIDTH="50%" VALIGN="TOP" HEIGHT=84>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">MAIN</font><FONT FACE="宋体" LANG="ZH-CN">:	</FONT>
<FONT FACE="System" LANG="ZH-CN">SETB P1.0 </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(1)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">LCALL
DELAY </FONT><FONT FACE="宋体" LANG="ZH-CN">;(2)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">CLR
P1.0 </FONT><FONT FACE="宋体" LANG="ZH-CN"> </FONT> <FONT FACE="宋体" LANG="ZH-CN">;(3)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">LCALL
DELAY </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(4)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">AJMP
MAIN </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(5)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">;以下子程序</FONT></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">DELAY</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">MOV R7</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#250</FONT><FONT FACE="宋体" LANG="ZH-CN"> </FONT>
<FONT FACE="宋体" LANG="ZH-CN"> ;(6)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">D1</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">MOV R6</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#250
</FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(7)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">D2</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">DJNZ R6</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">D2
</FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(8)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font> <FONT FACE="System" LANG="ZH-CN">DJNZ
R7</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">D1</FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(9)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font> <FONT FACE="宋体" LANG="ZH-CN"> </FONT><FONT FACE="System" LANG="ZH-CN">RET
</FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(10)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font> <FONT FACE="System" LANG="ZH-CN">END
</FONT><FONT FACE="宋体" LANG="ZH-CN"> </FONT> <FONT FACE="宋体" LANG="ZH-CN"> ;(11)</FONT>
<P ALIGN="JUSTIFY">
<P ALIGN="JUSTIFY">
<P ALIGN="JUSTIFY">
<P ALIGN="JUSTIFY">
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">表1</FONT>
</TD>
<TD WIDTH="50%" VALIGN="TOP" HEIGHT=84>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">MAIN</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">SETB P1.0 </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(1)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN"> </font><font face="宋体" lang="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">MOV
30H</font><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#255</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">LCALL
DELAY </FONT><FONT FACE="宋体" LANG="ZH-CN">;</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">CLR
P1.0 </FONT><FONT FACE="宋体" LANG="ZH-CN"> </FONT> <FONT FACE="宋体" LANG="ZH-CN">;(3)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN"> </FONT><font face="宋体" lang="ZH-CN"> </font>
<FONT FACE="System" LANG="ZH-CN">MOV 30H,#200</FONT></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">LCALL
DELAY </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(4)</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> </font><FONT FACE="System" LANG="ZH-CN">AJMP
MAIN </FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(5)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="宋体" LANG="ZH-CN">;以下子程序</FONT></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">DELAY</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">MOV R7</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">30H</FONT><FONT FACE="宋体" LANG="ZH-CN"> </FONT>
<FONT FACE="宋体" LANG="ZH-CN"> ;(6)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">D1</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">MOV R6</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#250
</FONT><FONT FACE="宋体" LANG="ZH-CN"> ;(7)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">D2</font><FONT FACE="宋体" LANG="ZH-CN">:</FONT>
<FONT FACE="System" LANG="ZH-CN">DJNZ R6</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">D2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -