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

合集下载

80C51单片机的程序设计(完整版)

80C51单片机的程序设计(完整版)
助记符指令与机器指令是一一对应的所以用汇编语言编写的程序效率高占用存储空间小运行速度快而且能反映计算机的实际运行情况所以用汇编语言能编写出最优化的程序
第四章 80C51单片微机的程序设计 单片微机的程序设计
4.1概述 概述
4.1.1 汇编语言格式
1. 计算机语言 计算机语言——机器语言、汇编语言与高级语言 机器语言、 机器语言 程序就是为计算某一算式或完成某一工作的若干指令的有序 集合。计算机的全部工作概括起来, 集合。计算机的全部工作概括起来,就是执行这一指令序列的 过程。这一指令序列称为程序。为计算机准备这一指令前的过 过程。这一指令序列称为程序。 程称为程序设计。目前, 程称为程序设计。目前,可用于程序设计的语言基本上可分为 三种:机器语言、汇编语言和高级语言。 三种:机器语言、汇编语言和高级语言。 ⑴ 机器语言 在计算机中,所有的数符都是用二进制代码来表示的, 在计算机中,所有的数符都是用二进制代码来表示的,指令 也是用二进制代码来表示。这种用二进制代码表示的指令系统 也是用二进制代码来表示。 称为机器语言系统,简称为机器语言。 称为机器语言系统,简称为机器语言。直接用机器语言编写的 程序称为手编程序或机器语言程序。 程序称为手编程序或机器语言程序。
两种语句都由四个部分组成。其中每一部分称为域也称为字段, 两种语句都由四个部分组成。其中每一部分称为域也称为字段, 各字段之间用一个空格或字段定界符分隔, 各字段之间用一个空格或字段定界符分隔,常用的字段定界符有 冒号“ ”“逗号 逗号“ 和分号“ 冒号“:”“逗号“,”和分号“;”。其中方括号括起来的是 可选择部分。 可选择部分。
标号(也称为名字 标号 也称为名字) 域: 也称为名字 用来说明指令的地址。标号可以作为LJMP、AJMP、 用来说明指令的地址。标号可以作为 、 、 LCALL及ACALL等指令的操作数。 等指令的操作数。 及 等指令的操作数 • 在指令语句中,标号位于一个语句的开头位置,由字母和数 在指令语句中,标号位于一个语句的开头位置, 符组成, 字母打头,冒号“ 结束。 符组成 , 字母打头 , 冒号 “ : ” 结束 。 在 80C51单片微机的汇编 单片微机的汇编 语言中,标号中的字符个数一般不超过8个 若超过8个 语言中,标号中的字符个数一般不超过 个,若超过 个,则以前 面的8个为有效 后面字符不起作用。 个为有效, 面的 个为有效,后面字符不起作用。 • 不能使用本汇编语言中已经定义了的符号作标号, 不能使用本汇编语言中已经定义了的符号作标号,比如指令 助记符(如 及寄存器符号名称(如 助记符 如ADD) 、伪指令 (如END) 及寄存器符号名称 如PC) 。 如 • 一条语句可以有标号,也可以没有标号, 一条语句可以有标号,也可以没有标号,标号的有无取决于 程序中的其它语句是否需要访问该条语句。 程序中的其它语句是否需要访问该条语句。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。

第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 $

MSC51-5_80C51单片机的程序设计

MSC51-5_80C51单片机的程序设计

3、BCD码转换成二进制数
4、将二进制转换成压缩BCD码
例:在内部RAM的BINB开始的 在内部 的 开始的 单元中存放一个16位二进制无符 单元中存放一个 位二进制无符 号数,将其化成压缩BCD码,存 号数,将其化成压缩 码 于R5~R3中,试编程。 中 试编程。 BTOD: CLR A MOV R3,A MOV R4,A MOV R5,A MOV R2,#16 BTOD1: MOV A,BINB ADD A,BINB MOV BINB,A MOV A,BINB+1
汇 编 源程序
汇编 程序
连接 程序
调试 程序
(二)汇编语言语句的种类和格式 1、语句的三种类型 程序段说明伪指令ORG 指令语句: ORG 1000H 例: 指令语句:汇编时,一条指令 产生一个目标代码 #12H START: MOV A,
3、伪指令语句 等值伪指令EQU和DL: 例:DDR EQU 1020H(不可改)
28
ADDC A,BINB+1 MOV BINB+1,A MOV A,R3 ADDC A,R3 DA A MOV R3,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R5 ADDC A,R5 DA A MOV R5,A DJNZ R2,BTOD1;R2非零循环 非零循环 RET
INC INC MCSTR2: RET
R0 DPTR
SJMP MCSTR1 CSTR: DB ‘HELLO’,0 说明: 1、伪指令DB定义字符串,最后 一个字节为标志NULL。 2、由DPTR寻址源串,用MOVC 指令取代码段中的数据。 3、R0为目的串指针,寻址内部 RAM。 思考题: 思考题:如何将代码段中的字 符串传递到外部RAM中? 中 符串传递到外部

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单片机汇编语言程序设计(新)

定义数据字命令DW (Define Word)
预留存储区命令DS (Define Storage) 位定义命令BIT 赋值命令EQU (Equate)


数据地址赋值伪指令DATA
汇编终止命令END (End of assembly)

注意!伪指令仅供汇编程序将源程序翻译成目标程序,本身并 不形成机器码。
MOV DPTR, #outbuf
LOOP: MOV A,@R0 CJNE A,#0D0H,CONTINUE SJMP FINISH CONTINUE: MOVX @DPTR,A
INC R0
INC DPTR DJNZ R7,LOOP
FINISH:
SJMP $
END
28
子程序

在主程序中调用子程序
9
预留存储区命令 DS (Define Storage)

在程序存储器中保留指定数目的单元作为
预留存储区,供程序运行使用。
[<标号:>] DS <16位数表> 【例】ADDRTA;连续的地址单元。
DB、DW、DS只能对于程序存储器使用
10
18
【例】三分支-多次二选一。设变量x存入30H 单元,求得函数y存入31H单元。按下式要求 给y赋值:
x-1(x<5) Y= 0(5≤x ≤ 10) x+1(x>10)
要根据x的大小来决定y值,在判断x<5和y>10时,采用CJNE和JC 以及CJNE和JNC指令进行判断。
19
ORG 1000H MOV A,30H NEXT1: NEXT2: JC NEXT3 JNC NEXT4 MOV R0,#0 SJMP NEXT5 NEXT3: MOV R0,A DEC R0 SJMP NEXT5 ;x<5,y=x-1 ;取x ;x<5,则转NEXT3 ; x>10,则转NEXT4 ;5≤x ≤10,y=0 CJNE A,#5,NEXT1 ;与5比较

80C51的程序设计

80C51的程序设计

三、程序总体设计及流程图绘制
经过任务分析、算法优化后,就可以进 行程序的总体构思,确定程序的结构和数 据形式,并考虑资源的分配和参数的计算 等。然后根据程序运行的过程,勾画出程 序执行的逻辑顺序,用图形符号将总体设 计思路及程序流向绘制在平面图上,从而 使程序的结构关系直观明了,便于检查和 修改。
第4章 80C51的程序设计
4.1 4.2 4.3 4.4 程序编制的方法和技巧 源程序的编辑和汇编 基本程序结构 常用程序举例
4.1 程序编制的方法和技巧
4.1.1程序编制的步骤
任务 分析 算法 优化 流程图 绘制 编 程 调 试
一、预完成任务的分析 首先,要对单片机应用系统预完成的任 务进行深入的分析,明确系统的设计任务、 功能要求和技术指标。其次,要对系统的 硬件资源和工作环境进行分析。这是单片 机应用系统程序设计的基础和条件。
常用的流程图符号有:开始和结束符号、工 作任务符号、判断分支符号、程序连接符号、 程序流向符号等
开始或结束符号 判断分支符号 程序流向符号
工作任务符号
程序连接符号
程序流向符号
4.1.2
编制程序的方法和技巧
一、采用模块化程序设计方法 应用系统的程序由包含多个模块的主程序和各种 子程序组成。各程序模块都要完成一个明确的任务, 实现某个具体的功能,如:发送、接收、延时、打 印和显示等。 模块化的程序设计方法具有明显的优点。把一个 多功能的复杂的程序划分为若干个简单的、功能单 一的程序模块,有利于程序的设计和调试,有利于 程序的优化和分工,提高了程序的阅读性和可靠性, 使程序的结构层次一目了然。
标示符 DATA 数据存储器地址
BUF1 DATA MOV MOV 30H BUF1,#55H BUF1+1,#0AAH

第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指令系统中,有两条查表指 令:

80C51的汇编语言程序设计

80C51的汇编语言程序设计

.M51
映像文件
仿真调试
写入芯片
2021/6/4
10
MCS-51单片机汇编语言,包含两类不同性质的指令。
(❖1)基本指令(指令性语句):即指令系统中的指令。它们 都❖是机器能够执行的指令,每一条指令都有对应的机器码。 源程序的主要功能都是由指令性语句完成。
(2)伪指令(指示性语句):汇编时用于控制汇编的指令。 它们都是机器不执行的指令,无机器码。
MOV DPTR,STRT
标号为符号地址其值为8000H
2021/6/4
12
ORG 8000H START:MOV A,#30H
MOV R2,#20H ORG 8001H MOV A,#40H
结束汇编伪指令END END
该伪指令位于源程序的最后一行。
2021/6/4
13
定义字节数据表伪指令DB
1000H FEH
之间用逗号隔开。使用方法与DB类同。
大端模式
ORG 1400H DATA1:DW 324AH,3CH
……
2021/6/4
15
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式
符号名可代表: ❖地址 ❖常数 ❖段名 ❖字符串 ❖寄存器名 ❖位名
比较:标号只能是地址
LEN EQU SUM EQU BLOCK EQU
SWAP A MOV 41H,A
;取数 ;屏蔽高4位 ;存低4位 ;再取 ;屏蔽低4位 ;高低4位交换 ;存高4位
01010110B 56H
01010110B 56H
——∧——0—0—00—1—11—1—B———0F—H—— 00000110B 06H
——∧——1—11—1—0—00—0—B———F—0—H—— 01010000B 50H

第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单片机汇编语言程序设计

上例中,如果采用CJNE指令,应如何修改程序? 18
XAD EQU
1000H;
BUF EQU
2000H;
ORG 1000H
START:MOV DPTR, #XAD ;数据X的地址送数据指针DPTR
MOVX A,
@DPTR; A←取数据X
CJNE A, #0, ANZ ; X≠0转ANZ
SJMP SAV;
难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。
2
4.1.2 单片机使用的高级语言
对于8051单片机,现有4种语言支持,即汇编、 PL/M、C和BASIC。
C语言最终得到广泛应用。 可以大大提高单片机应用系统研制的开发效率。移 植性好。 高级语言的不足:生成的目标代码较长,导致应用程 序运行速度较慢。
分支程序
BR1: …
BRn: …
21
(2)通过转移指令表实现程序多分支
MOV A, n
RL A
;分支序号值乘以2
MOV DPTR, #BRTAB;转移指令表首址
JMP @A+DPTR
BRTAB: AJMP BR0
;转分支程序0
AJMP BR1
;转分支程序1
BR0: … BR1: …
AJMP BR127
顺序结构程序是最简单的程序结构。程序既无分支、 循环,也不调用子程序,程序执行时一条接一条地 按顺序执行指令。
6
2、程序设计的一般步骤
(1)分析任务 (2)确定算法 (3)画流程图 (4)编写程序 (5)上机调试
查错、改错, 用指令的形式
对程序进行 将程序流程图
优化。
实现出来。
当接到程序设计的任务后, 首先对任务进行详尽的分析, 搞清楚已知的数据和想要得 到的结果,程序应该完成何 种的功能。明确在程序设计 时应该 “做什么” 。

第四章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 汇编语言语句的种类和格式
语句的种类: 语句的格式:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PUSH ACC
;高位地址入栈
RET
;分支入口地址装入PC
BRTAB:DW BR0
;分支程序入口地址表
DW BR1
DW BR127
例:假设键盘上有4个按键,功能说明如下表:
键功能
删除 读数据 写数据
插入
键值(分支程序序号)
00H 01H 02H 03H
键处理程序(分支程序)
ER DS XS CR
分析任务 确定算法 程序流程框图
(8)程序设计流程框图;
(9)程序清单;
开始
设置数据指针
取数据N1并暂存
Y N2保存于A中
取数据N2
N2≥N1 N
N1保存于A中
修改数据指针
保存大数
结束
START: CLR C
;进位位清0
MOV DPTR,#ST1 ;设置数据指针
MOVX A,@DPTR ;取第1个数
MOV R2, A
;第1个数存于R2
EQU EQU 1000H DPTR, A, SAV; ACC.7, A, SAV; A, DPTR, @DPTR,
1000H; 2000H;
#XAD ;数据X的地址送数据指针DPTR @DPTR; A←取数据X
X=0转SAV NEG; X<0转NEG,否则,X>0 #01H;
#0FFH; (0FFH为-1补码) #BUF; 数据Y的地址送数据指针DPTR A; 保存Y值
第4章 80C51单片机汇编语言程序设计
4.1 单片机程序设计语言概述 4.2 汇编语言程序的基本结构形式 4.3 80C51 单片机汇编语言程序设计举例 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51 单片机汇编语言伪指令
4.1 单片机程序设计语言概述
4.1.1 机器语言和汇编语言 1、机器语言
CJNE A, 55H, LOOP1 ;若Ta≠T55,则转向LOOP1
AJMP FH
;若Ta=T55,则返回
LOOP1: JNC JW
;若(CY)=0,表明Ta>T55,转降温处理程序
CJNE A, 54H, LOOP2 ;若Ta≠T54,则转向LOOP2
AJMP FH
;若Ta=T54,则返回
LOOP2: JC SW
;若(CY)=1,表明Ta<T54,转升温处理程序
FH: RET
;若T55≥Ta≥T54,则返回主程序
例:已知:127≥X≥-128,求Y。设X,Y分别存放在外部 RAM 1000H和2000H单元中。
解:(1)分析任务:解方程 (2)算法:控制转移 (3)程序结构:多分支
1 y 1
0
x0 x0 x0
DPTR←表首地址
A←分支序号×2
JMP @A+DPTR
序号=00H 序号=01H
序号=02H 序号=03H
ER分支程序 DS分支程序 XS分支程序 CR分支程序
假设转移指令表名称为BRTAB,分支程序序号已在A 中。
MOV DPTR, #BRTAB
CLR C
RLC A
JMP @A+DPTR;
ORG
(2)多重单分支结构举例 多重单分支结构中,通过一系列条件判断,进
行逐级分支。为此可使用比较转移指令CJNE实现。
例:假定采集的温度值Ta放在累加器A中。此外,在内部 RAM 54H单元存放温度下限值T54,在55H单元存放温度 上限值T55。若Ta>T55,程序转向JW(降温处理程序);若 Ta<T54,则程序转向SW(升温处理程序);若 T55≥Ta≥T54,则程序转向FH(返回主程序)。
单元,其中ST1和ST2单元中存放着两个无符号二进制 数,要求找出其中的大数并存入ST3单元中。
解:(1)分析任务:比较两个数的大小
(2)算法:算术运算、控制转移
(3)程序结构:单分支
(4)数据类型:单字节、二进制、无符号数
(5)数据结构:单元地址升序排列
(6)RAM单元安排:外部RAM单元
(7)采用寄存器间接寻址方式(R0、R1或DPTR)
同一标号在一个程序中只能定义一次。
标号可有可无。 错误的标号
正确的标号
1BT :
BT1
BEGIN
BEGIN :
TA+TB:
TATB:
ADD:
ADD1:
2. 操作码 用于规定语句执行的操作内容,用指令助记符表示。 不能空缺。
3. 操作数 操作数用于为指令操作提供数据。可以是空白,也可 能有1~3个操作数,各操作数之间以逗号分隔。
1. 单分支程序结构 单分支程序结构即二中选一,是通过条件判断实现
的。一般都使用条件转移指令对程序的执行结果进行判 断。
可实现单分支转移的指令有:JZ、JNZ、CJNE和 DJNZ。位状态转移指令:JC、JNC、JB、JNB和JBC 等。
(1)单分支结构举例 假定在外部RAM中有ST1、ST2和ST3共3个连续
ANZ: JC NEG ;X<0转NEG,否则,X>0
MOV A,
#01H;
SJMP SAV;
NEG: MOV A,
#0FFH; (0FFH为-1补码)
SAV: MOV DPTR, #BUF; 数据Y的地址送数据指针DPTR
MOVX @DPTR, A; 保存Y值
END
2. 多分支程序结构 多分支程序结构流程中具有两个以上条件可供选择。可 供使用的是变址寻址转移指令“JMP @A+DPTR”,但使 用该指令实现多分支转移时,需要有数据表格配合。
(4)数据类型:单字节、二进制、有符号数
(5)RAM单元安排:外部RAM单元
(6)采用寄存器间接寻址方式(R0、R1或DPTR)
(7)程序设计流程框图
(8)程序清单;
Y Y=0
开始
取数据X
X=0 N
X<0 N
Y=1
Y Y=-1
保存数据Y 结束
返回
XAD BUF ORG START:MOV MOVX JZ JB MOV SJMP NEG: MOV SAV: MOV MOVX END
循环结构是重复执行某个程序段。使用条件转移指令通 过条件判断来实现和控制循环。 循环程序一般由四个主要部分组成:
用二进制代码“0”和“1”表示指令和数据的程序设计语 言,是计算机能直接识别并执行的指令。 优点:执行速度快、占用内存少。 缺点:识别难、记忆难。 2、汇编语言 用助记符和专门的语言规则表示指令的功能和特征。 优点:助记符与机器指令一一对应。比机器语言直观、
易懂、易记。非常适合于实时控制的需要。 缺点:难以记忆和使用,程序设计的技巧性较高,编程
根据实际问题的要求和指令系 统的特点,确定解决问题的具 体步骤。根据任务要求,对不 同的计算方法进行比较,选择 最适宜的算法。解决“怎样做” 的问题。
将解决问题的具体步骤用一种 约定的几何图形、指向线和必 要的文字说明描述出来,用图 形的方法描绘解决问题的思路。
例:3字节无符号数相加:其中被加数在内部RAM的50H、
BR1: …
BRn: …
(2)通过转移指令表实现程序多分支
MOV A, n
RL A
;分支序号值乘以2
MOV DPTR, #BRTAB;转移指令表首址
JMP @A+DPTR
BRTAB: AJMP BR0
;转分支程序0
AJMP BR1
;转分支程序1
BR0: … BR1: …
AJMP BR127
;转分支程序127 ;分支程序
难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。
4.1.2 单片机使用的高级语言
对于8051单片机,现有4种语言支持,即汇编、 PL/M、C和BASIC。
C语言最终得到广泛应用。 可以大大提高单片机应用系统研制的开发效率。移 植性好。 高级语言的不足:生成的目标代码较长,导致应用程 序运行速度较慢。
3000H BRTAB3:10A0JHMP 3001H
3002H 3003H
320A0JHMP
3004H 3005H
330A0JHMP
3006H
340A0JHMP
3000H ERE:R;…OR…G ……转…3删1…0除0;H分支删程除序分支程序
ORG 3200H DSD:S;…………转…读…数;据分读支数程据序分支程序
ORG 3300H XSX:S;…………转…写…数;据分写支数程据序分支程序
ORG 3400H CRC:R;…………转…插…入;分支插程入序分支程序
END
(4)使用比较转移指令CJNE实现。
(A)=0? N
(A)=1? N
(A)=2?
N
Y 转向0分支
Y 转向1分支
Y 转向2分支
4.2.3 循环程序结构
BRn: …
(3)其他实现程序多分支的方法
MOV DPTR, #BRTAB ;分支入口地址表首址
MOV A, R0
RL A
;分支转移值乘以2
MOV R1, A
;暂存A值
INC A
MOVC A, @A+DPTR ;取低位地址
PUSH ACC
;低位地址入栈
MOV A, R1
;恢复A值
MOVC A, @A+DPTR ;取高位地址
4.1.3 80C51 单片机汇编语言的语句格式
80C51汇编语言的语句格式如下:
[<标号>] : <操作码> [<操作数>]; [<注释>]
1. 标号
是语句地址的标志符号,标号的几点规定:
1~8个ASCII字符组成,第一个字符必须是字母。
不能使用本汇编语言已经定义的符号作为标号。
相关文档
最新文档