版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 汇编语言程序设计,教学目标 4.1 计算机编程语言概述 4.2 汇编语言程序设计基本概念 4.3 汇编语言程序设计 4.4 实用程序举例 4.5 实训指导 本章小结 思考题与习题,教学目标,通过本章教学,要求达到以下目标: 1. 熟悉汇编语言的语句结构; 2. 了解手工汇编,计算偏移量及转移地址的 方法; 3. 了解程序设计的步骤,会画程序流程图; 4. 掌握顺序程序、分支程序、循环程序等基 本程序的编制方法,重点掌握分支、循环 程序中的一些典型和常用子程序的编制方法。,4.1 计算机编程语言概述,4.1.1 机器语言 机器语言就是用二进制编码表示每条指令。因为计算机只能识别二进制数,
2、所以计算机能够直接执行用机器语言编出的机器码程序。不同种类的计算机,由于其内部结构不完全相同,它的机器码指令也不一定相同。,4.1.2 汇编语言 汇编语言是符号化的机器语言。它用一些容易理解和记忆的符号代替机器码指令,因此又把汇编语言称为助记符语言,也就是说助记符指令与机器码指令是一一对应的。汇编语言同机器语言一样,不同结构的计算机,它的汇编指令也不相同。例如,要求“8+7”的结果,用AT89C51汇编语言可写成: MOV A,#08H ADD A,#07H,对比机器码,汇编语言克服了机器语言的缺点,方便了用户记忆指令和编写程序,但用汇编语言编写的源程序毕竟不是计算机能直接识别的机器码,需用汇
3、编程序“翻译”成机器码后方可执行。 采用汇编语言编写程序,可以直接访问和操作单片机中的寄存器及存储器单元,对数据的处理表述的非常具体。因此,在计算机实时测试和控制领域中得到了广泛应用。,4.1.3 高级语言 高级语言是接近自然语言和数学语言的算法语言,具有直观、通用等特点。相对于高级语言,机器语言和汇编语言属于低级语言。用低级语言编写程序需要完全了解CPU硬件结构,对程序设计人员要求较高,且程序不能移植。,4.2 汇编语言程序设计基本概念,4.2.1 汇编语言格式 汇编语言直接面向机器,它的格式因机器不同而不同。我们先看一段用AT89C51指令编写的汇编程序。,例4.1 将40H、41H两个单
4、元中的大数送入 A中。 MOV A,40H CJNE A,41H,BIG BIG: JNC OVER ;40H单元值大则结束 MOV A,41H ;41H单元值小则送入 ;累加器A中 OVER: RET,由上例可见,AT89C51单片机汇编语言 指令格式如下: 标号: 操作码 操作数 ;注释 其中 的部分为可选项,操作码必不可少! (1) 标号是表示该指令位置的符号地址。 (2) 操作码指出了指令所要实现的操作功能。,(3) 操作数指出了参与操作的数据来源(源 操作数) 、和操作结果存放的目的单元 (目的操作数)。 (4) 注释是对一条指令或一段程序的解释和说 明,目的是方便程序的阅读。,4.
5、2.2 程序设计的一般步骤,1. 完成任务分析,(1)功能要求 (2) 技术指标 (3)硬件资源和工作环境,2. 进行算法优化,(1) 速度 (2) 内存使用,3. 程序总体设计及绘制流程图 清晰的流程图是正确编制应用程序的基础 和条件。流程图是用各种图形、符号、有向线 段(如表4.1所示)来直观地表示程序执行的步 骤和顺序。它可使人们通过流程图的基本线 索,对全局有完整的了解。,(1)总流程图: 程序的逻辑结构,各程序模块 间的相互关系。 (2)局部流程图: 程序模块的具体实施细节。,表4.1 常用流程图符号及说明,4. 编写源程序,根据流程图各部分功能,用汇编语言指令实现流程图的每一个具体
6、步骤,也即编写出具体的汇编语言源程序。所编写的源程序要求简单明了,层次清晰。 5. 调试、测试程序 调试是利用仿真器等开发工具,采用单步、设断点、连续运行等方法排除程序中的错误,完善程序的功能。,4.2.3 程序编制的方法和技巧,1. 采用模块化程序设计方法,(1) 主程序、子程序,如:发送、接收、 延时、打印和显示等。,(2) 模块化的优点, 便于程序设计和调试; 便于程序优化和分工; 提高程序阅读性和可靠性。,2. 尽量采用循环结构和子程序,(1) 长度减少、内存空间减少;,(2) 避免 “死循环,注意循环初值和结束条件;,(3) 子程序用到的寄存器内容应压栈保护, 并注意堆栈操作的压入和
7、弹出的平衡;,(4) 中断处理子程序除了要保护程序中用到的 寄存器外,还应保护标志寄存器。,1手工汇编 手工汇编是通过手工方式查指令编码表,逐个把助记符指令“翻译”成机器码的过程。 2机器汇编 机器汇编是在机器上使用汇编程序自动地进行源程序的汇编,最后得到机器码表示的目标程序。汇编与反汇编过程如图4.1所示。,4.2.4 源程序的汇编,汇编(汇编程序) 源程序 目标码 (汇编语言) (机器语言) 反汇编(汇编程序),图4.1 汇编和反汇编示意图,4.3 汇编语言程序设计,4.3.1 顺序程序设计 顺序程序指无分支、无循环结构的程序。其设计是最基本的程序设计。它是按照指令排列的先后顺序依次执行,
8、每条指令都必须执行,且只执行一遍。顺序程序设计一般比较单一、简单,常常作为复杂程序的一部分。,1. 数据传送 例4.2 内部RAM的2AH2EH单元中存储的数据如图4.2所示。试编写程序实现图示的数据传送结果。,图4.2 数据传送示意图,方法1: MOV A,2EH ;2字节,1个机器周期 MOV 2EH,2DH ;3字节,2个机器周期 MOV 2DH,2CH ;3字节,2个机器周期 MOV 2CH,2BH ;3字节,2个机器周期 MOV 2BH,#00H ;3字节,2个机器周期,方法2: CLR A ;1字节,1个机器周期 XCH A,2BH ;2字节,1个机器周期 XCH A,2CH ;2
9、字节,1个机器周期 XCH A,2DH ;2字节,1个机器周期 XCH A,2EH ;2字节,1个机器周期,方法1:14个字节,9个机器周期; 方法2:9个字节,5个机器周期。,2. 查表程序 例4.3 在片内RAM的20H单元有一变量,其取值范围为00H05H。试编程,根据变量值求其平方值,并存入片内RAM的21H单元。程序如下: ORG 1000H START:MOV DPTR,#TAB MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000H TAB:DB 00,01,04,09,16,25 END,图4.3 查表程序框图,(1) MOVC A
10、,A+ DPTR,用DPTR指向表首址,则变量与DPTR之和的地址单元中的内容就是变量的平方值。,(2) MOVC A,A+PC 不破坏DPTR的内容,从而可以减少保护 DPTR的内容所需的开销。 表格存放在该指令后的256字节内。,也可采用如下专用指令实现查表功能,3. 简单运算 对于多字节的相加运算必须从低位字节开始分字节进行。除最低字节可以使用ADD指令外,其他字节相加时要使用ADDC指令。,例4.4 现将两个双字节无符号数相加。设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00
11、H位中。(程序见下页),ORG 0100H MOV R0,50H ;被加数的低字节地址 MOV R1,60H ;加数的低字节地址 MOV A,R0 ;取被加数低字节 ADD A,R1 ;加上加数低字节 MOV R0,A ;保存低字节相加结果 INC R0 ;指向被加数高字节 INC R1 ;指向加数高字节 MOV A,R0 ;取被加数高字节 ADDC A,R1 ;加上加数高字节(带进位加) MOV R0,A ;存高字节相加结果 MOV 00H,C ;保存进位 。 END,4.3.2 分支程序设计,可分成a)单分支、b)双分支和c)多分支几种 :,条件成立?,程序段A,下条指令,程序段B,条件成
12、立?,程序段A,K=0?,K=1?,K=2?,Y,分支0,Y,分支1,Y,分支2,N,N,N,a),b),c),图4.4 分支程序结构示意图,例4.5 片外RAM 2000H、2001H单元分别存放两个数,判断这两个数是否相等,如果相等,则位地址7FH置1,否则清零。 若判断两个数相等使用比较转移指令很容易实现该题中的要求,程序流程如图4.5所示。,图4.5 判断两个数相等的程序流程图,程序如下: ORG 0100H MOV DPTR,#2000H;地址指针指向片外2000H单元 MOVX A,DPTR;(2000H)A MOV R0,A;AR0 MOV DPTR,#2001H ;地址指针指向
13、2001H单元 MOVX A,DPTR;(2001H)A MOV 30H,R0 CJNE A,30H,NE;若两个数不相等,则转NE SETB 7FH ;若两个数相等,则7FH单元置1 AJMP OVER ;转OVER NE: CLR 7FH;7FH单元清零 OVER:RET,例4.6 设VAR 单元内有一自变量X,请按如下条件编程求函数值Y并存入FUNC单元中。,1 X0 Y = 0 X = 0 -1 X0,图4.6 按条件求函数Y的流程图,程序如下: ORG 0100H VAR EQU 30H FUNC EQU 31H MOV A, VAR ; XA JZ DONE ; 若X=0,则转DO
14、NE JNB ACC.7,POSI ; 若X0,则转POSI MOV A,#0FFH ; 若X0,则-1A, FFH为-1的补码 SJMP DONE ; 转DONE POSI: MOV A,#01H ; 1A DONE: MOV FUNC ,A ; 存Y值 RET,循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (
15、4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,4.3.3 循环程序,循环程序的结构,有先执行后判断和先判断后执行两种结构 :,图4.7 循环程序结构示意图,例4.7 试编制一个 50ms延时程序。设晶振频率为12Hz, 则一个机器周期为1s。执行一条DJNZ 指令需要 2个机器周期,即 2s。采用循环计数法实现延 时,循环次数可以通过计算获得,并选择先执行后 判断的循环结构。程序段如下: DEL: MOV R7,#200 ;1 s DEL1:MOV R6,#123 ;1 s NOP ;1 s DEL2:DJNZ R6,DEL2 ;2s,计(2123)s DJNZ R7
16、,DEL1 ;2s, RET 共计 (21232 2)200+1 s,即50.001ms,例4.8 将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现$ 字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结构比较适宜。 MOV R0,#data MOV DPTR,#buffer LOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判是否为 $ 字符 SJMP LOOP2 ;是 $ 字符,转结束 LOOP1:MOVX DPTR,A ;不是 $ 字符,执行传送 INC R0 INC DPTR SJ
17、MP LOOP0 ;传送下一数据 LOOP2: ,4.3.4 子程序设计及其调用,子程序是指能完成明确任务、具有独立功能且能被其它程序反复调用的程序段。调用子程序的源程序称为主程序。,将通用性问题设计成子程序形式,可使程序结构紧凑、缩短程序长度,同时也方便程序调试。,1. 子程序设计要点,(1) 子程序的首地址必须要用标号,该标号就是 这个子程序的名称。子程序的最后一定要设置 一条返回指令RET。 (2) 尽可能编成浮动地址程序,以便于存放在存储 区的任意位置。 (3) 为了方便使用,每个子程序都要有使用说明: 如子程序功能的简要说明、入口参数、出口参数及所占用的寄存器和存储单元等。,2. 子
18、程序调用注意事项,用户在调用子程序时,应注意现场保护 和主程序与子程序的参数传递两个问题。,(1) 现场保护与恢复 子程序经常用到R0R7、A、DPTR,以及PSW 等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要进行保护(即现场保护)。,在执行完子程序,返回继续执行主程序前恢复其原内容,称为现场恢复。保护与恢复的方法有两种: 一是 在主程序中实现;二是在子程序中实现。, 在主程序中实现 PUSH PSW ;保护现场 PUSH ACC PUSH B MOV PSW,#10H ;换当前工作寄存器组 LCALL addr16 ;子程序调用 POP B ;恢复现场 POP ACC POP
19、 PSW 特点是结构灵活。, 在子程序中实现 SUB1:PUSH PSW ;保护现场 PUSH ACC PUSH B MOV PSW,#10H ;换当前工作寄存器组 POP B ;恢复现场 POP ACC POP PSW RET 程序规范、清晰。要注意保护与恢复的顺序。,(2) 参数传递 传递参数的方法有三种:, 利用累加器或寄存器 先把子程序需要的数据送入A或指定的工作 寄存器中; 当子程序执行时,可从指定的单元中取得 数据,执行运算子程序也可以用同样的方法 把结果传送给主程序。,例4.9 编写程序,实现c=a2+b2 。设a,b,c分别存 于内部RAM的30H,31H,32H三个单元中。
20、START:MOV A,30H ;取a ACALL SQR ;调用查平方表 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR : MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR RET TAB : DB 0,1,4,9,16 ,25,36,49,64,81, 利用存储器 数据量比较大时,利用存储器实现参数的传递, 先建立一个参数表,用指针指示参数表所在位置。 a) 参数表建立在内部RAM时,用R0或R1作指针。 b) 参数表建立在
21、外部RAM时,用DPTR作指针。,例4.10 将R0和R1指向的内部RAM 中两个3字节无符号整数相加,结果送到由R0指向的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,R0指向结果的高位字节。低字节在高地址,高字节在低地址。,实现程序: NADD:MOV R7,#3 ;三字节加法 CLR C NADD1:MOV A,R0 ;取加数低字节 ADDC A,R1 ;被加数低字节加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 RET,利用堆栈 堆栈传递参数是在子程序嵌套中常采用的一种方法。 例4.11 把内部RAM中20H单
22、元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。,MAIN:MOV A,20H SWAP A PUSH ACC ;参数入栈 ACALL HEASC POP ACC MOV R0,A ;存高位十六进制数转换结果 INC R0 ;修改指针 PUSH 20H ;参数入栈 ACALL HEASC POP ACC MOV R0,A ;存低位十六进制数转换结果 SJMP $,HEASC:MOV R1,SP ;借用R1为堆栈指针 DEC R1 DEC R1 ;R1指向被转换数据 XCH A,R1 ;取被转换数据 ANL A,#0FH ;取一位十六进制数 ADD A,#2 ; 所加
23、值为MOVC与DB间字节数 MOVC A,A+PC ;查表 XCH A,R1 ;1字节指令,存结果于堆栈 RET ;1字节指令 ASCTAB:DB 30H,31H,32H,33H, 34H DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H,(1)数据较少时,采用寄存器传递方式 可以获得较快的传递速度; (2)数据较多时,宜采用存储器或堆栈 方式传递; (3)若是子程序嵌套,宜采用堆栈方式。,参数传递三种方法的选用原则,4.4 实用程序举例,4.4.1 算术运算程序 1. 多字节数的加、减运算 合理地运用进位(借位)标志,例4.12 多字节无符号
24、数的加法运算举例。 设两个N字节的无符号数分别存放在内部 RAM中以DATA1和DATA2开始的单元中。相加 后的结果要求存放在DATA2数据区。,MOV R0,#DATA1 MOV R1,#DATA2 MOV R7,#N ;置字节数 CLR C LOOP: MOV A,R0 ADDC A,R1 ;求和 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7, LOOP,点击观看仿真演示,例4.13 多字节无符号数的减法运算举例。 设两N字节数分别放在内部RAM中以DATA1和DATA2开始的单元中。相减后的结果要求存放在DATA2数据区。 MOV R0,#DATA
25、1 MOV R1,#DATA2 MOV R7,#N ;置字节数 CLR C LOOP:MOV A,R0 ;被减数送A SUBB A,R1 ;求差 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP,2双字节无符号数乘法运算程序 例4.14 已知在寄存器R4R5和R2R3中分别存放有双字节的被乘数和乘数(R5、R3存放低8位,R4、R2存放高8位),试编程求积并存入BLOCK开始的连续四个存储单元(低字节在前,高字节在后)。 AT89C51乘法指令只能完成两个8位无符号数相乘,因此16位无符号数求积必须将它们分解成四个8位数相乘来实现,其方法是边乘边加。
26、原理和过程如图4.8所示。,图4.8 双字节无符号数乘法原理图,图中ab为16位被乘数,cd为16位乘数(a、c代表高8位,b、d代表低8位),而其后跟H表示乘积后的高8位,跟L表示乘积后的低8位。 ORG 1000H BLOCK EQU 30H MOV R0,#BLOCK ; 指向积单元首址 MOV A,R5 MOV B,R3 MUL AB ; bd MOV R0,A ; 保存bdL MOV A,B INC R0 MOV R0,A ; 保存 bdH,MOV A,R4 MOV B,R3 MUL AB ; ad ADD A,R0 ; bdH+adL MOV R0,A INC R0 MOV A,B
27、 ADDC A,#00H ; adH+进位 MOV R0,A DEC R0 MOV A,R5 MOV B,R2,MUL AB ; bc ADD A,R0 ; bcL与bdh、adL、进位累加 MOV R0,A MOV A,B INC R0 ADDC A,R0;bcH与adH、进位累加 MOV R0,A INC R0 CLR A ADDC A,#00H MOV R0,A ;保存进位,MOV A,R4 MOV B,R2 MUL AB;ac DEC R0 ADD A,R0;acL与adH、bcH、进位累加 MOV R0,A MOVA,B INC R0 ADDC A,R0;ac与进位累加 MOV R0
28、,A RET,1. 十六进制数与ASCII码间的转换 十六进制数转换为ASCII码间的算法: (1)数在09之间时,ASCII码值为该数加30H (2)数在AF之间时,ASCII码值为该数加37H,4.4.2 码型转换,例4.15 将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII 码存放于R2中。,HASC:MOV A,R0 ;取4位二进制数 ANL A,#0FH ;屏蔽掉高4位 PUSH ACC ;4位二进制数入栈 CLR C ;清进(借)位位 SUBB A,#0AH ;用借位位的状态判断该数在09 ;还是AF之间 POP ACC ;弹出原4位二进制数
29、JC LOOP ;借位位为1,跳转至LOOP ADD A,#07H ;借位位为0,该数在AF之间, ;加37H LOOP:ADD A,#30H ;该数在09之间,加30H MOV R2,A ; ASCII码存于R2 RET,2单字节二进制数转换为BCD数 例4.16 已知20H单元存放一个二进制数,编程将它转换为BCD数,百位送入FIRST单元的低4位,十位和个位分别送入SECOND单元的高4位和低4位。 算法:只需将20H单元中的内容除以100,得到的商就是百位BCD数,然后用余数除以10,其结果中,商为十位BCD数,余数为个位BCD数。,ORG0100H FIRSTDATA 30H SEC
30、ONDDATA 31H MOV A,20H ;被除数送A MOV B,#64H;除数100送B DIV AB;A除以B MOV FIRST,A;百位BCD数送FIRST MOV A,B;余数送A MOV B,#0AH;除数10送B DIV AB;A除以B SWAP A;十位BCD数送高4位 ORL A,B ;十位和个位BCD数组合 ; 成一个字节 MOV SECOND,A ;送入SECOND单元 SJMP $ ;结束 END,4.4.3 数据处理 1查询 例4.17 在外部RAM 1000H开始的地址单元中存放30个数据,找出其中的奇数存入内部RAM 20H开始的存储单元中,并统计奇数的个数,
31、存入3FH单元。 用位操作指令对操作数最低位进行判断,若为1即为奇数。本题中,DPTR是片外数据缓冲区地址指针,R0是片内数据缓冲区地址指针。,ORG 0030H MOV DPTR,#1000H ;指向片外缓冲区首地址 MOV R0,#20H;指向片内缓冲区首地址 MOV R7,#30H;循环次数送入R7 MOV 3FH,#00H;清零 LP:MOVX A,DPTR;取数 JNB ACC.0,EVEN ;偶数转EVEN MOV R0,A;奇数保存 INC R0;修改片内地址 INC 3FH;修改统计个数 EVEN:INC DPTR ;修改片外地址 DJNZ R7,LP ;控制循环 RET,2排
32、序 例4.18 将片内RAM 30H开始的连续16个单元的数据按从小到大的顺序排序。 此题采用的是冒泡排序法,即对这16个数据组成的数据串,依次将相邻两数分别进行比较,若后面的数小于前面的数,则比较的相邻两数互换,且置位地址单元7FH为1。若这组数据比较完后,相邻两数有交换(即交换标志位7FH为1),则再重新进行两两比较,直到16个数已从小到大排序,相邻两数比较后不再交换为止。交换标志位7FH用来控制是否再需要重新两两比较。程序流程如图4. 8所示。,图4.9 排序程序流程图,程序如下: ORG 2000H SORT: MOV R1,#30H ;指向数据块首地址 MOV R7,#10H ;数据
33、块长度送R7 CLR 7FH ;交换标志位清零 DEC R7 ;块长减1为比较次数 LOOP1:MOV A,R1 ;取相邻两数中的前一个数 MOV 20H,A INC R1 MOV A,R1 ;取相邻两数中的后一个数 CJNE A,20H,LOOP ;相邻两数比较,LOOP: JNC NEXT ;前者小于后者转至NEXT XCH A,20H ;前者大于后者,相邻两数互换 MOV R1,A DEC R1 MOV R1,20H INC R1 ;恢复数据块指针 SETB 7FH ;置1标志位 NEXT: DJNZ R7,LOOP1 ;所有相邻两数未比较完, ;转至LOOP1 JB 7FH,SORT
34、;交换标志位为1,转至SORT RET,4.5 实训指导,实训4 .1 顺序程序设计(拆字和拼字) 1. 实训目的 掌握汇编语言程序设计和调试方法,以及拆字和拼字程序的作用与编程实现。 2. 实训内容 (1) 拆字:把7000H单元中的内容拆开,高4位送7001H的低4位,低4位送7002H的低4位,7001H、7002H的高4位清零。例如:若(7000H)=34H,程序执行后,(7001H)=03H,(7002H)=04H。一般本程序用于把数据送显示缓冲区。,(2) 拼字:把7000H、7001H的低4位相拼后送入 7002H单元,即7002H单元的高4位为7000H的低4 位,7002H的
35、低4位为7001H的低4位。拼字与拆字的 过程恰好相反。一般本程序用于把显示缓冲区的数 据取出拼装成一个字节。 3.程序框图(如图4.10、图4.11所示),4实训步骤 (1) 连接并启动实验仪与PC机。运行DVCC 实验软件,编写源程序; (2) 按实训内容的要求,分别给相应单元预 置数; (3) 运行程序,检查相应单元的内容是否达 到实训内容的要求。 5. 参考源程序 (见后附) (1) 拆字程序 (2) 拼字程序 6. 编写实训报告,(1) 拆字程序 ORG 0050H CORD:MOV DPTR, #7000H MOVX A, DPTR MOV B, A SWAP A ANL A, #
36、0FH INC DPTR MOVX DPTR, A INC DPTR MOV A, B ANL A, #0FH MOVX DPTR, A SJMP $ END,拼字程序 ORG 0100H PORD:MOV DPTR, #7000H MOVX A, DPTR SWAP A ANL A, #0F0H MOV B, A INC DPTR MOVX A, DPTR, ANL A, #0FH ORL A, B INC DPTR MOVX DPTR, A SJMP $ END,实训4 .2 循环程序设计(流水灯) 1. 实训目的 掌握P1口的简单使用,及延时子程序的 编写和应用。 2. 实训内容 编写程
37、序,使P1口所接的8个发光二极管 逐个循环点亮,形成跑马灯。每个发光二极 管点亮时间约100200ms。,3. 实训连线 4. 实训步骤 (1) 连接并启动实验仪与PC机,按实验 连线要求进行连接;,P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7,L1 L2 L3 L4 L5 L6 L7 L8,(2) 运行DVCC实验软件,编写源程序; (3) 运行程序,查看实验仪发光二极管 L1L8的点亮次序。 5. 思考题 (1) 如要使流水灯的点亮次序相反,程序应 如何修改? (2) 假如要将流水灯的流动速度(每个发光二 极管点亮时间)升高或降低,应如何修改程序? 6. 编写实训报告,
38、附:流水灯参考源程序 ORG 0100H MOV A,#01H LOOP: MOV P1, A ;循环程序 LCALL DEY RL A SJMP LOOP DEY: MOV R7,#100 ; 100ms延时子程序 LP1: MOV R6,#50 DJNZ R6 $ DJNZ R7 LP1 RET END,实训4.3 代码转换程序设计与实现 1. 实训目的 (1)了解代码间转换原理。 (2)掌握代码转换程序的设计方法和技巧。 (3)掌握编写和运行子程序的方法。 (4)进一步实践程序的调试和运行。 2. 实训内容 (1)将任意一位16进制数的ASCII码转换为4位 二进制数。,图4.12 AS
39、CII码转成二进制数流程图,3. 转换流程图,4实训步骤 (1) 将任意一个0F的16进制ASCII码数转换为 4位二进制数,可参考以下步骤: 根据流程图4.12 编写程序,检查无误经汇编 后输入单片机内存。 在20H单元中送入一个数37H,即7的ASCII码。 执行上述程序,核对结果,若有问题,则用单 步运行或设置断点的方法反复调试程序,直到程序完 全正确。 在20H单元送入41H(A的ASCII码),重复第 步。,参考源程序:(设待转换数存于片内RAM20H单 元,转换结果存到B中。) ORG 0100H CRL C ;进位位清0 MOV A, 20H ;取待转换数 SUBB A, #30
40、H ;待转换数30H CJNE A, #0AH, M1 ;A 1010,转M1 M1: JC M2 ;C =1(A10)转M2 SUBB A, #07H ;(A 10),再减7H M2: MOV B, A ;存转换结果 RET,本章小结,1. 汇编语言的语句结构由4个部分组成:标号:操作码 (目的操作数),(源操作数);注释。其中标号是指令的符号地址;操作码表示指令的操作功能,它是汇编语言指令中唯一不可缺省的部分;操作数是参加操作的数据或数据地址;注释是指令功能的说明。在汇编语言指令中,除操作码之外,其它3个部分有时可缺省。,2.用汇编语言编写的源程序不能为单片机所接受,必须将其转换为由二进制代码组成的目标程序后才能被单片机识别和执行。完成汇编任务有手工汇编和机器汇编两种方法。了解手工汇编、计算偏移量及转移地址的方法有助于进一步理解汇编语言程序设计。,3.分析问题,确定算法或解题思路、画流程图、编写源程序,是程序设计中最关键的几步。其中确定设计方案,是程序设计的基础;采用由各种图形、符号及指向线来说明程序执行过程的流程图能充分表达程序的设计思路,可帮助设计程序、阅读程序和查找程序中的错误;用汇编语言指令实现流程图的每一个具体步骤,也即编写出具体的汇编语言源程序是能否充分发挥单片机各种优越功能的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大连东软信息学院《AutoCAD 平面图绘制》2025-2026学年第一学期期末试卷(A卷)
- 大连东软信息学院《Android 开发技术课程设计》2025-2026学年第一学期期末试卷(A卷)
- 上海科技大学《Android 系统及开发》2025-2026学年第一学期期末试卷(A卷)
- 上海科学技术职业学院《安全系统工程》2025-2026学年第一学期期末试卷(A卷)
- 精准农业与智能传感器技术
- 三亚市2025-2026学年高三考前热身化学试卷(含答案解析)
- 基于LEER模式下结直肠肿瘤“一病一品”全程管理方案
- 东北财经大学《软件工程》2025-2026学年第一学期期末试卷(A卷)
- 东北财经大学《解密睡眠》2025-2026学年第一学期期末试卷(A卷)
- 民间工艺品艺人复试考核试卷含答案
- 货物追加采购合同范例
- 入团考试团校考试题及答案
- TQGCML 3946-2024 柴油发电机组维护保养规范
- 2024购房按揭合同
- 2024广东省高考政治真题卷及答案
- DL∕T 1053-2017 电能质量技术监督规程
- CJ/T 125-2014 燃气用钢骨架聚乙烯塑料复合管及管件
- 统编版2024年新版七年级上册历史第二单元测试卷(含答案)
- 红十字志愿者培训讲义
- 教学课件-轴承及其画法课件讲解
- (高清版)JTST 206-1-2023 水运工程塑料排水板应用技术规程
评论
0/150
提交评论