1 / 19

第 4 章 MCS - 51 程序设计

第 4 章 MCS - 51 程序设计. 4.1 汇编语言的格式与伪指令 4.2 汇编语言程序设计步骤 4.3 查表程序设计 4.4 循环程序设计 4.5 分支程序设计 4.6 散转程序设计 4.7 数制转换程序设计. 4.1 汇编语言的格式与伪指令. 一 . 指令的格式 LOOP: MOV A, R0 ; 将 R0 的内容送 A [ 标号 ] 操作码 第一操作数 第二操作数 [ 注释 ]

gratia
Télécharger la présentation

第 4 章 MCS - 51 程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第4章MCS-51程序设计 4.1 汇编语言的格式与伪指令 4.2 汇编语言程序设计步骤 4.3 查表程序设计 4.4 循环程序设计 4.5 分支程序设计 4.6 散转程序设计 4.7 数制转换程序设计

  2. 4.1汇编语言的格式与伪指令 一.指令的格式 LOOP: MOV A, R0 ;将R0的内容送A [标号]操作码 第一操作数 第二操作数 [注释] (目的操作数) (源操作数) 注:白色的内容不是必须的

  3. 二、汇编语言格式: 地址 机器码 源程序 注释 ORG 0000H; 整个程序起始地址 0000 20 00 30 LJMP MAIN ; 跳向主程序 ORG 0030H; 主程序起始地址 0030 C3 MAIN: CLR C ; MAIN为程序标号 0031 E6 LOOP: MOV A , @R0 0032 37 ADDC A, @R1 0033 08 INC R0 0034 DA FB DJNZ R1, LOOP ;相对转移 0036 80 03 SJMP NEXT 0038 78 03 MOV R0, #03H 003A 18 NEXT: DEC R0 003B 80FE SJMP $ ;HERE: SJMP HERE END ; 结束标记

  4. 三.伪操作指令 1、 ORG(Origin) 定义程序的起始地址 2、 END程序结束标志 3、 DB(Define Byte) 定义字节 4、 DW(Define Word)定义字 5、 EQU(Equate) 表达式赋值

  5. 四、伪操作指令例子 MATH EQU 03H ORG 0000H MAIN: CLR C LOOP: MOV A , @R0 MOV R1, #MATH ;相当于 MOV R1, #03H NEXT: SJMP $ ORG 1100H DB 01H , 04H, 09H , 05H ; END • ROM中 • 地址 数据 1100 01 1101 04 1102 09 1103 05

  6. 开始 Y ? N 1 4.2汇编语言程序设计步骤 1.确定方案和计算方法 2.了解应用系统的硬件配置、性能指 标。 3.建立系统数学模型,确定控制算法 和操作步骤。 4.画程序流程图, 确定程序的流向 5. 编制源程序 (1)合理分配存储器单元和了解I/O接 口地址。 (2)按功能设计程序,明确各程序之 间的相互关系。 (3)用注释行说明程序,便于阅读和 修改调试和修改。

  7. 举例 ORG 0000H ; 整个程序起始地址 AJMP MAIN ; 跳向主程序 ORG 0030H ; 主程序起始地址 MAIN: CLR C ; MAIN为程序标号 LOOP: MOV A , @R0 ADDC A, @R1 INC R0 DJNZ R1, LOOP ;相对转移 SJMP NEXT MOV R1, #03H NEXT: DEC R0 SJMP $ ;相当于 LOOP1: SJMP LOOP1 END ; 结束标记

  8. 4.3查表程序设计 一.用DPTR查表(查0~9平方表) 1000 C083 TA: PUSH DPH 1002 C082 PUSH DPL 1004 902000 MOV DPTR, #TAB 1007 93 MOVC A, @A+DPTR 1008 D082 POP DPL 100A D083 POP DPH 100C 22 RET ORG 2000H TAB: DB 00H, 01H, 04H, 09H 2000 00 2001 01 2002 04 2003 09

  9. 二.用PC查表(查0~9平方表) ORG 1000H 1000 C083 TA: ADD A, #01H; # 01H 为偏移量 1002 83 MOVC A, @A+PC 1003 22 RET 1004 00 DB 00H, 01H, 04H, 09H 1005 01 END 1006 04 1007 09 偏移量=表首地址-(查表指令下一条指令地址) =1004H - 1003H =01H

  10. 4.4循环程序设计 一.延时50ms程序 DEL: MOV R7, #200 DEL1: MOV R6, #125 DEL2: DJNZ R6, DEL2 ;125*2=250us DJNZ R7, DEL1 ; 0.25ms*200=50ms RET 使用12MHz晶振时,一个机器周期为1us, 执行 DJNZ指令为2us,加其他指令的时间(250+1+2) *200+1=50.301ms 精确计算见 P327

  11. 二.计算几个数据的和 例题:对内部RAM 50h开始的10个无符号数求和。

  12. 源程序: ADD1: MOV R7, #10 ;循环次数n=10 MOV R3, #0 ;存放结果的高8位 MOV R4, #0 ;存放结果的低8位 MOV R0, #50H ;求和的数据存放在从内部RAM 50h开始的 ;单元中,。注意:(50h)=?不知道 LOOP: MOV A, R4 ; ADD A, @R0 ;(R4)+(5?H)→A MOV R4, A ; 结果送回R4 CLR A ; ADDC A, R3 ; 把进位位C加到高8位去 MOV R3, A INC R0 ; 为下一轮循环作准备 DJNZ R7, LOOP END

  13. 解释: 高8位 低8位 (R3) (R4) + (50h) C (A) MOV A, R4 ADD A, @R0 MOV R4, A CLR A ADDC A, R3 MOV R3, A (50h)中是什么,不知道, 不能用ADD A,#50H

  14. CJNE A,#data,rel;(A)=#data,继续 Cy←0 (A)>#data, 转 Cy←0 (A)<#data, 转 Cy←1 特点:只有<时,Cy←1 4.5 分支程序设计 • CJNE A, #14H, LOOP • LOOP: JC NEXT … … 一、基本分支程序: 1、若(A)< 14H, 转NEXT,否则继续执行 2、若(A)≤ 14H, 转NEXT, 否则继续执行 3、若(A)≥ 14H, 转NEXT, 否则继续执行 4、若(A)> 14H, 转NEXT, 否则继续执行 (A)≤ 14H 相当于(A) < 15H • CJNE A, #15H, LOOP • LOOP: JC NEXT … … • CJNE A, #14H, LOOP • LOOP: JNC NEXT … … (A)> 14H 相当于(A) ≥ 15H • CJNE A, #15H, LOOP • LOOP: JNC NEXT … …

  15. 例1:按下面公式编写程序, x为无符号数,存在20h单元 y存放在21h单元。 ORG 0030H MOV A, 20H CJNE A, #21H, LOOP1 LOOP1: JC NEXT1 CJNE A, #40H, LOOP2 LOOP2: JNC NEXT2 MOV B, #2 MUL AB AJMP NEXT2 NEXT1: CPL A NEXT2: MOV 21H, A END 最终结果存在 21h中 二、分支程序例1

  16. 从内部RAM 22h单元开始存有一个无符号数数据块, 长度n存于21h中。求出数据块中的最小数,存于20h中。 ORG 0030H MOV R0, #22H ;数据块起始地址 MOV R1, 21H ;数据个数n MOV 20H,#0FFH ; 最大数 LOOP: MOV A, @R0 ; 取新数 INC R0 ; 为取下一个新数作准备 CJNE A, 20H, LOOP1 ; 与原最大数比较 LOOP1:JNC NEXT ; 大,原最小数保留 MOV 20H, A ; 小,改变最小数 NEXT: DJNZ R1, LOOP ;循环 END 初始化 取新数 y N N y y <x n-1=0? y END y → x 三、分支程序例2:

  17. 例:行李计价: 当G≤5,M=G×3; 当G>5,M=G×3+(G-5)×(5-3) FRT: MOV A,40H ;取行李重量G放在40H MOV R3,A MOV B,#03H ;M=G×3 MUL AB MOV R2,A ;暂存3 × G在R2 MOV A,R3 ;取回G CJNE A,#06H,L1 ;G≤5 ? L1: JC WETC ;是,转至WETC SUBB A,#05H ;否则M=3G+2(G-5) RLC A ADD A,R2 WETC:MOV 41H,A ;最后结果M存41H end 指出本程序的条件限制

  18. 根据R7中的内容,转向各个子程序。 R7=0,转入Prog0 R7=1,转入Prog1 R7=2,转入Prog2 …… R7=n,转入Progn ORG 0030H JUMP1: MOV DPTR, #TAB CLR A MOV A, R7 ADD A, R7 AJMP @A+DPTR ORG 0100H TAB: AJMP Prog0 AJMP Prog1 AJMP Prog2 …… R7= ? n 1 0 处理 n 处理 1 处理 0 4.6散转程序设计 *AJMP … 即把PC指向子程序的起始地址; *R7 x 2 是AJMP @A+DPTR的机器码匹配;此处 n<127; *如用LJMP @A+DPTR,则R7 x 3, 程序还要作相应修改。

  19. 例:8位二进制转换成BCD码。(用十进制表达的二进制码)例:8位二进制转换成BCD码。(用十进制表达的二进制码) ;程序名:BINBCD1 ;功能: 0~FFH内的二进制数转换为BCD数 ;入口: A存要转换的二进制数 ;出口: R0 存放BCD数 百、十、个位数的地址 BINBCD1: MOV B, #100 DIV AB MOV @R0, A INC R0 MOV A, #10 XCH A, B ;(A)=原(B),(B)=10 DIV AB MOV @R0, A INC R0 XCH AB MOV @R0, A RET 4.7数制转换程序设计

More Related