80C51的汇编语言程序设计
80C51单片机的程序设计(完整版)

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

进程
判断
开始 取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汇编程序设计.

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

(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即可。
第3章80C51的汇编语言与程序设计.

10
3 立即寻址
指令码中直接给出操作数的寻址方式。 立即数前必须加“#”标记。指令中的立即数有 8位立即数和16位立即数。
通用符号:#data (8位),#data16(16位)
【例】执行指令 MOV A,#50H和MOV DPTR,#3050H ,A值 分别是多少? 注意区别这个指令:MOV A, 50H
思考:MOV、MOVC、MOVX指令的区别?
2018/10/10
29
堆栈操作指令PUSH和POP
堆栈是一片存储区,遵循“后进先出”原则,栈顶由SP指 示。主要用于系统发生中断时保存中断现场信息。 入栈指令PUSH PUSH direct ;SP←(SP)+1,(SP)←(direct) 出栈指令POP POP direct ;(direct)←((SP)),SP ←(SP)-1
小结:立即数与地址的区别是什么?
2018/10/10Leabharlann 114 寄存器间接寻址
在这种寻址方式中,操作数项中的工作寄存器中存放的不是真正 的数据,而是操作数的地址。间接寻址要在工作寄存器前加 @表示间 址操作。
符号 ― @R0和@R1
【例】若(R0)=30H,(30H)=5AH 执行MOV A,@R0后,(A)=?
第3章 80C51的指令系统
3.1
3.2 汇编语言概述 80C51的指令系统
数据传送指令 (29条) 算数运算指令 (24条) 逻辑运算与循环类指令(24条) 控制转移类指令 (17条) 位操作类指令 (17条) 伪操作类指令
3.3
80C51汇编语言的编程方法
2018/10/10
1
3.1 汇编语言概述
2018/10/10
14
7 位寻址
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ACC ; B ; PSW,#10H ;切换当前工作寄存器组
B ACC PSW
;恢复现场 ; ;内含当前工作寄存器组切换
2016/10/18
32
4.4.2 参数传递
利用累加器或寄存器(简单、快速,但参数个数不多) 【例4-6】实现两个8位的十六进制无符号数求和的子程序。
以 .ASM存盘
0000H MAIN 0040H R7,#16 R0,#60H A,#55H @R0,A R0 R7,LOOP $
2016/10/18
源程序的汇编
汇编源程序转为目标程序的过程叫汇编 汇编通常在Windows下的集成开发环境完成 用A51.EXE汇编生成.OBJ、.LIB及.LST
目标程序的连接
5
2016/10/18
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“ -” 、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
汇编语言编程总结
特点: 操作对象(变量)——全局变量 功能有限 优势:代码高效冗余少,运行速度快,实时性高, 适合短小高速的程序。 劣势:编程难度大,不便于阅读、修改、移植
4.4.1 现场保护与恢复 在主程序中实现(结构灵活)
PUSH 号) PUSH PUSH MOV LCALL POP POP POP PSW
7
2016/10/18
表4.1
优先级
运 算 符
功
能
表达式及其结果示例 4*(5+6)即44 NOT 55H 即AAH; HIGH 1234H 即12H +5、-6 17 / 5 即3; 17 MOD 5 即2
() NOT、HIGH、 LOW
高 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 低·
括号 取反、取高字节、取低 字节 正号、负号 乘、除(取商)、取余 数
ACC B PSW,#10H addr16 B ACC PSW
;保护现场( 含当前工作寄存器组
; ; ;切换当前工作寄存器组 ;子程序调用, ;恢复现场 ; ;含当前工作寄存器组切换
2016/10/18
31
在子程序中实现(程序规范、清晰)
SUB1:PUSH 号) PUSH PUSH MOV … … POP POP POP RET PSW ;保护现场( 含当前工作寄存器组
1000H 1001H
FEH
FCH
FAH 08H
如: ORG 1000H DB -2,-4,-6,8,10,18
0AH
12H
定义字数据表伪指令DW
[标号:] DW 字数据表 ORG 1400H DATA1:DW 324AH,3CH … …
2016/10/18 13
1400H 1401H 1402H 1403H
.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件 绝对地址目标文件可以用于仿真器调试 调试无误的目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器
11
2016/10/18
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
查表程序 延时程序
p112 p116
练习:
编写程序,控制p1.0连接的发光二极管实现 0.5s的闪亮,系统晶振为6MHz。 要求,至少两个函数的设计 主函数 延时子函数
练习:
编写程序,控制p2连接的数码管,实现0.5s的 切换数值从0-9循环显示,系统晶振为6MHz。 要求,至少三个函数的设计 主函数 延时子函数 查表子函数(获取数值x[0,9]的段码)
指令助记符
是指令功能的英文缩写。
6
2016/10/18
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
压缩BCD码存放在20H单元。
2016/10/18
16
4.3.2 分支程序
(单分支、双分支、多分支)
开始
【例4-2】设变量x以补码 的形式存放在片内RAM的 30H单元,变量y与x的关 系是:当x大于0时,y=x;当 x=0时,y=20H;当x小于0 时,y=x+5。编制程序,根 据x的大小求y并送回原单 元。
起始地址设定伪指令ORG
ORG 8000H 表达式通常为十六进制地址,例: START:MOV A,#30H ORG可多次使用,但地址值的顺序要由小到大 … … ORG 表达式
结束汇编伪指令END END
该伪指令位于源程序的最后一行。
2016/10/18 12
定义字节数据表伪指令DB
[标号:] DB 字节数据表
第4章 80C51的汇编语言程序设计
4.1 4.2 4.3 4.4 4.5 程序编制的方法和技巧 源程序的编辑和汇编 基本程序结构 子程序及其调用
简单I/O设备的并口直接驱动示例
2016/10/18
1
单片机应用系统由硬件系统和应用程序构成 应用程序设计方法
汇编语言 高级语言 汇编语言,生成的目标程序占内存空间少、运行速 度快,具有效率高、实时性强。 高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。
32H
4AH
00H 3CH
大端模式
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式 LEN EQU SUM EQU BLOCK EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV
14
符号名为: 地址 常数 段名 字符串 寄存器名 位名 比较:标号只能是地址
R0,#60H DPTR,#1000H A,@R0 A,#24H,LOOP1 DONE @DPTR,A R0 DPTR LOOP0 DONE
;置初值
; 取数据 ;循环结束? ;是 ;循环处理 ;循环修改
;继续循环 ;结束处理
结束
2016/10/18
24
4.4 子程序及其调用
完成通用功能、反复使用的程序设计成子程序。使应用 程序结构清晰紧凑,便于阅读和调试 执行要由其它程序来调用,执行完后要返回到调用程序 结构上仍然采用一般程序的3种结构 调用时注意: 一是现场的保护和恢复; 二是主程序与子程序间的参数传递。
;以转移序号3为例
;置分支入口地址表首址 ;乘2,调整偏移量
; 取地址高字节,暂存于R3
;取地址低字节 ;处理程序入口地址低8位送DPL ;处理程序入口地址高8位送DPH
21
TAB:DW DW DW DW DW PP0:MOV RET PP1:MOV RET PP2:MOV RET PP3:MOV RET PP4:MOV RET
X=1 分支程序PP1
X=2 分支程序PP2
X=3 分支程序PP3
X=4 分支程序PP4
返回
2016/10/18
20
START:MOV ACALL AJMP JPNUM:MOV MOV ADD MOV MOVC XCH INC MOVC MOV MOV CLR JMP
2016/10/18
R7,#3 JPNUM START DPTR,#TAB A,R7 A,R7 R3,A A,@A+DPTR A,R3 A A,@A+DPTR DPL,A DPH,R3 A @A+DPTR
2016/10/18
10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 P1.0 0D7H ;将P1.0的位地址赋给符号名ST ;将位地址为D7H的位定义为符号名 如: ST BIT CF BIT
写入芯片 仿真调试
C源文件 .C
.LST
库文件 .LIB
映像文件
2016/10/18
9
4.2.1 源程序的编辑和汇编
源程序的编辑
依据汇编语言规则 用好伪指令 ORG LJMP ORG MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP END
P0 PP1 PP2 PP3 PP4 30H,#0
30H,#1 30H,#2 30H,#3 30H,#4
;转移序号为0时,置功能号“0”于30H单元 ;转移序号为1时,置功能号“1”于30H单元 ;转移序号为2时,置功能号“2”于30H单元 ;转移序号为3时,置功能号“3”于30H单元 ;转移序号为4时,置功能号“4”于30H单元
2016/10/18
22
4.3.3 循环程序
(2种:先执行,后判断;先判断,后执行)
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
开始
置初值
循环处理 循环修改 N
循环结束? Y 结束处理
MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP
R0,#30H A,#00H R7,#16 @R0,A R0 R7,LOOP $
2016/10/18
8
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ