第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。
第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汇编语言程序设计
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的汇编与C语言程序设计资料
由于指向对象的存储空间在编译时无法确定(运行时确 定),因此必须生成一般代码以保证对任意空间的对象进 行存取。所以一般指针所产生的代码速度较慢。
2018/10/25
28
天津理工大学聋人工学院
4.4.2
基于存储器的指针
定义时就指定它所指向的对象的存储器类型
指针占1个字节(idata *,data *,pdata *)或2个 字节(code *,xdata *) 基于存储器指针定义示例: char data *str; int /* 指针指向的char型数据存于data 空间 */ xdata *num; /* 指针指向的int型数据存于xdata 空间 */ 基于存储器的指针长度比一般指针短,可以节省存储 器空间,运行速度快,但它所指对象具有确定的存储器 空间,兼容性不好。
特殊功能寄存器的声明
格式:
sfr 特殊功能寄存器名 = 地址常数;
例如: sfr SCON = 0x90; sfr P0 = 0x80;
2018/10/25
11
天津理工大学聋人工学院
特殊功能寄存器中特定位的声明
sbit 位变量名=特殊功能寄存器名^位的位置(0~7) 例如: sfr PSW=0xD0; sbit OV=PSW^2;
2018/10/25 22 天津理工大学聋人工学院
4.3.2
C51循环语句
while语句
一般形式为: while(条件表达式)语句;
如果条件表达式的结果一开始就为假,则后面的语句一 次也不能执行。
do-while语句
一般形式为: do语句 while(条件表达式);
任何条件下,循环体语句至少会被执行一次。
C51程序开发过程
编写源程序 建立工程,加入源程序 编译生产目标程序 仿真调试、写存储器
第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,第二个数大 ; 第一个数大 ;再取第二个数 ; 修改指针 ; 存放大数
第4章 80C51单片机汇编语言程序设计
按照语法格式 编写源程序 *.ASM *.C 按照语法格式 将源程序翻译 成机器代码 计算机识别的 二进制代码 *.OBJ
高级语言如 C++
汇编语言如 MCS-51指令
编译
目标文件
汇编
目标文件
1
本章结构
4.1 单片机程序设计语言概述 4.4 汇编语言编辑和汇编及其伪指令 4.2 汇编语言程序的基本结构形式
顺序程序结构 分支程序结构 循环程序结构
4.3 汇编语言程序设计举例
2
4.1
概述
4.1.1、 程序设计语言及语言处理程序
程序设计语言分:机器语言、汇编语言和中高级语言 1.机器语言: •硬件识别,二进制,无需翻译、直接执行,面向机器; •速度快,效率高,难以辨认和记忆,易错,难修改。 地址 2000H 2002H 机器码 78 30 E6 源程序 ORG 2000H MAIN: MOV R0,#30H MOV A,@R0
22
2.1 使用多条CJNE指令
假定分支序号值保存在累加器A中,则可使用
CJNE A, #data, rel
(A)=0?
转向0分支
(A)=1?
转向1分支
(A)=2?
转向2分支
23
例4.3某温度控制系统,采集的温度值(Ta)放在累加器A中。此外,在内部 RAM54H单元存放控制温度下限制(T54),在55H单元存放控制温度上限 制(T55)。若Ta >T55,程序转向JW(降温处理程序);若Ta<T54,则 程序转向SW(升温处理程序);T55≥Ta≥T54,则程序转向FH(返回主程 序)。 程序如下: CJNE A,55H,LOOP1 ;Ta ≠T55,转向LOOP1 AJMP FH ;Ta=T55,返回 LOOP1:JNC JW ;若C=0,表明Ta>T55,转降温程序 CJNE A,54H,LOOP2 ;Ta ≠T54,转向LOOP2 AJMP FH ; Ta=T54,返回 LOOP2:JC SW ;若C=1,表明Ta<T54,转升温程序 FH: RET
单片机及应用_第四章_80C51单片机汇编语言程序设计
80C51单片机汇编语言程序设计
主要内容: 4.1 单片机程序设计语言概述 4.2 汇编语言程序的基本结构形式 4.3 80C51 单片机汇编语言程序设计举例 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51 单片机汇编语言伪指令
4.1 单片机程序设计语言概述
4.1.1 机器语言和汇编语言 1、机器语言:直接用二进制代码指令表达的计算 机语言。计算机可以直接识别,不需要进行任 何翻译。每台机器的指令,其格式和代码所代 表的含义都是硬性规定的 。机器语言是其它各 种程序设计语言的基础,但难记、难用、已出 错。
符(ASCII码0DH)比较的方法。同时在程序中还应设置一个
字符串指针以顺序定位字符,设置一个字符长度计数器以累 计字符个数。
4.2.3 循环程序结构
MOV R2, #0FFH ;设置长度计数器初值 MOV R0, #3FH ;设置字符串指针初值 LOOP: INC R2 INC R0 CJNE @R0, #0DH, LOOP
4.1.1 机器语言和汇编语言
2、汇编语言:用助记符和专门的语言规则表示指令的功 能和特征的面向机器的程序设计语言。汇编语言是对 机器语言的改进,比机器语言高级。汇编语言的最大 优点是助记符与机器指令一一对应。用汇编语言编写 的程序占用存储空间小,运行速度快,程序效率高。 此外,汇编语言能直接管理和控制硬件资源。
4.2 汇编语言程序的基本结构形式
四种基本结构形式:顺序程序结构、分支程 序结构、循环程序结构、子程序。
4.2.1 顺序程序结构 顺序结构程序是最简单的程序结构。程序既 无分支、循环,也不调用子程序,程序执行 时一条接一条地按顺序执行指令。
4.2.1 顺序程序结构
例1 3字节无符号数的加法运算。其中被加数在 内部RAM的50H、51H和52H单元中;加数 在内部RAM的53H、54H和55H单元中;要 求把相加之和存放在50H、51H和52H单元中, 进位存放在位寻址区的20H位中。
第4章 80C51单片机汇编语言程序设计(新)
(1003H)=78H,
(100AH)=-2=0FEH
(1004H)=35H(5的ASCII码),
7
定义数据字命令 DW (Define Word)
在程序存储器中定义16位的数据字。
存放时,数据字的高8位在低地址,低8位在后
高地址。
DW
通常,DB用来定义<数Y1据,Y,2,D…W,Y用n>来定义地址。
机器编辑→交叉汇编→串行传送
*.ASM
地址 8000
8002
机器码 7820
7F07
标号 助记符指令
SORT: MOV R0,#20H
MOV 3
编辑、汇编
编辑:
编写程序的过程称为编辑。 机器编辑指借助于微型机进行单片机的程序设计,通常都是使用编
辑软件进行源程序的编辑。 编辑完成后,生成一个由汇编指令和伪指令构成的扩展名
一般用汇编语言编写的程序需要 预留存放数据的空间用伪指令定义好
然后编写程序代码 最后用原地踏步或返回起始位置循环作为结束。
【例】程序格式如下:
ORG … … SJMP $ END
14
汇编语言程序的基本结构形式
分支结构
使用条件转移指令对程序的执行结果进行判断
教学内容及要求
教学内容
汇编语言程序的基本结构形式、子程序结构形式 80C51单片机汇编语言伪指令 80C51单片机汇编语言程序设计举例
教学要求
掌握顺序结构程序、分支程序、循环程序和子程序等 结构程序的设计等
熟悉单片机汇编程序常用的伪指令 了解汇编语言程序的格式
汇编语言源程序的编辑和汇编
[<标号:>] DS <16位数表>
【例】ADDRTAB:DS 20 ;从标号ADDRTAB代表的地址开始,预留20个 ;连续的地址单元。
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-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单片微机的程序设计
7
② 汇编语言语句的格式 指令语句的格式为:
【标号】:助记符(操作码)【操作数(参数)】;[注释]
伪指令语句的格式:
名字 定义符 参数 ;注释
8
标号域:
说明指令的地址。标号可以作为LJMP、AJMP、LCALL及 ACALL等指令的操作数。 • 在指令语句中,标号位于一个语句的开头位置,由字母和数符 组成,字母打头,冒号“:”结束。 • 标号中的字符个数一般不超过8个,若超过8个,则以前面的8 个为有效,后面字符不起作用。 • 不能使用本汇编语言中已经定义了的符号作标号,比如指令助 记符(如ADD) 、伪指令 (如END) • 一条语句可以有标号,也可以没有标号
33
⒈ 单分支结构
程序仅有两个出口,两者选一。
通常用条件判跳指令来选择并转移。
可实现单分支程序转移的指令有位条件转移指令,
如:JC、JNC、JB、JNB和JBC等,还有一些条件转移指
令,如:JZ、JNZ、DJNZ等。
有3种典型形式(见图4–2)。
34
图4–2(a),当条件满足时执行分支程序1, 否则执行分支程序2。 图4–2(b),当条件满足时跳过程序段1,从 程序段 2 开始继续顺序执行;否则,顺序执行程序 段1和程序段2。 图4–2(c),当条件满足时程序顺序执行程 序段2;否则,重复执行程序段1,直到条件满足为 止。实际是循环结构程序。
把P1.0位地址赋值给RED,在后面的编程中,RED即可作
为位地址P1.0使用。
21
例1. 伪指令应用 ORG 8100H BUFFER DS 10H DW “A B”
DW 100H,1ACH,-814
说明:① 从8100H至810FH为缓冲区空间 ② (8110H)=41H („A‟) (8111H)=42H („B‟) ③ 8112H单元起存放01H、00H、01H、ACH、FCH、D2H
第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、为正、为负以及相
第四章
单片机原理及应用
4.2 源程序的编制
现在单片机应用系统的程序设计都借助于通用微型计算机来完成。 先在微机上利用各种编辑软件编写单片机的汇编语言源程序,后用交 叉汇编程序对源程序进行汇编,并将获得的目标程序经仿真器或通用 编程器写到单片机或程序存储器中,进而完成应用程序的调试。
4.2.1 源程序的编制和汇编
单片机原理及应用
4.3.3 循环程序
在程序设计中,经常需要控制一部分指令重复执行若干次,以便 用简短的程序完成大量的处理任务,这种按某种控制规律重复执行的 程序称为循环程序。循环程序有先执行后判断和先判断后执行两种基 本结构。
4.3.4 子程序及其调用
一、子程序的调用 特点:在执行过程中需要由其他程序来调用,执行完后又需要把 执行流程返回到调用该子程序的主程序。 子程序的调用采用指令LCALL addr16或ACALL addr11来完成。 子程序调用时要注意两点:一是现场的保护和恢复;二是主程序 与子程序的参数传递。
单片机原理及应用
二、现场保护与恢复 在程序调用过程中。子程序在调用结束后的主程序中仍有用,所以 在调用子程序之前需要对它们进行保护,称为现场保护。在执行完子 程序、返回继续执行主程序前恢复其原内容,称为现场恢复。 三、参数传递 传递参数的方法有三种: 1.利用累加器或寄存器 2.利用存储器 3.利用堆栈
单片机原理及应用
4.3 基本程序的结构
一般可把程序结构分为三种形式:顺序结构、分支结构和循环结 构。
4.3.1 顺序程序
顺序程序是最简单的程序结构,在顺序程序中既无分支、循环, 也无子程序调用,程序执行时一条一条按顺序向下执行指令,即按指 令在ROM中的存放顺序进行执行。
4.3.2 分支程序
第四章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 汇编语言语句的种类和格式
语句的种类: 语句的格式:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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
CJNE A ,41H , COMP SJMP DONE COMP: JNC DONE MOV A ,41H DONE: MOV 42H ,A SJMP $ END
SUBB A ,41H JNC LOOP MOV 42H ,41H RET LOOP: MOV 42H ,40H RET
例4.7从内部RAM 22h单元开始存有一个无符号数 数据块,长度n存于21h中。求出数据块中的最小 数,存于20h中。
,Y=BUF
SUBB A .2 分支程序设计
分支程序就是条件分支程序,即根据不同的条 件,执行不同的程序段。
例4.5 设变量X存放于VAR单元,函数值Y存放在 FUNC单元。试按照下式的要求给Y赋值。
编程如下: VAR EQU 30H FUNC EQU 31H MOV A ,VAR JZ COMP JNB ACC.7 ,POSI MOV A ,#0FFH SJMP COMP POSI: MOV A,#1 COMP: MOV FUNC,A
+ (50H) C (A)
MOV A , R4 ADD A , @R0 MOV R4 , A
(50H)中是什么,不知道, 不能用 ADD A,#50H
4.2.4 查表程序
•
程序设计中,有时会遇到比较复杂的运算或转换过程, 直接编程的困难较大,采用查表的方法使解决这种问 题的有效涂径。在编程时可以很方便地通过DB伪指令 把表格的内容存入ROM。 用于查表的指令有两条: MOVC A ,@A+DPTR
开始
数据区首址→R0 比较次数→R7 置交换标志
取前一个操作数
取后一个操作数 Y
前数<后数
图4.3 冒泡法排序程序流程图
前数与后数交换 置交换标志
本地比较完毕? Y
N
本轮有交换
结束
程序如下: ORG 4000H START: MOV R0 ,#40H MOV R7,#09H CLR 00H LOOP: MOV A,@R0 MOV 2BH ,A INC R0 MOV 2AH ,@R0 CLR C SUBS A ,@R0 JC NEXT MOV @R0 ,2BH
;取新数 ;为取下一个新数作准备 ;与原最大数比较
;大,原最小数保留 ;小,改变最小数
;循环
例4.8 设变量X放在30H单元中结果放在31H单元中
ORG 4000H START: MOV A ,30H JZ LP2 JB ACC.7 ,LP1 MOV 31H ,#01H RET LP1: MOV 31H ,#0FFH RET LP2: MOV 31H ,#00H RET
0030H
DPTR , #TAB A A , R7 A , R7 @A+DPTR 0100H Prog0 Prog1 Prog2
* AJMP … 即把PC指向 子程序的起始地址;
* R7 x 2 是AJMP @A+DPTR的机器码匹配; 此处 n<127; * 如用LJMP @A+DPTR,则 R7 x 3, 程序还要作 相应修改。
例4.10 根据50H单元内容转向各处理程序,处理 程序的入口地址分别是 KEY0、KEY1、 KEY2、......KEYn 。 (散转指令)
MOV DPTR ,#KEY MOV A ,50H RL A ADD A ,50H JMP @A+DPTR KEY : LJMP KEY0 LJMP KEY1 ...... LJMP KEYn
程序设计步骤如下:
(1)分析问题,确定算法和解题思路。 (2)根据算法和解题思路画出程序流程图。
(3)根据流程图编写程序。
(4)程序调试,找出错误更正后再调试直至通过。 (5)编写相关说明。
2. 程序的基本结构
由于所处理的问题不同,不同程序的结构也就不尽相
同。但是,结构化程序的基本结构只有三种:顺序结
1 y0 1
x0 x0 x0
散转程序设计
例4.9 根据R7中的内容,转向各个子
程序。
R7=0,转入Prog0 R7=1,转入Prog1 R7=2,转入Prog2 …… R7=n,转入Progn
处 理 0 处 理 1 处 理 n 0 1 R7= ?
n
ORG JUMP1: MOV CLR MOV ADD AJMP ORG TAB: AJMP AJMP AJMP ……
开始 置循环初值
循环处理
循环结束? N
Y
循环修改
循环处理
N
循环结束? Y 结束处理 结束
循环修改
结束处理 结束 (b)先判断后执行
(a)先执行后判断
图4.2 循环程序结构流程图
例4.12 在外部RAM 2000H单元开始存放有20个无符号数, 找出其最大值,把它放在内部RAM30H单元中。 解: ORG 1000H MAIN: MOV DPTR ,# 2000H MOV R7 ,#20 MOV R5 ,#00H LOOP: MOVX A ,@DPTR CLR C SUBB A ,R5 JC NEXT MOVX A ,@OPTR MOV R5 ,A INC DPTR NEXT:DJNZ R7 ,LOOP MOV 30H ,R5 END
编程如下: ORG START:MOV ANL SWAP MOV MUL MOV MOV ANL ADD END 1000H A ,20H A ,#0F0H A B ,#0AH AB B ,A A ,20H A ,#0FH A ,B
;取数,(A)←(20H) ;屏蔽低4位 ;高低4位互换 ;(B)←10 ;BCD数的高4位乘以10 ;乘积暂存B ;取数 ;屏蔽高4位 ;得到结果
初始化
取新数 y N
N
y<x y y→x
N -1=0?
y
END
编程如下: ORG 0030H MOV R0 , #22H MOV R1 , 21H MOV 20H , #0FFH LOOP: MOV A , @R0 INC R0 CJNE A , 20H , LOOP1 LOOP1: JNC NEXT MOV 20H , A NEXT: DJNZ R1 , LOOP END ;数据块起始地址 ;数据个数n ;最大数
例4.2 设两个16位无符号数,分别存放在30H、 31H单元和32H、33H单元,求它们的和,结果保存 在34H和35H单元中。默认为(低字节和高字节)
编程如下:
MOV ADD MOV MOV A ,30H A ,32H 34H ,A A ,31H
ADDC
MOV
A ,33H
35H ,A
例4.3 将内部RAM30H单元的高4位和31H单元的低4 位拼成一个数,存入32H单元。
;取行李重量G放在40H
;M=G×3
;暂存3 × G在R2 ;取回G ;G≤5 ? ;是,转至WETC ;否则M=3G+2(G-5)
;最后结果M存41H
指出本程序的条件限制
4.2.3 循环程序设计
循环程序一般由4部分组成:
(1)置循环初值 (2)循环体 (3)循环修改 (4)循环控制
开始 置循环初值
例4.14 一组10个数存放在片内RAM 50H开始的连 续单元,求和,高字节放R3,低字节放R4中。
y xi
i 1
n
源程序:
ADD1: MOV MOV MOV MOV R7 R3 R4 R0 , , , , #10 #0 #0 #50H ;循环次数n=10 ;存放结果的高8位 ;存放结果的低8位 ;求和的数据存放在从内部RAM 50H ; 开始的单元中 ;注意(50H)=?不知道 ; ;(R4)+(50H)→A ; 结果送回R4
1 y0 1 x0 x0 x0
;取出X ;X=0则转移到COMP ;X>0则转移到POSI ;X<0则转移到Y=-1
;X>0则Y=1
;存函数值