190 likes | 420 Views
第 4 章 MCS - 51 程序设计. 4.1 汇编语言的格式伪指令 4.2 伪指令 4.3 查表程序设计 4.4 循环程序设计 4.5 分支程序设计 4.6 散转程序设计 4.7 数制转换程序设计. 4.1 汇编语言的格式. ORG 0000H ; 整个程序起始地址 AJMP MAIN ; 跳向主程序 ORG 0030H ; 主程序起始地址
E N D
第4章 MCS-51程序设计 4.1 汇编语言的格式伪指令 4.2 伪指令 4.3 查表程序设计 4.4 循环程序设计 4.5 分支程序设计 4.6 散转程序设计 4.7 数制转换程序设计
4.1 汇编语言的格式 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 ; 结束标记
汇编语言格式: 地址 机器码 源程序 注释 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.2 伪操作指令 1. ORG(Origin) 定义程序的起始地址 2. END程序结束标志 3. DB(Define Byte) 定义字节 4. DW(Define Word)定义字 5. EQU(Equate) 表达式赋值
伪操作指令例子 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
开始 Y ? N 1 汇编语言程序设计步骤 1.确定方案和计算方法 2.了解应用系统的硬件配置、性能指标。 3.建立系统数学模型,确定控制算法和操作步骤。 4.画程序流程图, 确定程序的流向 5.编制源程序 1)合理分配存储器单元和了解I/O接口地址。 2)按功能设计程序,明确各程序之间的相互关系。 3)用注释行说明程序,便于阅读和修改调试和修改。
4.3 查表程序设计 1. 用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
2. 用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
4.4 循环程序设计 1. 延时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
2. 计算几个数据的和 例题:对内部RAM 50h开始的10个无符号数求和。
源程序: 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
解释: 高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
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 … …
例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
从内部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:
例:行李计价: 当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 指出本程序的条件限制
根据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, 程序还要作相应修改。
例: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 数制转换程序设计