80C51汇编语言程序设计

合集下载

第4章 80C51汇编语言程序设计

第4章 80C51汇编语言程序设计
构、分支结构、循环结构。三种基本结构的流程图:
(a)顺序结构
(b)分支结构
(c)循环结构
图4.1 程序的基本结构流程
4.2 汇编语言程序程序设计 4.2.1 顺序程序设计

顺序结构的程序多用来处理比较简单的问题。
特点是:程序中的语句由前向后顺序执行,最
后一条指令执行完毕,整个程序也随之结束
例4.1 将20H中存放的压缩BCD数转换成二进制数 存放在累加器A中。
;数据区首址送R0 ;各次冒泡比较次数送R7 ;互换标志位清零
;取前数送A中 ;暂存到2BH单元中 ;修改地址指针 ;取后数暂存到2AH单元中 ;清CY ;前数减后数 ;前数小于后数,则转(不互换) ;前数大于后数,两数交换
;续前 DEC R0 MOV @R0 ,2AH INC R0 SETB 00H NEXT: DJNZ R7 ,LOOP JB 00H ,START END
编程如下:
MOV ANL MOV MOV ANL ORL A ,30H A ,#0F0H 32H ,A A ,31H A ,#0FH A ,32H
MOV
32H ,A
例4.4 计算Y=X1+X2-X3 X1=38H ,X2=2AH , X3=19H
编程如下:
START: MOV ADD CLR A ,#38H A ,#2AH C
例11: 行李计价:
当G≤5,M=G×3; 当G>5,M=G×3+(G-5)×(5-3)
FRT: MOV MOV MOV MUL MOV MOV CJNE L1:JC SUBB RLC ADD MOV WETC:MOV END
A ,40H R3 ,A B ,#03H AB R2 ,A A ,R3 A ,#06H ,L1 WETC A ,#05H A A ,R2 R2 , A 41H ,A

第4章 80C51单片机汇编语言程序设计(新)

第4章 80C51单片机汇编语言程序设计(新)

DW BR1 ;BRTAB+2、BRTA+3

精选版课件ppt
25
初始化部分
循环结构
对于循环次数计数器、地址指针赋初值,对于使用到 的寄存器或者存储单元赋初值,为循环作准备。
循环体部分
为下一次循环创造条件:修改循环次数计数器、地址 指针,避免死循环。
循环的判断与控制:判断循环次数计数器,或者检查 判断循环条件。
熟悉单片机汇编程序常用的伪指令 了解汇编语言程序的格式
精选版课件ppt
2
汇编语言源程序的编辑和汇编
精选版课件ppt
3
机器编辑→交叉汇编→串行传送
*.ASM
地址 8000
8002
机器码
标号 助记符指令
7820
SORT: MOV R0,#20H
7F07
MOV
精选版课件ppt
4
编辑、汇编
编辑:
JC NEXT3
;x<5,则转NEXT3
CJNE A,#10,NEXT2 ;与10比较
JNC NEXT4
; x>10,则转NEXT4
MOV R0,#0
;5≤x ≤10,y=0
SJMP NEXT5
MOV R0,A
DEC R0
;x<5,y=x-1
SJMP NEXT5
MOV R0,A
INC R0
;x>10,y=x+1
x-1(x<5)
Y=
0(5≤x ≤ 10)
x+1(x>10)
要根据x的大小来决定y值,在判断x<5和y>10时,采用CJNE和JC 以及CJNE和JNC指令进行判断。
精选版课件ppt
19
NEXT1: NEXT2:

第5章80C51单片机汇编语言程序设计

第5章80C51单片机汇编语言程序设计
.
END
是一个标号, 其地址与前一条伪指令连续, 即1003H,
1004H地址单元中依次存放 45H, 66H。
16.05.2020
.
(4)定义字指令DW
指令格式:
[标号:] DW 16
该指令的功能与DB相似, 区别仅在于从指定地址开 始存放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据要占两个存储单元, 高8 位先存, 低 8 位后存, 这和 MCS -51指令中的16位数据存放顺序是一致的。
16.05.2020
.
流第 程三
步 : 设 计
重复该过程
16.05.2020
找出第一个学生
N
他选计算机吗?
Y N
他选了德语吗?
Y N
他选了CAD吗?
Y
记录要找的人
N
还有学生吗?
Y
下一个学生
结束
.
几点启示
• 整体构思; • 构建整体流程框图; • 结构合理,流程清晰,简单明了; • 局部模块化;
16.05.2020
16.05.2020
.
源程序
低级语言 高级语言
目标程序
汇编
机器语言
编译
机器语言
16.05.2020
.
程序设计实例引入
• 实例 假设一个班有50个人, 共有3门选修课: ➢ 计算机算法 ➢ 服装CAD设计 ➢ 德语 请找出: ➢ 同时选了三门课的同学;
16.05.2020
.
问题的解决
• 第一步
如何在计算机中表示选修某门课的所有同学
MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ END .

第4章 80C51单片机汇编语言程序设计

第4章 80C51单片机汇编语言程序设计

Chapter 4 Program Design of Assemble Language主讲教师:黄英Contents:4.1 Introduction of Assemble Language (2)4.1.1 Features (2)4.1.2 Format (2)4.2 Basic structures (2)4.2.1 Sequential program (2)4.2.2 Branching program (2)4.2.2.1 Single branching program (2)4.2.2.2. Multi-branching program (3)1.By using some CJNE instructions (3)2.By using “address table” (4)3.By using “jump instruction table” (4)4.By using stack operation (5)4.2.3 Circular Structure (5)4.3 Delay time Program (6)4.3.1 Single-cycle delay time program (6)4.3.2 Long delay time program (Multi-cycle) (6)4.3.3 Adjusting delay time range (6)4.3.4 Get different timing with basic delay program (6)4.4 Pseudoinstruction (7)4.5 How to edit and assemble the source program (7)4.1 Introduction of Assemble Language4.1.1 Features1. P roduces the optimized program.2. P rogrammer must be familiar with hardware. 3. M anage and control hardware directly . 4. N ot universal, can ’t be transplanted.4.1.2 Format (Detailed information: P77)[<Label>]: <opcode> [<operand>]; [<note>]4.2 Basic structures3 types:✧ Sequential Structure ✧ Branching Structure ✧ Circular Structure4.2.1 Sequential programFor example: 3-byte unsigned constants addition4.2.2 Branching program4.2.2.1 Single branching program·Using jump instructions :P67-68: JZ, JNZ, CJNE, DJNZ (条件转移指令) P73-74: JC, JNC, JB, JNB, JBC (位控制转移指令)Assumed that: 50H~52H cells of internal RAM have three augends respectively (beginning with high bytes ), 53H~55H cells of internal RAM have three addends respectively (beginning with high bytes ).Requirement: Design a program to put the additionresult into 50H~52H cells (beginning with high bytes ), and the carry bit into 20H bit of bit addressable area .MOV R0, #52H MOV R1, #55H ① MOV A, @R0ADD A, @R1 MOV @R0, A DEC R0 DEC R1② MOV A, @R0 ADDC A, @R1MOV @R0, ADECR0 (50H/51H/52H )= 11H/22H/33H DEC R1 (53H/54H/55H )= 77H/88H/99H ③ MOV A, @R0ADDC A, @R1 112233H MOV @R0, A + 778899H CLR AADDC A, #00H ? ④ MOV R0, #20H ?MOV @R0, A ?For example: Compare the valuesSTAR T: CLR C; clear the carry bitMOV DPTR, #ST1 ; set the data pointer MOV X A, @DPTRMOV R2, A ; put the 1stconstant into R2INC DPTR MOV X A, @DPTR ; put the 2st constant into ASUBB A, R2 ; A = A – R2= 2st - 1stJNC BIG1 ; if no carry, then the 2st constant is bigger . XCH A, R2 ; else 1st constant is bigger , and put into A BIG0: INC DPTR ; let DPTR points to the result cell. MOVX @DPTR, A ; save the bigger constant. RETBIG1: MOV X A, @DPTR ; put the 2st constant into ASJMP BIG04.2.2.2. Multi-branching program· Instruction Set has no multi-branching instruction. · 4 methods to realize multi-branching:1.By using some CJNE instructions 2.By using “address table ”3.By using “jump instruction table ” 4.By using stack operation1.By using some CJNE instructionsCJNEA, #data, rel ; put the branching number into A.For example: temperature control systemCJNE A, 55H, LOOP1 ; if T a ≠T55(upper value limit ),then j ump to LOOP1 AJMP FH ; T a =T55,j ump to main program FH (返回) LOOP1: JNC JW ; if CY ≠0,T a >T55, then j ump to JW (降温)CJNE A, 54H, LOOP2 ; if T a ≠T54(low er value limit ),then j ump to LOOP2 AJMP FH ; T a =T54,j ump to main program (FH ) LOOP2: JC SW ; if CY =1,T a <T54, then j ump to SW (升温)FH: RETAssumed that: There are three continuous cells (ST1, ST2, ST3)in the externalRAM where ST1 and ST2 have 8-bit unsigned binary constants respectively .Requirement: Design a program to find the bigger constant , and put it into ST3 cell.Assumed that: There is a temperature control system, which current temperature value (Ta ) is saved in A . The lower value limit (T54)of temperature control is saved in the internal RAM cell 54H , The upper value limit (T55)of temperature control is saved in the internal RAM cell 55H .Requirement: Design a program to control temperature under the conditions: If Ta > T55, then executes the temperature-down processing subprogram (JW ); If Ta < T54, then executes the temperature-up processing subprogram (SW ); If T55≥Ta ≥T54, then returns to the main program (FH ).2.By using “offset address table ”Step:(1)Set up a “offset address table ”(2)Using instruction: JMP @A+DPTRwhere: Offset table base address → DPTR Offset → A (offset value =BR0/BR1/BR2/BR3 - BRTAB )R3: 00, 01, 02, 03 MOV A, R3 ; put the branching number into AMOV DPTR, # BRT AB ; let DPTR point to base address of offset table MOVC A, @A+DPTR ; fetch the offset v alue.JMP @A+DPTR ; j ump to the corresponding subroutine. (A is offset value, DPTR is the address of BRT AB ); PC = A+DPTR BRT AB: DBBR0_BRTAB ; offset value of BR0 DB BR1_BRTAB ; offset value of BR1 DB BR2_BRTAB ; offset value of BR2 DBBR3_BRTAB; offset value of BR3BR0: MOV A, @R0 ; 00 ; fetch data from internal RAM to A (R0 saves low 8-bit address ) SJMP DONE ; stopBR1: MOV X A, @R0; 01; fetch data from ext ernal RA M (low er 256B )to A (R0 saves low 8-bit address ) SJMP DONE; stopBR2: MOV A, R1; 02; put high address into A < 4K = 212 = 24·28 > (R1 saves high 8-bit address ) ANL A, #0FH ; fetch low 4-bit from high address, and clear high 4-bit. ANL P2, #0F0H ; fetch high 4-bit from P2 port, and clear low 4-bit of P2 ORL P2, A ; not change high 4-bit of P2, and send low 4-bit of P2MOV X A, @R0 ; fetch data from external RAM (4KB )to A (R0 sav es low 8-bit address )SJMP DONE; stopBR3: MOV DPL, R0; 03; put low 8-bit address of ext ernal RA M to DPL MOV DPH, R1 ; put high 8-bit address of external RAM to DPHMOV X A, @DPTR; fetch data from external RAM (64KB )to A DONE : SJMP $; stop3.By using “jump instruction table ” For example:R3: 00, 01, 02, 03, … MOV A, R3 ; put the branching number into A RL A ; A = branching number × 2 MOV DPTR, # BRT AB ; let DPTR point to base address of offset table JMP @A+DPTR ; j ump to the corresponding subroutine, PC = A+DPTR BRT AB: AJMP ROUT0 ; j ump to ROUT0 AJMP ROUT1 ; j ump to ROUT1 AJMP ROUT2 ; j ump to ROUT2AJMP ROUT3 ; j ump to ROUT3 … AJMP ROUTn ; j ump to ROUTnWhy “RL A ” ?When R3 = 00, need j ump to BRT AB + 0, so A = 00, When R3 = 01, need j ump to BRT AB + 2, so A = 02, When R3 = 02, need j ump to BRT AB + 4, so A = 04, When R3 = 03, need j ump to BRT AB + 6, so A = 06.Assumed that: R3 saves branching number. BRTAB denotes the base address of jump instruction table.Requirement: Design a program to realize multi-branching. Offset table (offset value=BR0/BR1/BR2/BR3 - BRTAB )Jump instruction table4.By using stack operationSteps: (1)Put the 16-bit address into stack(2)Using RET instruction to get PC value from stack For example:·R3: 00, 01, 02, 03 MOV DPTR, # BRT AB ; let DPTR point to base address of offset table MOV A, R3 ; put the branching number into A RL A ; A = branching number × 2 MOV R1, A ; R1 = 2·R3 INC A ; A = 2·R 3 + 1 MOVC A , @A +DPTR ; fetch low 8-bit address to A PUSH ACC ; and put low 8-bit address into Stack. MOV A, R 1 MOVC A , @A +DPTR ; fetch high 8-bit address to A PUSH ACC ; and put it into Stack. RET ; set PC value from stack. Get high 8-bit address first, and then low 8-bit address . BRT AB: DW BR0 ; 16-bit address of branching subroutine 0DW BR1 ; 16-bit address of branching subroutine 1 DW BR2 ; 16-bit address of branching subroutine 2 DW BR3 ; 16-bit address of branching subroutine 3 …DW BRn ; 16-bit address of branching subroutine n4.2.3 Circular StructureMethod: Using conditional jump instructions.For example:MOV R2, #0FFH ; set the initial value of the length counter. MOV R0, #3FH ; set the initial value of the string pointer. LOOP: INC R2 ; R2 = 00H, 01H,… INC R0 ; R0 = 40H, 41H,…CJNE @R0, #0DH , LOOPRETAssumed that: R3 saves branching number .BRTAB denotes the base address of jump instruction table.Requirement: Design a program to realize multi-branching.Assumed that: There is a character string that adopts “Enter ” symbol as the ending flag. This string is saved in the internal RAM beginning with 40H cell. Requirement: Design a program to get the length of this string.16-bit address t able. Pay attention to the operation of DW!4.3 Delay time Program4.3.1 Single-cycle delay time programMOV R5, #TIME; 1LOOP: NOP ; 1 NOP ; 1 DJNZ R5, LOOP ; 2If f osc = 6MHz, then machine cycle T M :So total delay time: T max =1+(1+1+2)×2us ×TIME; TIME = 00H-FFH, 0-255, cycles 265 times=1+(1+1+2)×2us ×256 = 1+2048 = 2049us4.3.2 Long delay time program (Multi-cycle )MOVR5, #TIME1 ; 1LOOP2:MOV R4, #TIME2 ; 1 LOOP1:NOP; 1 NOP ; 1 DJNZ R4, LOOP1 ; 2 DJNZ R5, LOOP2 ; 2 RET; 2If f osc = 6MHz, then total delay time T max : T max = 1+((1+(1+1+2)×256+2)×256)+ 2 )× 2us = 1+ 525828 = 525829us4.3.3 Adjusting delay time range·by adding or deleting instructions that don ’t affect program function.MOV R0, #TIME1LOOP:ADD A, R1 ; 1 INC DPTR; 2DJNZ R0, LOOP; 2If f osc = 6MHz, then the delay time T of the cycle body is as follow :T = (1+2+2)×2us ×TIME = 10×TIME (us ) MOV R0, #TIME1LOOP: ADD A, R1 ; 1 INC DPTR ; 2 NOP; 1DJNZ R0, LOOP; 2If f osc = 6MHz, then the delay time T of the cycle body is as follow :T = (1+2+1+2)×2us ×TIME = 12×TIME (us )4.3.4 Get different timing with basic delay programMOV R0, #05H; 5s delay time LOOP1:LCALL DELA Y; 1s delay time DJNZ R0, LOOP1MOV R0, #0A H; 10s delay time LOOP2:LCALL DELA Y; 1s delay time DJNZ R0, LOOP2MOV R0, #14H; 20s delay time LOOP3:LCALL DELA Y ; 1s delay time DJNZ R0, LOOP32us126MHz1T M =⨯=4.4 Pseudoinstruction7 pseudoinstructions:ORG, END, EQU, DB, DW, DS, BIT(Read P93)Note: DB, DW, and DS are only used for program memory.4.5 How to edit and assemble the source program·hand assemble·Machine edit: get source program: *. asm·Across assembleHome Work of Chapter 4P98 (一)1、4 (二)6。

80C51汇编语言程序设计

80C51汇编语言程序设计
二、算法设计
将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度)
三、流程描述
流程图符号
开始或结束符号
判断分支符号
工作任务符号
程序连接符号
程序流向符号
程序流向符号
“超级循环”框架
开始 初始化
循环扫描、处理
4.1.2 程序编制的方法和技巧
一、强化模块观念
程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便
本章学习目标 :
了解汇编语言的特点,明确程序设计的基本思 路 熟悉汇编语言的语句结构,能正确书写汇编语 言程序 理解伪指令的功能,能正确使用80C51常用伪指 令 熟悉几种基本的程序结构 能读懂教材中的程序实例,学会编写同等难度 的应用程序
单片机应用系统由硬件系统和应用程序构成
应用程序设计方法
汇编语言 高级语言
二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 ‘A’,‘1245’ (2)符号:符号名、标号或“$”(PC的当前值) (3)表达式:由运算符和数据构成(见表4.1)Βιβλιοθήκη 四、注释英文分号“;”开头
表4.1
程序设计实例引入
❖ 实例 假设一个班有50个人, 共有3门选修课: ➢ 计算机算法 ➢ 服装CAD设计 ➢ 德语 请找出: ➢ 同时选了三门课的同学;
问题的解决
❖ 第一步 如何在计算机中表示选修某门课的所有同学
计算机算法
5
学生的学号
12
23
25
29
39
服装CAD设计
2 25 39
选修这门人数 德语 4 12 25 29 39
这个过程实际上是设计数据结构的问题

第三章 80C51单片机汇编语言程序设计(本科)

第三章 80C51单片机汇编语言程序设计(本科)

进程
判断
开始 取N1低字节 取N2低字节
判断
保存N1和N2 中字节和 取N1高字节
N1和N2 低字节相加 保存N1和N2 低字节和
取N2高字节 N1和N2 高字节相加
(9)程序清单;
ORG MOV 1000H RO, #52H;加数N1的低字节地址送地址指针R0
MOV
MOV ADD MOV DEC DEC MOV ADDC
第三章 MCS-51汇编语言程序设计
1、 单片机程序程序设计语言概述
汇编语言程序设计必须注意如下特点: (1)设计人员必须详细了解单片机的硬件结构,以便在程序设
计中熟练使用;
(2)必须熟悉汇编语言指令的功能和用法; (3)在程序设计前,必须分析设计任务,确定所用算法,确定
程序结构,确定数据的类型、数据的结构,必须对数据的存放、
MOV
DEC
@R0,
R0;
A;
保存N1、N2中间字节和
修改加数N1的地址指针内容
DEC
MOV ADDC
R1;
A, A, @R0;
修改加数N2的地址指针内容
取N1的高字节 @R1; N1、N2高字节带中间字节和进位相加
MOV
MOV END 思考题:
@R0, A;
00H, C;
保存N1、N2高字节和
高字节和的进位送00H位保存
例:设内部RAM 40H,41H单元中分别存放8位二进制数,现分别
取这两个单元中的半个字节,合并成一个新字节存放在42H单元 中。要求如下:42H单元新字节的低半字节取自40H单元的低半字 节,而高半字节取自41H单元的低半字节。 解:(1)分析任务:拆字、合字
N1
N2

第4章80C51汇编程序设计.

第4章80C51汇编程序设计.

4AH 1402H 00H 1403H 3CH
定义常值为符号名伪指令 EQU
符号名 EQU 常值表达式 LEN EQU SUM EQU BLOCK EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV 10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
4.2 基本程序结构
(无分支、无循环) 4.2.1 顺序程序
开始
【例4-1】片内RAM的21H单元
存放一个十进制数据十位的 ASCII码,22H单元存放该数 据个位的ASCII码。编写程序 将该数据转换成压缩BCD码存
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
第4章 汇编语言程序设计
教学内容: 4.1 汇编语言程序设计过程 4.2 基本程序结构 4.3 子程序及其调用 4.4 简单I/O设备的并口直接驱动示例
教学目的:
1、掌握80C51汇编语言程序设计步骤 2、掌握80C51常用伪指令的使用方法 3、熟悉几种基本的程序结构和简单I/O程序设计方法
教学重点:
利用存储器(个数多,用R0或R1及DPTR为参数表指针) 【例4-7】将内部RAM 中两个4字节无符号整数相加,和的高 字节由R0指向。数据采用大端模式存储。
入口:(R0)=加数低字节地址; 出口:(R0)=和的高字节起始地址。 (R1)=被加数低字节地址。
NADD:MOV CLR NADD1:MOV ADDC MOV DEC DEC DJNZ INC RET
放在20H单元。
ORG LJMP ORG START:MOV ANL SWAP MOV MOV ANL ORL SJMP END

第四章 80C51汇编语言程序设计

第四章 80C51汇编语言程序设计

4.2 基本结构程序设计
程序设计的基本结构有:顺序结构、分支结构和循环结构。 4.2.1 顺序结构程序 例4-2 将30H单元的2个BCD码拆开并分别存入到31H和32H 单元中。 解:方法一:先把30H中低4位BCD码交换出来,存入31H 中,再把高4位BCD码交换到低4位存入32H中。
4.2 基本结构程序设计
4.2 基本结构程序设计
ORG 0000H LJMP START ORG 0030H START:MOV R0,#30H MOV A,@R0 INC R0 CLR C SUBB A,@R0 JC BIG2 ADD A,@R0 SJMP NEXT BIG2: MOV A, @R0 NEXT: INC R0 MOV @R0,A SJMP $ END
程序1:用AJMP 和JMP 程序 KEY: MOV DPTR, #TAB; 转移表的首址 MOV A, R2 RL A JMP @A+DPTR TAB: AJMP KEY0 AJMP KEY1 AJMP KEY2 AJMP KEY3 AJMP KEY4 AJMP KEY5 AJMP KEY6 AJMP KEY7 KEY0: …… RET KEY1: …… RET ……
4.2 基本结构程序设计
例:4-10 设计一个延时50ms的程序 DEL :MOV R7, #200 DEL1:MOV R6, #123 NOP DEL2:DJNZ R6, DEL2 DJNZ R7, DEL1 RET
4.2 基本结构程序设计
4.3 子程序设计 例:4-9已知(30H)=x,(31H)=y ,(32H)=f,实现函数 f小于255 f x y
LCALL DL MOV 32H,A MOV A, 31H LCALL DL ADD A, 32H MOV 32H, A SJMP $

第4章 80C51的程序设计

第4章 80C51的程序设计

Y=0
Y=1 结束
(解一)
ORG 8000H MOV A,35H FHHS:CJNE A,#0,NEQ0 ; ≠ 0转移 MOV A, #0 SJMP OK NEQ0: CJNE A,#7FH,ISZF;≠7FH转移 ISZF: JNC LT0 ;A>7FH 负数 GT0: MOV A,#01H SJMP OK LT0: MOV A,#FFH OK: MOV 36H,A SJMP $ ;暂停
汇编语言程序设计的设计步骤
1、分析问题,导出数学表达式 2、确定算法,运算步骤和顺序 3、分配存储单元和寄存器 4、画出程序流程图,编写程序 5、上机调试
简单程序设计(无分支循环) §4-2 简单程序设计(无分支循环)
例1 两个8位无符号数存放在内部RAM的20H、21H中, 求(1)两数的和存放到22H(用寄存器间接寻址) (2)两数的差存放到23H中(用直接寻址)。 解:(1) ORG 4000H MOV R0,#20H MOV A,@R0 INC R0 ADD A,@R0 INC R0 MOV @R0,A END (2) ORG 8000H MOV R0,20H MOV A,21H CLR SUBB A,R0 MOV 23H,A END
例2 16位二进制数存于R1、R0中,将其求补后 存放到R7、R6中 解:ORG 8000H CLR C :CY清0 MOV A,R0 CPL A ADD A,1 ;低8位求补 MOV R6,A ;送低8位结果 MOV A,R1 CPL A ADDC A,#0 ;高8位求反 MOV R7,A ;送高8位结果 END
; CY←0 ; 置数据指针 ; 取第一个数 ; 第一个数暂存于R3 ; 修改指针 ; 取第二个数 ; 两数比较 ; CY=0,第二个数大 ; 第一个数大 ;再取第二个数 ; 修改指针 ; 存放大数

80C51汇编语言程序设计

80C51汇编语言程序设计

课程名称:单片机及应用第四章第四章80C51汇编语言程序设计一、基本要求1.1.了解汇编语言源程序的格式2.熟悉常用的伪指令3.掌握简单程序、分支程序、循环程序、查表程序和子程序等结构程序的设计二、知识点导学4.3 汇编语言程序举例用汇编语言进行程序设计的过程跟用高级语言进行程序设计很相似。

对于比较复杂的问题可以先根据题目的要求作出流程图,然后再根据流程图来编写程序。

对于比较简单的问题则可以不用流程图而直接编程。

当然,两者的差别还是很大的。

一个很重要的差别就在于用汇编语言编程时,对于数据的存放位置,以及工作单元的安排等都要由编程者自己安排。

而用高级语言编程时,这些问题都是由计算机安排的,编程者则不必过问。

例如MCS-51中有八个工作寄存器R0-R7,而只有R0和R1可以用于变址寻址指令。

因此,编程者就要考虑哪些变量存放在哪个寄存器,以及R0和R1这样可变址寻址的寄存器若不够用又如何处理等等。

这些问题的处理和掌握,将是编程的关键之一。

希望通过实践注意掌握。

这一节中将介绍一些汇编语言设计的实例及一些程序设计的方法。

一、简单程序简单程序是指一种无分支的直接程序,即从第一条指令开始依次执行每一条指令,直到最后一条,程序就算完毕。

这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。

例1 将一个字节内的两个BCD十进制数拆开并变成相应的ASCII码,存入两个RAM单元。

解:设两个BCD数已放在内部RAM的20H单元,变换后的ASCII码放在21H和22H单元并让高位十进制BCD数存放在21H单元。

在上一章中曾举例用SW AP指令来将两个BCD数合在一个字节内。

拆字时也可以用SW AP 指令,并且借助于半字节交换指令XCHD,就不难完成所规定的功能。

数字0~9的ASCII码为30H~39H。

完成拆字转换只需将一个字节内的两个BCD数拆开放到另两个单元的低4位,并在其高4位赋以0011即可。

第4章 80C51汇编语言程序设计

第4章 80C51汇编语言程序设计
• ② 应尽量采用循环结构和子程序 • ③ 尽量少用无条件转移指令 • ④ 在设计程序时,还要考虑程序与数据的
存放地址, • ⑤ 对于通用子程序,要考虑保护现场 • ⑥ 对于中断处理,除了保护处理程序中用
到的寄存器外,还要保护程序状态字 • ⑦ 充分利用累加器
4-2 基本结构程序设计
4.2.1 顺序结构程序 例4 1 双字节无符号数加法。被加数存放
解:延时程序的延时时间主要与两个因素有关:一 是所用晶振的频率,另一个是延时程序中的循环 次数。在晶振频率为12MHz的已知条件下, 一个机器周期为1μs,执行一条DJNZ Rn, rel的指令为2μs,则延时50ms的子程序 如下:
4-3 子程序设计
• 子程序也可以调用子程序,称为子程序嵌 套。如图4- 10所示。
解:两个单字节无符号数比较大小的方 法通常是做减法,然后根据是否产生 借位判断大小。还有一点要注意:累 加器A 在减法运算前装的是被减数, 减法运算后装的是差。思路框图如图 4 -3所示。
4.2.3 循环结构程序
循环结构程序常见的两种结构:一是先 执行后判断形式,这种结构循环处理部分 至少要执行1次,如图4- 5(a)所示; 另一种是先判断后循环形式,这种结构中 循环处理部分可以1次也不执行,如图45(b)所示。循环结构程序通常有以下 3个部分组成。
4.3.2 子程序设计时应注意的基本事项 • ① 子程序取名 • ② 现场保护与恢复 • ③ 参数的传递 • ④ 子程序应具有通用性
4.3.3 子程序设计实例
• 1. 查表子程序设计 所谓查表,就是根据某个数狓进入表格中
寻址,在很多情况下,通过 查表比通过计 算要简单得多,查表程序也较为容易编制。 在80C51指令系统中,有两条查表指 令:

第4章 80C51单片机汇编语言程序设计

第4章 80C51单片机汇编语言程序设计

形式,即顺序结构、分支结构、循环结构和子程序结构。
4.2.1 顺序程序结构 顺序程序是最简单的程序结构,在顺序程序中,既无分支, 循环,也不调用子程序,程序执行时一条一条地按顺序执行指令 例:假定三字节无符号数相加,其中一个加数在内部RAM的
50H、51H和52H单元中,另一个加数在内部RAM的53H、54H和55H
MOVX
DEC
@R1,
R0;
A;
保存N1、N2中间字节和
修改加数N1的地址指针内容
课程:单片机技术 教材:单片机基础
DEC R1; 修改加数N2的地址指针内容 MOVX A, @R1; 取N2的高字节 ADDC A, @R0; N1、N2高字节带中间字节和进位相加 MOVX @R1, A; 保存N1、N2高字节和 MOV 00H, C; 高字节和的进位送00H位保存 END 如果N2、N3的数据地址指针采用DPTR,则程序修改如下: ORG 1000H MOV RO, #52H;加数N1的低字节地址送地址指针R0 MOV DPTR, #0055H;加数N2的低字节地址送DPTR MOVX A, @DPTR; 取N2的低字节 ADD A, @R0; N1、N2低字节相加 MOVX @DPTR, A; 保存N1、N2低字节和 DEC R0; 修改加数N1的地址指针内容
课程:单片机技术 教材:单片机基础
课程:单片机技术 教材:单片机基础
4.2.2
分支程序结构
(1)单分支程序
单分支程序是通过条件转移指令实现的,即根据条件对程序
的执行进行判断,满足条件则进行程序转移,不满足条件程序就 顺序执行。 在MCS-51指令系统中,可利用JZ,JNZ,CJNE,DJNZ,JC, JNC,JB,JNB,JBC等指令,完成为0、为1、为正、为负以及相

第5章80C51单片机汇编语言程序的设计

第5章80C51单片机汇编语言程序的设计

LP0: MOV DPTR, #TAB ;
MOV A, R0 ADD A, R0
; R0内容乘以2
JNC LP1
;
INC DPH
;
LP1: JMP A+DPTR;

TAB: AJMP PR0
AJMP PR1

2019/10/11
AJMP PRN
第5章 汇编语言程序设计简介
• 练习
把内部RAM起始地址为data的数据串传送 到外部RAM以LOOP为首地址的区域,直到发 现“$”字符的ASCⅡ码为止,同时规定数据 串的最大长度为32个字节。
2019/10/11
第5章 汇编语言程序设计简介
BIT 位地址符号命令
• 格式:字符名 BIT 位地址 • 功能:把BIT后的位地址值赋给字符名。其中字符名不
是标号,其后没有冒号,但字符名是必须的。 例如:A1 BIT P1.0
A2 BIT 02H • 汇编后,P1口第0位的位地址90H就赋给了A1,而A2
2019/10/11
第5章 汇编语言程序设计简介
程序如下:
START: CLR C
; 将Cy
MOV R0, #41H ; 将被加数地址送数据指针R0
MOV R1, #51H ; 将加数地址送数据指针R1
AD1: MOV A, R0 ; 被加数低字节的内容送入A
ADD A,R1
;
MOV R0, A
;
2019/10/11
第5章 汇编语言程序设计简介
例 5 根据工作寄存器R0 内容的不同, 使程序转入相应 的分支。
(R0)=0 对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为PR1;

第四章80C51的程序设计

第四章80C51的程序设计

LOOP:
ADD
NOP
A,R2
;(A)+(R2)→A
;R1的内容减1不为0,则循环 (也可为SJMP $)
DJNZ R1,LOOP HERE: SJMP HERE
4.1.3 常用伪指令
伪指令作用--在汇编语言源程序中,用于向汇编程序发出指示 信息,引导汇编程序如何完成汇编工作(也称为汇编程序控制命 令)。
用于终止源程序的汇编工作(整个源程序中只能有一条END, 位于程序的最后)
3、定义字节命令DB
用于从指定的地址开始,在程序存储器的连续单元中定义字 节数据。
例如: ORG 2000H DB 30H,40H,24,“C”
汇编后: (2000H)=30H
(2001H)=40H (2002H)=18H
(2003H)=43H
2009H
25H F0
02H 20H 00H
4.3 汇编语言实用程序设计
4.3.1 汇编语言程序的基本结构形式
单片机程序设计方法-- 结构化方法 常采用的程序结构– 顺序结构, 分支结构,循环结构,子程序和 中断服务子程序。
顺序结构—程序逐条执行,由上至下。
分支结构—程序中含转移指令(有条件或无条件)。 循环结构—程序中含有可以反复执行的程序段(循环体)。 子程序—设计时,将需多次应用的、完成相同的某种基本运算操 作的程序段单独编为一个程序段,需要时通过指令调用,这样的程 序段为子程序。返回指令RET。 中断服务子程序—响应中断源请求的独立子程序段,返回用RETI。
源程序
低级语言 汇编
目标程序
机器语言
高级语言
编译
机器语言
4.1.2 汇编语言语句的种类和格式
语句的种类: 语句的格式:

第4章 80C51汇编程序设计

第4章 80C51汇编程序设计

ORG LJMP ORG START:MOV ANL SWAP MOV MOV ANL ORL SJMP END
0000H START 0040H A,21H A,#0FH A 20H,A A,22H A,#0FH 20H,A $
;取十位ASCII码 ;取十位ASCII码 取十位ASCII ;保留低半字节 ;保留低半字节 ;移至高半字节 ;移至高半字节 ;存于20H单元 存于20H ;存于20H单元 ;取个位ASCII码 取个位ASCII ;取个位ASCII码 ;保留低半字节 ;保留低半字节 ;合并到结果单元 ;合并到结果单元
;置初值 ;置初值 ; ; ;循环处理 ;循环处理 ; ;循环修改 循环修改, ;循环修改,判结束 ;结束处理 ;结束处理
【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中 将内部RAM起始地址为60H的数据串传送到外部RAM中 RAM起始地址为60H的数据串传送到外部RAM 起始地址为1000H的存储区域,直到发现‘ 字符停止传送 1000H的存储区域 字符停止传送。 起始地址为1000H的存储区域,直到发现‘$ ’字符停止传送。
汇编语言,生成的目标程序占内存空间少、运行速 度快,具有效率高、实时性强。 高级语言,对系统的功能描述与实现简单, 高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。 修改和移植方便,适合于编写复杂的程序。
流程描述
流程图符号 “超级循环”框 架
4.1.2 程序编制的方法和技巧 强化模块观念
4.1.3.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
起始地址设定伪指令ORG
ORG 表达式 ORG 8000H START:MOV A,#30H … ORG可多次使用,但地址值的顺序要由小到大…
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称:单片机及应用第四章第四章80C51汇编语言程序设计一、基本要求1.1.了解汇编语言源程序的格式2.熟悉常用的伪指令3.掌握简单程序、分支程序、循环程序、查表程序和子程序等结构程序的设计二、知识点导学4.3 汇编语言程序举例用汇编语言进行程序设计的过程跟用高级语言进行程序设计很相似。

对于比较复杂的问题可以先根据题目的要求作出流程图,然后再根据流程图来编写程序。

对于比较简单的问题则可以不用流程图而直接编程。

当然,两者的差别还是很大的。

一个很重要的差别就在于用汇编语言编程时,对于数据的存放位置,以及工作单元的安排等都要由编程者自己安排。

而用高级语言编程时,这些问题都是由计算机安排的,编程者则不必过问。

例如MCS-51中有八个工作寄存器R0-R7,而只有R0和R1可以用于变址寻址指令。

因此,编程者就要考虑哪些变量存放在哪个寄存器,以及R0和R1这样可变址寻址的寄存器若不够用又如何处理等等。

这些问题的处理和掌握,将是编程的关键之一。

希望通过实践注意掌握。

这一节中将介绍一些汇编语言设计的实例及一些程序设计的方法。

一、简单程序简单程序是指一种无分支的直接程序,即从第一条指令开始依次执行每一条指令,直到最后一条,程序就算完毕。

这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。

例1 将一个字节内的两个BCD十进制数拆开并变成相应的ASCII码,存入两个RAM单元。

解:设两个BCD数已放在内部RAM的20H单元,变换后的ASCII码放在21H和22H单元并让高位十进制BCD数存放在21H单元。

在上一章中曾举例用SW AP指令来将两个BCD数合在一个字节内。

拆字时也可以用SW AP 指令,并且借助于半字节交换指令XCHD,就不难完成所规定的功能。

数字0~9的ASCII码为30H~39H。

完成拆字转换只需将一个字节内的两个BCD数拆开放到另两个单元的低4位,并在其高4位赋以0011即可。

为此,可以先用XCHD指令将个位的BCD数和22H单元的低4位交换,在22H单元高4位添上0011完成一次转换。

再用SW AP 指令将高4位与低4位交换,并将高4位变为0011,完成第二次转换。

为了减少重复操作和使程序精炼,应先使22H单元清零。

工作寄存器选用R0,这样可便于使用变址寻址指令。

MOV R0,#22H ;R0←22HMOV @R0,#00H ;22H清零MOV A,20H ;两个BCD数送AXCHD A,@R0 ;低位BCD数送至22H单元ORL 22H,#30H ;完成低位转换SW AP A;高位BCD放至低4位ORL A,#30H ;完成高位转换MOV 21H,A;存数RET这种转换也可借用除法指令一次完成。

将一个两位BCD数除以10000B(42),就相当于右移4位而得到商,即在A中留下高位BCD,而余数即低位BCD则进入B寄存器,从而完成拆字,然后再在高位添上0011,就可完成转换。

读者可以自己完成上述程序。

例2 将20H单元中8位无符号二进制数转换成三位BCD码,并存放在FIRST(百位)和SECON(十位、个位)两个单元中。

解:对于没有除法指令的系统,完成这样的转换并不太容易,必须通过连续相减来完成。

这时要先将原数与100相减,够减的次数就是转换后的百位数,然后再与10相减,等等。

而在MCS—51中有除法指令,转换就方便了:先将原数除以100,得百位数;余数再除以10得十位数;最后的余数就是个位数。

并分别设法存入指定的单元即可。

FIRST DA TA30HSECON DA TA31HORG 1000H ;开始MOV A,20H ;取数MOV B,#64H ;除数为100DIV AB ;确定百位数MOV FIRST,A;百位数送FIRSTMOV A,B ;余数送AMOV B,#0AH ;除数为10DIV AB ;确定十位数SW AP A;十位数移至高4 位ORL A,B ;并入个位数MOV SECON,A;十位,个位存SECONRETEND另外一种除法则是连续除以10:先除以10余数为个位数,再将余数除以10可得百位数(商)和十位数(余数)。

例3 16位二进制数求补程序。

设16位二进制数存放在R1R0,求补以后的结果则存放于R3R2。

解:二进制数的求补可归结为“求反加1”的过程。

求反是容易做到的,因为有CPL指令。

加1则略有问题,因为是16位的加1操作,因此要考虑进位问题。

即不仅最低位要加1,高8位也要加上低位的进位。

还要注意这里的加1不能用INC指令,因为在MCS-51中,这个指令不影响标志。

MOV A ,R0 ;低8位送ACPL A ;取反ADD A ,#1 ;加1 MOV R2,A ;送回MOV A ,R1 ;高8位送AXRL A ,#7FH ;符号位不变,其余位取反ADDC A ,#0 ;加进位MOV R3,A ;结果送回RET以上程序的编写并不困难,但在次序的安排上要有一些考虑:由于MCS-51中取反指令并不影响标志y C ,因此可以低位取反后立即加1,然后再高位取反加进位。

若是CPL 指令影响标志,则应先16位取反,然后再加1和加进位,所需的数据往复传送数要增多。

读者可以按这种方法写出程序并进行比较。

二、分支程序分支程序就是条件分支程序,即根据不同的条件,执行不同的程序段。

在编写分支程序时,关键是如何判断分支的条件。

在MCS-51中直接用来判断分支条件的指令不是很多,只有累加器判零指令JZ 、JNZ ,比较转移指令CJNE 等,但它还提供了位条件转移指令如JC 、JB 等。

把这些指令结合在一起使用,就可以完成各种各样的条件判断,如正负判断、溢出判断、大小判断等。

例4 设变量X 存放于V AR 单元,函数值Y 存放在FUNC 单元。

试按照下式的要求给Y 赋值。

⎪⎩⎪⎨⎧<-=>=010001X X X Y解:X 是有符号数,因此可以根据它的符号位来决定其正负,判别符号位是0还是1则可利用JB 或JNB 指令。

而判别X 是否等于0则可以直接使用累加器判零指令。

把这两种指令结合使用就可以完成本题的要求。

V AR DA TA 30HFUNC DA TA 31HMOV A , V AR ;取出XJZ COMP ;X=0则转移到COMPJNB ACC.7, POSI ;X>0则转移到POSIMOV A , #0FFH ;X<0则Y=-1SJMP COMPPOSI: MOV A , #1 ;X>0则Y=1COMP: MOV FUNC , A ; 存函数值RET(a)(b)图3.1 流程图这个程序是按照图3.1(a)的流程图编写的。

其特征是先比较判断,然后按比较结果赋值。

这实际是个三分支而归一的流程图,因此,至少要用两个转移指令。

对于初学者很容易犯的一个错误是漏掉了其中的SJMP COMP 语句,因为流程图中没有明显的转移迹象。

但这种理解是错误的,必须注意克服。

这个程序还可以按照图3.1(b)的流程图来编写。

其特征是先赋值,后比较判断,然后修改赋值并结束。

即预先认为V AR<0,先让FUNC=-1。

若比较以后证明V AR确实小于零,则赋值不变,否则就改为+1。

这样就是一个两分支归一的流程,可以少用一次转移指令。

但这时要借用一个寄存器(如R0)来存放结果,因为A不能同时又放X的值,又放中间结果。

MOV A,V AR ;取X到AJZ COMP ;X=0则转移MOV R0,#0FFH ;先设X<0,R0=FFHJB ACC.7,NEG ;若X<0则转移MOV R0,#1 ;X>0,R0=1NEG:MOV A,R0COMP:MOV FUNC,A;存结果到FUNCRETEND例5 两个带符号数分别存于ONE和TWO单元,试比较它们的大小,将较大者存入MAX 单元中。

两数相等则任存入一个即可。

解:两个带符号数的比较可将两数相减后的正负和溢出标志结合在一起判断,即:若X-Y为正,则OV=0,X>YOV=1,X<Y若X-Y为负,则OV=0,X<YOV=1,X>Y两个正数相减或者两个负数相减都不会溢出(OV=0),若差为正则X>Y;若差为负则X<Y。

正数肯定大于负数,它们的差若为正,是正常运算,无溢出(OV=0);若差为负,则不正常,一定溢出(OV=1)。

负数肯定小于正数,它们的差若为负,是正常运算,无溢出(OV=0);若差为正,则不正常,一定溢出(OV=1)。

由此可以得到程序的流程图3.2。

CLR CMOV A,ONE ;取X到ASUBB A,TWO ;X-YJZ XMAX ;X=YJB ACC.7,NEG ;X-Y为负转NEGJB OV,YMAX ;X-Y>0,OV=1,Y>X图3.2 例5的流程图SJMP XMAX ;X-Y>0,OV=0,X>YNEG: JB OV,XMAX ;X-Y<0,OV=1,X>YYMAX: MOV A,TWO ;Y>XSJMP RMAXXMAX: MOV A,ONE ;X>YRMAX: MOV MAX,A;送较大值至MAXRETONE DA TA30HTWO DA TA31HMAX DA TA32HEND例6 128分支程序。

根据R3的值(00H-7FH),分支到128个不同的分支入口。

解:多分支程序根据分支数目的不同,可由不同的设计方法。

若分支的入口在2kB范围内分布,可使用AJMP指令,参考程序如下:MOV A,R3RL A;A←A 2MOV DPTR,#BRTABJMP @A+DPTRBRTAB: AJMP ROUT00AJMP ROUT01:AJMP ROUT127END可以看出,从BRTAB开始存放着一系列AJMP指令。

程序的工作是两次转移的方式:先根据R3的值,用JMP指令转移到从BRTAB开始的某一条AJMP指令,然后再用这条AJMP 指令转移到相应的分支入口ROUTnn。

当然,各个分支入口地址ROUTnn要通过伪指令或其它方式来定义。

由于AJMP是双字节指令,因此提前使偏移量A乘以2,以便转向正确的位置。

每个分支的入口地址(ROUT00- ROUT127)必须和其相应的AJMP指令在同一个2k存贮区内。

也就是说,分支入口地址的安排仍有相当的限制。

如改用长转移LJMP指令,则分支入口就可以在64kB的范围内任意安排,但程序要作相应的修改。

请读者自行设计。

三、循环程序循环程序也是一种程序的组织形式。

在程序执行时,往往同样的一组操作需要重复许多次,当然可以重复使用同样的指令来完成,但若使用循环程序,重复执行同一条指令许多次来完成重复操作,就大大简化了程序。

例如要做1到100的加法,没有必要去写100条加法指令,而可以只写一条加法指令并使之执行100次,每次执行时操作数也作相应的变化,同样能完成原来规定的操作。

相关文档
最新文档