📄 some.htm
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部</FONT><FONT FACE="Arial" SIZE=3>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘</FONT><FONT FACE="Arial" SIZE=3>PUSH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>’和‘</FONT><FONT FACE="Arial" SIZE=3>POP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>’,有一个特殊的专为其服务的单元,即堆栈指针</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,每当执一次</FONT><FONT FACE="Arial" SIZE=3>PUSH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指令时,</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>就(在原来值的基础上)自动加</FONT><FONT FACE="Arial" SIZE=3>1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,每当执行一次</FONT><FONT FACE="Arial" SIZE=3>POP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指令,</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>就(在原来值的基础上)自动减</FONT><FONT FACE="Arial" SIZE=3>1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。由于</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的值可以用指令加以改变,所以只要在程序开始阶段更改了</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条</FONT><FONT FACE="Arial" SIZE=3>MOV
	SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT FACE="Arial" SIZE=3>#5FH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指令,就时把堆栈设置在从内存单元</FONT><FONT FACE="Arial" SIZE=3>60H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,</FONT><FONT FACE="Arial" SIZE=3>SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的初始值为</FONT><FONT FACE="Arial" SIZE=3>07H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,这样就使堆栈从</FONT><FONT FACE="Arial" SIZE=3>08H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>单元开始往后,而</FONT><FONT FACE="Arial" SIZE=3>08H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>到</FONT><FONT FACE="Arial" SIZE=3>1FH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这个区域正是</FONT><FONT FACE="Arial" SIZE=3>8031</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的第二、三、四工作寄存器区,经常要被使用,这会造成数据的浑乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。</font></P>
<P> <FONT FACE="宋体" LANG="ZH-CN" SIZE=3> 六、单片机的开发过程</font><FONT FACE="Arial" SIZE=3>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如</FONT><FONT FACE="Arial" SIZE=3>EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT FACE="Arial" SIZE=3>CCED</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就可以写片(将程序固化在</FONT><FONT FACE="Arial" SIZE=3>EPROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中)。在源程序被编译后,生成了扩展名为</FONT><FONT FACE="Arial" SIZE=3>HEX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:</font></P>
<FONT FACE="Arial" SIZE=3><P>ORG	0000H</P>
<P>	LJMP	START</P>
<P>	ORG	040H</P>
</FONT><P><FONT FACE="Arial" SIZE=3>START</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</font></P><P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3>	</font><FONT FACE="Arial" SIZE=3>MOV	SP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT FACE="Arial" SIZE=3>#5FH ;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设堆栈</font></P>
<P><FONT FACE="Arial" SIZE=3>LOOP</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</font></P><P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3>	</font><FONT FACE="Arial" SIZE=3>NOP</font></P><P>
<FONT FACE="Arial" SIZE=3>	LJMP	LOOP	</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>;循环</font></P>
<P><FONT FACE="Arial" SIZE=3>END				</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>;结束</font></P><P ALIGN="CENTER">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3>表</font><FONT FACE="Arial" SIZE=3>1</font></P><FONT FACE="Arial" SIZE=3>
<P>:03000000020040BB</P>
<P>:0700400075815F000200431F</P>
</FONT><P ALIGN="CENTER"><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>表</font><FONT FACE="Arial" SIZE=3>2</font></P><FONT FACE="Arial" SIZE=3>
<P>02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43</P>
</FONT><P><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>				表</font><FONT FACE="Arial" SIZE=3>3</font></P>
<P><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>表</font><FONT FACE="Arial" SIZE=3>1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为源程序,表</FONT><FONT FACE="Arial" SIZE=3>2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是汇编后得到的</FONT><FONT FACE="Arial" SIZE=3>HEX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件,表</FONT><FONT FACE="Arial" SIZE=3>3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是由</FONT><FONT FACE="Arial" SIZE=3>HEX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件转换成的目标文件,也就是最终写入</FONT><FONT FACE="Arial" SIZE=3>EPROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的文件,它由编程器转换得到,也可以由</FONT><FONT FACE="Arial" SIZE=3>HEXBIN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一类的程序转换得到。学过手工汇编者应当不难找出表</FONT><FONT FACE="Arial" SIZE=3>3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与表</FONT><FONT FACE="Arial" SIZE=3>1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一一对应关系,值得注意的是从</FONT><FONT FACE="Arial" SIZE=3>02 00 40</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>后开始的一长串‘FF’,直到</FONT><FONT FACE="Arial" SIZE=3>75 81</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,这是由于伪指令:</FONT><FONT FACE="Arial" SIZE=3>ORG	 040H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>造成的结果。</font></P>
<P> <FONT FACE="宋体" LANG="ZH-CN" SIZE=3> 七、仿真、仿真机</font><FONT FACE="Arial" SIZE=3>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真是单片机开发过程中非常重要的一个环节,除了一些极简单的任务,一般产品开发过程中都要进行仿真,仿真的主要目的是进行软件调试,当然借助仿真机,也能进行一些硬件排错。一块单片机应用电路板包括单片机部份及为达到使用目的而设计的应用电路,仿真就是利用仿真机来代替应用电路板(称目标机)的单片机部份,对应用电路部份进行测试、调试。仿真有</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真和</FONT><FONT FACE="Arial" SIZE=3>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真两种,所谓</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真是指用仿真机代替目标机的</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,由仿真机向目标机的应用电路部份提供各种信号、数据,进行调试的方法。这种仿真可以通过单步运行、连续运行等多种方法来运行程序,并能观察到单片机内部的变化,便于改正程序中的错误。所谓</FONT><FONT FACE="Arial" SIZE=3>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真,就是用仿真机代替目标机的</FONT><FONT FACE="Arial" SIZE=3>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,目标机的</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>工作时,从仿真机中读取程序,并执行。这种仿真其实就是将仿真机当成一片</FONT><FONT FACE="Arial" SIZE=3>EPROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,只是省去了擦片、写片的麻烦,并没有多少调试手段可言。通常这是二种不同类型的仿真机,也就是说,一台仿真机不能既做</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真,又做</FONT><FONT FACE="Arial" SIZE=3>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真。可能的情况下,当然以</FONT><FONT FACE="Arial" SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仿真好。</font></P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3>
<P>以上系个人对单片机的理解,如有不对之处,请诸位大虾多多指点。<a href="http://czlyzhj.abc.yesite.com">发表您的高见</a>。</P>
</FONT>
<p>本文欢迎转载,请注明出自<a href="http://teach51.yeah.net">平凡的单片机</a></p>
<p><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>
</FONT></p><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P> </P>
</FONT>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -