单片机应用系统设计:第7章汇编语言程序设计基础

上传人:大米 文档编号:569840852 上传时间:2024-07-31 格式:PPT 页数:51 大小:1.31MB
返回 下载 相关 举报
单片机应用系统设计:第7章汇编语言程序设计基础_第1页
第1页 / 共51页
单片机应用系统设计:第7章汇编语言程序设计基础_第2页
第2页 / 共51页
单片机应用系统设计:第7章汇编语言程序设计基础_第3页
第3页 / 共51页
单片机应用系统设计:第7章汇编语言程序设计基础_第4页
第4页 / 共51页
单片机应用系统设计:第7章汇编语言程序设计基础_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《单片机应用系统设计:第7章汇编语言程序设计基础》由会员分享,可在线阅读,更多相关《单片机应用系统设计:第7章汇编语言程序设计基础(51页珍藏版)》请在金锄头文库上搜索。

1、第第7 7章章 MCS-51MCS-51汇编语言程序设计基础汇编语言程序设计基础7.1 汇编语言程序设计概述7.2 汇编语言程序的基本结构形式7.1 7.1 7.1 7.1 汇编语言程序设计概述汇编语言程序设计概述汇编语言程序设计概述汇编语言程序设计概述 7.1.1 7.1.1 7.1.1 7.1.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言二进制代码表示的指令、数字和符号简称为二进制代码表示的指令、数字和符号简称为机器。语言不易懂,难记忆,易出错。机器。语言不易懂,难记忆,易出错。英文助记符表示的指令称为符号语言或英文助

2、记符表示的指令称为符号语言或汇编语言汇编语言不受具体机器的限制不受具体机器的限制, ,使用了许多数学公式和使用了许多数学公式和数学计算上的习惯用语。数学计算上的习惯用语。机器语言机器语言汇编语言汇编语言高级语高级语言言汇编语言特点:汇编语言特点:(1) (1) 面向机器的语言,程序设计员须对面向机器的语言,程序设计员须对MCS-51MCS-51的硬件有相当深的硬件有相当深入的了解。入的了解。(2) (2) 助记符指令和机器指令一一对应,用汇编语言编写的程序助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出效率高,占用存储空间小,运行速度快,

3、用汇编语言能编写出最优化的程序。最优化的程序。(3) (3) 能直接管理和控制硬件设备(功能部件),它能处理中能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及断,也能直接访问存储器及I/OI/O接口电路。接口电路。 汇编语言和机器语言都脱离不开具体机器的硬件,均是面汇编语言和机器语言都脱离不开具体机器的硬件,均是面向向“机器机器”的语言,缺乏通用性。的语言,缺乏通用性。 高级语言优点:通用性强,直观、易懂、易学,可读性好。可高级语言优点:通用性强,直观、易懂、易学,可读性好。可 使用使用C C语言(语言(C51C51)、)、PL/MPL/M语言来进行语言来进行MCS-5

4、1MCS-51的应的应 用程序设计。用程序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。不可缺的。 在很多需要直接控制硬件的应用场合,则更是非用汇编语在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。言不可。 可可C C语言和汇编语言混合编程。语言和汇编语言混合编程。7.1.2 7.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式 两种基本类型:指令语句和伪指令语句两种基本类型:指令语句和伪指令语句(1 1)指令语句)指令语句 每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码

5、机器代码机器代码(2 2)伪指令语句)伪指令语句 是为汇编服务的。在汇编时没有机器代码与之对是为汇编服务的。在汇编时没有机器代码与之对应。应。 MCS-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下: 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段规则:规则:(1 1)标号字段和操作字码段之间要有冒号)标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段和操作数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)双操作数之间用逗号相隔;)双操作数之间用逗号相隔; (4 4)操操作作数数字字段段和和注

6、注释释字字段段之之间间的的分分界界符符用用分分号号“;”相隔。相隔。 操作码字段和操作数字段为必选项,其余各段为任选操作码字段和操作数字段为必选项,其余各段为任选 项。项。 例例 下面是一段汇编语言程序的四分段书写格式下面是一段汇编语言程序的四分段书写格式 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段STARTSTART: MOV AMOV A,#00H #00H ;0A0A MOV R1 MOV R1,#10 #10 ;10R110R1 MOV R2 MOV R2,#00000011B #00000011B ;3R23R2 LOOP LOOP: ADD AA

7、DD A,R2 R2 ;(;(A A)+ +(R2R2)A A DJNZ R1 DJNZ R1,LOOP LOOP ;R1R1内容减内容减1 1不为零,则循环不为零,则循环 NOPNOP HERE HERE: SJMP HERESJMP HERE基本语法规则:基本语法规则:1 1标号字段标号字段 是语句所在地址的标志符号是语句所在地址的标志符号 (1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:” (2 2)由)由1-81-8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一次)同一标号在一个程序中只能定义一次 (4 4)不能使用汇编语言已经定义的符号作为标

8、号)不能使用汇编语言已经定义的符号作为标号 2 2操作码字段操作码字段 汇编程序就是根据这一字段来生成机器代码的。汇编程序就是根据这一字段来生成机器代码的。3 3操作数字段操作数字段 通常有单操作数、双操作数和无操作数三种情况。如果是通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。双操作数,则操作数之间,要以逗号隔开。(1 1)十六进制、二进制和十进制形式的操作数表示采用十六)十六进制、二进制和十进制形式的操作数表示采用十六进制形式来表示进制形式来表示 ,某些特殊场合才采用二进制或十进制的表,某些特殊场合才采用二进制或十进制的表示形式示形式 。 十六进制

9、,后缀十六进制,后缀“H H” ;二进制,后缀;二进制,后缀“B B” 。 十进制,后缀十进制,后缀“D D”,也可省略。,也可省略。 若十六进制的操作数以字符若十六进制的操作数以字符A A- -F F中的某个开头时,则需在它中的某个开头时,则需在它前面加一个前面加一个 “0 0”,以便在汇编时把它和字符,以便在汇编时把它和字符A AF F区别开来。区别开来。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代号来表示,也可采用工作寄存器和特殊功能寄存器的代号来表示,也可 用其地址来表示。用其地址来表示。 例如,累加器可用例如,累加器

10、可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H来表来表 示,示,0E0H0E0H为累加器为累加器A A的地址。的地址。(3 3)美元符号)美元符号$ $的使用的使用 用于表示该转移指令操作码所在的地址。用于表示该转移指令操作码所在的地址。 例如,如下指令:例如,如下指令: HEREHERE:SJMP HERESJMP HERE 可写为:可写为: SJMP $SJMP $4 4注释字段注释字段 必须以分号必须以分号“;”开头,换行书写,但必须注意也要以分号开头,换行书写,但必须注意也要以分号“;”开头。开头。 汇编时,注释字段不会产生机器代码。汇编时,注释字段不会产生

11、机器代码。7.1.3 7.1.3 伪指令伪指令 在在MCS-51MCS-51汇编语言源程序中应有向汇编程序发出的指示信汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过使用伪指令来实现息,告诉它如何完成汇编工作,这是通过使用伪指令来实现的。的。 也称为汇编程序控制命令。只有在汇编前的源程序中才有伪也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要,所以在的必要,所以“伪伪”体现在汇编时,伪指令没有相应的机器体现在汇编时,伪指令没有相应的机器代码产生。

12、代码产生。常用的伪指令:常用的伪指令: 1.ORG1.ORG(ORiGinORiGin)汇编起始地址命令)汇编起始地址命令 在汇编语言源程序的开始,通常都用一条在汇编语言源程序的开始,通常都用一条ORGORG伪指令伪指令来实现规定程序的起始地址。如不用来实现规定程序的起始地址。如不用ORGORG规定,则汇规定,则汇编得到的目标程序将从编得到的目标程序将从0000H0000H开始。开始。 例如例如: ORG 2000HORG 2000H START START:MOV A,#00HMOV A,#00H 规定标号规定标号STARTSTART代表地址为代表地址为2000H2000H开始。开始。 在一

13、个源程序中,可多次使用在一个源程序中,可多次使用ORGORG指令,来规定不同的指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。地址不能交叉、重叠。例如:例如: ORG 2000HORG 2000H ORG 2500H ORG 2500H ORG 3000H ORG 3000H 2. END(END of assembly)2. END(END of assembly)汇编终止命令汇编终止命令 汇编语言源程序的结束标志,用于终止源程序的汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条汇编

14、工作。在整个源程序中只能有一条ENDEND命令,命令,且位于程序的最后。且位于程序的最后。3 3DBDB(Define ByteDefine Byte)定义字节命令)定义字节命令 在程序存储器的连续单元中定义字节数据。在程序存储器的连续单元中定义字节数据。 ORG 2000HORG 2000H DB 30H DB 30H,40H40H,2424,“C C”,“B B” 汇编后:汇编后: (2000H2000H)=30H=30H (2001H2001H)=40H=40H (2002H2002H)=18H=18H(1010进制数进制数2424) (2003H2003H)=43H=43H(字符(字符

15、“C C”的的ASCIIASCII码)码) (2004H2004H)=42H=42H(字符(字符“B B”的的ASCIIASCII码)码) DBDB功功能能是是从从指指定定单单元元开开始始定定义义(存存储储)若若干干个个字字节节,1010进进制制数数自自然然转转换换成成1616进进制制数数,字字母母按按ASCIIASCII码存储。码存储。4 4DWDW(Define WordDefine Word)定义数据字命令)定义数据字命令 从指定的地址开始,在程序存储器的连续单元中定义从指定的地址开始,在程序存储器的连续单元中定义1616位位的数据字。的数据字。 例如:例如: ORG 2000HORG

16、2000H DW 1246H DW 1246H,7BH7BH,1010 汇编后:汇编后: (2000H2000H)=12H=12H;第;第1 1个字个字 (2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2个字个字 (2003H2003H)=7BH=7BH (2004H2004H)=00H=00H;第;第3 3个字(个字(2005H2005H)=0AH=0AH (2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)赋值命令)赋值命令 用于给标号赋值。赋值以后,其标号值在整个程用于给标号赋值。赋值以后,其标号值在整

17、个程序有效。序有效。 例如:例如: TEST EQU 2000HTEST EQU 2000H 表示标号表示标号TEST=2000HTEST=2000H,在汇编时,凡是遇到标号,在汇编时,凡是遇到标号TESTTEST时,均以时,均以2000H2000H来代替。来代替。 程序存储器六个入口程序存储器六个入口 ORG 0000HORG 0000H; ; 主程序入口主程序入口 AJMP MAINAJMP MAIN ORG 0003HORG 0003H LJMP INT0LJMP INT0; ; 外中断外中断INT0INT0中断子程序入中断子程序入ORG 000BHORG 000BHLJMP T0 LJ

18、MP T0 ; ; 定时器定时器T0T0中断子程序入口中断子程序入口ORG 0013HORG 0013HLJMP INT1LJMP INT1; ; 外中断外中断INT1INT1中断子程序入口中断子程序入口ORG 001BHORG 001BHLJMP T1LJMP T1; ; 定时器定时器T1T1中断子程序入口中断子程序入口ORG 0023HORG 0023HLJMP SIOLJMP SIO; ; 串行口中断子程序入口串行口中断子程序入口ORG XXXXHORG XXXXHMAINMAIN:; ; 主程序主程序INT0INT0:; ; 外中断外中断INT0INT0中断子程序中断子程序T0T0:;

19、 ; 定定时器器T0T0中断子程序中断子程序INT1INT1: ; ; 外中断外中断INT1INT1中断子程序中断子程序 T1T1: ; ; 定定时器器T1T1中断子程序中断子程序 SIOSIO: ; ; 串行口中断子程序串行口中断子程序7.2 7.2 7.2 7.2 汇编语言程序的基本结构形式汇编语言程序的基本结构形式汇编语言程序的基本结构形式汇编语言程序的基本结构形式查表结构查表结构顺序结构顺序结构分支结构分支结构循环结构循环结构子程序结构子程序结构7.2.1 7.2.1 顺序结构程序设计顺序结构程序设计 顺序结构程序又称简单结构程序,是程序设计顺序结构程序又称简单结构程序,是程序设计中最

20、基本的,在整个程序设计中所占比例极大,是中最基本的,在整个程序设计中所占比例极大,是程序设计的基础。这里所说的简单结构程序是指一程序设计的基础。这里所说的简单结构程序是指一种无分支的直接程序,是按照逻辑操作顺序,从第种无分支的直接程序,是按照逻辑操作顺序,从第一条指令开始逐条执行一条指令开始逐条执行, ,直到最后一条指令为止。直到最后一条指令为止。 例:设有两个例:设有两个4 4位位BCDBCD码,分别存放在码,分别存放在23H23H、22H22H单元和单元和33H33H、 32H32H单元中,求它们的和,并送入单元中,求它们的和,并送入43H43H、42H42H单元中单元中. . (以上均为

21、低位在低字节,高位在高字节)(以上均为低位在低字节,高位在高字节) 开始(22H)AA+(32H)ABCD码调整A(42H)(23H)AA+(33H)+CABCD码调整A(43H)结束ORG 2000HORG 2000HCLR CCLR CMOV AMOV A,22H22HADD AADD A,32H32HDADA A A;BCDBCD码调整整MOV 42HMOV 42H,A A;存;存结果低位果低位MOV AMOV A,23H23HADDC AADDC A,33H33H DA ADA AMOV 43HMOV 43H,A A;存;存结果高位果高位LLLL: SJMPSJMP LL LLEND

22、END 例例2 2:求一个:求一个1616位二进制数的补码。位二进制数的补码。考虑加考虑加1 1可否用可否用INCINC指令来实现?指令来实现?不可以。因为不影响不可以。因为不影响CYCY标志。标志。ORGORG2000H2000HMOVMOVA A,R0R0CPLCPLA AADDADDA A,#1#1MOVMOVR2R2,A A;低位字;低位字节补码送送R2R2MOVMOVA A,R1R1CPLCPLA AADDCADDCA A,#0#0;高位加;高位加进位位MOVMOVR3R3,A ALPLP:SJMPSJMPLPLPEND END 设此设此1616位二进制数存放在位二进制数存放在R1R

23、1、R0R0中,求补后送存中,求补后送存R3R3、R2R2中。中。7.2.2 7.2.2 分支转移程序设计分支转移程序设计 转移指令有分为转移指令有分为无条件转移和有条件转移无条件转移和有条件转移,因此分支,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为单分支转移结有条件分支转移程序按结构类型来分,又分为单分支转移结构和多分支转移结构构和多分支转移结构。无条件转移无条件转移它的程序转移方向是设计者事先安排的,与已执行程序的它的程序转移方向是设计者事先安排的,与已执行程序的结果无关,使用时只

24、需给出正确的转移目标地址或位移量即结果无关,使用时只需给出正确的转移目标地址或位移量即可。可。 条件转移条件转移它是根据已执行的程序,对标志位或对累加器它是根据已执行的程序,对标志位或对累加器A A或对内部或对内部RAMRAM某位的影响结果,决定程序的走向,形成各种分支。某位的影响结果,决定程序的走向,形成各种分支。1 1单分支转移结构单分支转移结构 仅有两个出口,两者选一。仅有两个出口,两者选一。例例 求单字节有符号数的二进制补码求单字节有符号数的二进制补码参考程序参考程序:CMPTCMPT: JNB Acc.7,RETURNJNB Acc.7,RETURN;(A A)00,不需转换,不需转

25、换 MOV CMOV C,Acc.7 Acc.7 ;符号位保存符号位保存 CPL ACPL A ;(;(A A)求反,加)求反,加1 1 ADD A ADD A,#1#1 MOV Acc.7 MOV Acc.7,C C ;符号位存;符号位存A A的最高位的最高位RETURNRETURN: RET RET 2多分支转移结构多分支转移结构 程序的判别部分有两个以上的出口流向程序的判别部分有两个以上的出口流向常见的两种形式如下:常见的两种形式如下: 指令系统提供了非常有用的两种多分支选择指令指令系统提供了非常有用的两种多分支选择指令: : 间接转移指令间接转移指令: JMP A+DPTR;: JMP

26、 A+DPTR;比较转移指令比较转移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,relCJNE A,#data,rel; CJNE Rn,#data,relCJNE Rn,#data,rel; CJNE Ri,#data,relCJNE Ri,#data,rel; 需根据某一单元的内容是需根据某一单元的内容是0 0,1 1,n n,来分别转,来分别转向处理程序向处理程序0 0,处理程序,处理程序1 1,处理程序处理程序n n。一个。一个典型的例子就是当单片机系统中的典型的例子就是当单片机系统中的键盘按下键盘按下时,时,就会得到一

27、个就会得到一个键值键值,根据不同的键值,跳向不同,根据不同的键值,跳向不同的键处理程序入口。对于这种情况,可用直接转的键处理程序入口。对于这种情况,可用直接转移指令(移指令(LJMPLJMP或或AJMPAJMP指令)组成一个转移表,然指令)组成一个转移表,然后把该单元的内容读入累加器后把该单元的内容读入累加器A A,转移表首地址放,转移表首地址放入入DPTRDPTR中,再利用间接转移指令实现分支转移。中,再利用间接转移指令实现分支转移。 例:按照例:按照R7R7的内容转向的内容转向5 5个操作程序。个操作程序。JUMP3JUMP3:MOVMOVA A,R7R7MOVMOVDPTRDPTR,#T

28、AB3#TAB3MOVCMOVCA A,A+DPTRA+DPTRJMPJMPA+DPTRA+DPTRTAB3:TAB3:DBDBOPR0-TAB3OPR0-TAB3DBDBOPR1-TAB3OPR1-TAB3DBDBOPR2-TAB3OPR2-TAB3DBDBOPR3-TAB3OPR3-TAB3DBDBOPR4-TAB3OPR4-TAB3OPR0:OPR0:操作程序操作程序0 0OPR1:OPR1:操作程序操作程序1 1OPR4:OPR4:操作程序操作程序4 47.2.3 7.2.3 循环程序设计循环程序设计 特点是程序中含有可以反复执行的程序段,该程序段通特点是程序中含有可以反复执行的程序段

29、,该程序段通常称为循环体。例如求常称为循环体。例如求100100个数的累加和,则没有必要连续个数的累加和,则没有必要连续安排安排100100条加法指令,可以只用一条加法指令并使其循环执条加法指令,可以只用一条加法指令并使其循环执行行100100次。次。 (1 1)可大大缩短程序长度)可大大缩短程序长度(2 2)使程序所占的内存单元数量少)使程序所占的内存单元数量少(3 3)使程序结构紧凑和可读性变好。)使程序结构紧凑和可读性变好。一、循环程序的结构一、循环程序的结构一、循环程序的结构一、循环程序的结构循环控制循环控制在重复执行循环体的过程中在重复执行循环体的过程中, ,不断修改循环控制变量,不

30、断修改循环控制变量,直到符合结束条件直到符合结束条件, ,就结束就结束循环程序的执行。循环程序的执行。循环初始化循环初始化循环前的的准备工作循环前的的准备工作, ,例循例循环控制计数初值的设置、地环控制计数初值的设置、地址指针的起始地址的设置、址指针的起始地址的设置、为变量预置初值等。为变量预置初值等。循环结束循环结束对循环程序执行的结果进行对循环程序执行的结果进行分析、处理和存放。分析、处理和存放。循环体循环体要求重复执行的程序段部分要求重复执行的程序段部分。主要完成计算或操作任务。主要完成计算或操作任务,同时也包括对初始值的修,同时也包括对初始值的修改。改。图图4-84-8是计数循环控制结

31、构,图是计数循环控制结构,图4-94-9是条件控制结构。是条件控制结构。 二、循环结构的控制二、循环结构的控制1 1计数循环结构计数循环结构 计数循环控制结构是依据计数器的值来决定循环计数循环控制结构是依据计数器的值来决定循环次数,一般为减次数,一般为减“1 1” 计数器,计数器减到计数器,计数器减到“0 0”时,时,结束循环。计数器的初值是在初始化时设定。结束循环。计数器的初值是在初始化时设定。MCS-51MCS-51的指令系统提供了功能极强的循环控制指令:的指令系统提供了功能极强的循环控制指令:DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制计数器;工作寄存器作控制计数器DJ

32、NZ direct,relDJNZ direct,rel;以直接寻址单元作控制计数器。;以直接寻址单元作控制计数器。计数控制方法只有在循环次数已知的情况下才适用计数控制方法只有在循环次数已知的情况下才适用 2 2条件控制结构条件控制结构 例例 50ms50ms延时程序延时程序。 延延时时程程序序与与MCS-51MCS-51指指令令执执行行时时间间有有很很大大的的关关系系。在在使使用用12MHz12MHz晶晶振振时时,一一个个机机器器周周期期为为1 1s,s,执执行行一一条条DJNZDJNZ指指令令的的时时间间为为2 2s s。这这时时,可可用用双双重重循循环环方方法法写写出出下下面面如如下下的

33、的延延时时50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#125DEL1: MOV R6,#125DEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;125*2=250125*2=250s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;0.25ms*200=50ms0.25ms*200=50ms RET RET以上延时程序不太精确,它没有考虑到除以上延时程序不太精确,它没有考虑到除“DJNZ R6,DEL2 DJNZ R6,DEL2 ”指令外的其它指令的执行时间,如把其它指令的执行

34、时间计指令外的其它指令的执行时间,如把其它指令的执行时间计算在内,它的延时时间为:算在内,它的延时时间为: (250+1+2250+1+2)* *200+1=50.301ms200+1=50.301ms 如果要求比较精确的延时,可按如下修改:如果要求比较精确的延时,可按如下修改:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#122DEL1: MOV R6,#122 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2*122+2=2462*122+2=246s s DJNZ R7,DEL1 DJNZ R7,

35、DEL1 ;(246+1+1+2)*200+1=50.001ms(246+1+1+2)*200+1=50.001ms RET RET实实际际延延迟迟时时间间为为50.001ms50.001ms,注注意意。软软件件延延时时程程序序,不不允允许许有有中中断,否则将严重影响定时的准确性。断,否则将严重影响定时的准确性。例例 片内片内RAMRAM中存放一批数据,中存放一批数据,查找出最大值并存放于查找出最大值并存放于R3R3中。中。设设R0R0中存首地址,中存首地址,R2R2中存放字节中存放字节数,程序框图如图数,程序框图如图4-14-1所示。所示。 MOVMOVA A, R0 R0MOVMOVR3R

36、3, A A ;假设第一次取的数为最大值;假设第一次取的数为最大值 INC INCR0R0;地址指针加;地址指针加1 1DEC R2DEC R2;字节数减;字节数减1 1LOOPLOOP: MOVMOV A A, R0 R0 CJNE ACJNE A,R3R3,LOOP1LOOP1;取出的数与存放的最大;取出的数与存放的最大 ;数比较;数比较 LOOP1 LOOP1:JC LOOP2JC LOOP2;C=1C=1,取出的数小跳转,取出的数小跳转 MOV R3MOV R3,A A;C=0C=0,取出的数大,替换,取出的数大,替换R3R3LOOP2:LOOP2:INCINCR0R0DJNZ R2,

37、 LOOPDJNZ R2, LOOP;是否比较结束;是否比较结束 RET RET 7.2.4 7.2.4 子程序结构程序子程序结构程序 一种能完成某一特定任务的程序段。其资源要为所有调用一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应编写子程序时应注意以下问题:注意以下问题:1 1子程序的第一条指令的地址称为子程序的入口地址。该指令子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。前必须有标号。2 2主程序调用子程序,两条子程序调用指令:主程序调用子程序,

38、两条子程序调用指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11 ACALL addr11 (2 2)长调用指令:)长调用指令:LCALL addr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 地址地址主程序主程序地址地址SUB2SUB2LCALL SB20 LCALL SB20 MAIN4MAIN4LCAL

39、L SB30 LCALL SB30 RETRET RETRETSB20SB20S1S1SB30SB30SUB1SUB1 MAIN4 MAIN4 高位高位 S1 S1 高位高位S1 S1 低位低位MAIN4 MAIN4 低位低位SP+4SP+3SP+2SP+1SP堆堆栈存存储区区 例:用例:用P1P1口作为数据读入口,为了读取稳定的值,要求连续读口作为数据读入口,为了读取稳定的值,要求连续读8 8次后取平均。次后取平均。 设设R0R0,R1R1作为连续作为连续8 8次累加的次累加的1616位工作寄存器,最后取平均值,即除以位工作寄存器,最后取平均值,即除以8 8,相当于除以,相当于除以2 23

40、3。在此采。在此采用将用将R0R0,R1R1各右移一次的操作重复三次。最后结果在各右移一次的操作重复三次。最后结果在R1R1中。中。 ORGORG2000H2000H MOV MOVR0R0,#00H#00H;清;清1616位中间寄存器位中间寄存器 MOVMOVR1R1,#00H#00H MOV MOVR2R2,#08H#08H;累加次数送;累加次数送R2R2LP2LP2:MOVMOV P1P1,#0FFH#0FFH;输入读数;输入读数 MOVMOVA A,P1P1 ADD ADDA A,#R1#R1;加入中间寄存器低;加入中间寄存器低8 8位位 JNCJNCLP1LP1;无进位则暂存结果;无

41、进位则暂存结果 INCINCR0R0;有进位则中间寄存器高;有进位则中间寄存器高8 8位增位增1 1LP1LP1: MOV MOVR1R1,A A;暂存低;暂存低8 8位结果位结果 DJNZDJNZR2R2,LP2LP2;未完循环;未完循环 MOVMOVR2R2,#03H#03HLP3LP3: MOV MOVA A,R0R0;高;高8 8位结果送入位结果送入A A RRC RRCA A;A A中最低位右移入中最低位右移入C C MOV MOVR0R0,A A MOV MOVA A,R1R1 RRC RRCA A;低;低8 8位结果带进位右移,则高位结果带进位右移,则高8 8位的位的 ;低位进入

42、低;低位进入低8 8位的最高位位的最高位 MOVMOVR1R1,A A DJNZ DJNZR2R2,LP3LP3LPLP: SJMPSJMPLPLP开始清累加器R0,R1,设R2计数器P1口读入数,加入R0,R1R2-1=0结束NY累加结果取平均例:编制一个循环闪烁灯的程序。有例:编制一个循环闪烁灯的程序。有8 8个发光二极管,每次其中个发光二极管,每次其中某个灯闪烁点亮某个灯闪烁点亮1010次后,转移到下一个闪烁次后,转移到下一个闪烁1010次,循环不止。次,循环不止。 D0 Q0D0 Q0D7 Q7D7 Q7 LED0LED0LED7LED7+5V+5VP1.0P1.0P1.1P1.1P1

43、.2P1.2P1.3P1.3P1.4P1.4P1.5P1.5P1.6 P1.6 P1.7P1.780C5180C5174LS24074LS240解:解:80518051的的P1P1口输出经过口输出经过74LS240 874LS240 8路反相驱动后,点燃发光二极管。路反相驱动后,点燃发光二极管。 由图可见,低电平发光二极管可被点亮。由图可见,低电平发光二极管可被点亮。MOVMOVA A,#80#80;初值;初值SHIFT1SHIFT1:LCALLLCALL FLASHFLASH ;闪亮;闪亮1010次次RRRRA A;右移;右移SJMPSJMPSHIFT1SHIFT1;循环;循环FLASHFL

44、ASH:MOVMOVR2R2,#0AH#0AH;闪烁;闪烁1010次次FLASH1FLASH1:MOVMOVP1P1,A A;点亮;点亮LCALLLCALL DELAYDELAY;延时;延时MOVMOVP1P1,#00H#00H;熄灭;熄灭LCALLLCALL DELAYDELAY;延时;延时DJNZDJNZR2R2,LFASH1LFASH1;循环;循环RETRETDELAYDELAY:为延时子程序,初值可以自己按照延时要求编制。:为延时子程序,初值可以自己按照延时要求编制。 例:延时例:延时例:延时例:延时100ms100ms100ms100msDEL: MOV R7,#200DEL: MO

45、V R7,#200DEL1: MOV R6,#247DEL1: MOV R6,#247 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2*247+2=4962*247+2=496s s DJNZ DJNZR7,DEL1 R7,DEL1 ;(246+1+1+2)*200+1=50.001ms(246+1+1+2)*200+1=50.001msRETRET7.2.5 7.2.5 查表结构程序查表结构程序 所谓查表法,即对一些复杂的函数运算,事先把其全部可能所谓查表法,即对一些复杂的函数运算,事先把其全部可能范围的答案按照一定规律变成表格存放在计算机的程

46、序存储器范围的答案按照一定规律变成表格存放在计算机的程序存储器(一般为只读存储器)中。当用户程序中需要用到这些函数时,(一般为只读存储器)中。当用户程序中需要用到这些函数时,直接按照编排好的索引值(或程序号)寻找答案。直接按照编排好的索引值(或程序号)寻找答案。 表格是一串固定常数,以表格是一串固定常数,以DBDB伪指令定义,固化在程序存贮器中。伪指令定义,固化在程序存贮器中。 ORGORG2000H2000HMOVMOVA A,R0R0ANLANLA A,#0FH#0FH;保留低;保留低4 4位位ADDADDA A,#01#01 ;变址调整;变址调整MOVCMOVCA A,A+PCA+PC;

47、查表获取;查表获取ASCIIASCII码值码值MOVMOVR0R0,A A 1 1个字节个字节TABTAB: DBDB30H30H,31H31H,32H32HDBDB33H33H,34H34H,35H35H DB DB36H36H,37H37H,38H38H DB DB39H39H,41H41H,42H42H DB DB43H43H,44H44H,45H45H,46H46H例:设计一个将例:设计一个将1616进制数转换成进制数转换成ASCIIASCII码的子程序码的子程序解解: :设设1616进制数存放在进制数存放在R0R0中的低中的低4 4位,要求将转换后的位,要求将转换后的ASCIIASC

48、II码送回码送回R0R0 已知已知0 09 9的的ASCIIASCII码为码为30H30H39H39H,A AF F的的ASCIIASCII码为码为41H41H46H46H,按照题意,程序的入口、出口都在按照题意,程序的入口、出口都在R0R0中,表中所有的值都是单字节,中,表中所有的值都是单字节,表格长度为表格长度为1616个字节。个字节。例:某智能化仪器的键盘程序中,根据命令的键值(例:某智能化仪器的键盘程序中,根据命令的键值(0 0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9)转换成相应的双字节)转换成相应的双字节1616位命令操作入口地址,位命令操作入口地址,

49、其键盘与对应入口地址关系如下:其键盘与对应入口地址关系如下:键值:键值:0 01 12 23 34 45 5入口地址入口地址0123 0123 0186018602340234031603160415041505200520键值:键值:6 67 78 89 9入口地址入口地址0626062607100710081808180929 0929 设键值存放在存放在20H20H单元中,出口地址存放在元中,出口地址存放在22H22H、23H23H单元中。元中。ORGORG2200H2200HMOVMOVDPTRDPTR,#TAB#TAB:指向表首高:指向表首高8 8位位MOVMOVA A,20H20H

50、;取;取键值RLRLA A;键值乘乘2 2作作查表偏移量表偏移量MOVMOV20H20H,A A;暂存偏移量存偏移量MOVCMOVCA A,A+DPTRA+DPTR;取高;取高8 8位地址位地址MOVMOV22H,A22H,A;暂存高存高8 8位地址位地址INCINCDPTRDPTR;指向表首低;指向表首低8 8位位MOVMOVA,20HA,20H;取偏移量;取偏移量MOVCMOVCA,A+DPTRA,A+DPTR;取低;取低8 8位地址位地址MOVMOV23H,A23H,A:暂存低存低8 8位地址位地址RETRETTAB:TAB:DBDB01,23H01,23H;“0 0”键值入口地址入口地址DBDB01,86H01,86H:“1 1”键值入口地址入口地址 DBDB08,18H08,18HDBDB09,29H09,29H;“9 9”键值入口地址入口地址

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号