80c51汇编语言程序案例指导,新第4章80C51的汇编语言程序设计

《新第4章80C51的汇编语言程序设计》由会员分享,可在线阅读,更多相关《新第4章80C51的汇编语言程序设计(36页珍藏版)》请在人人文库网上搜索。

1、2020/6/30,1,第4章 汇编语言程序设计,2020/6/30,2,单片机应用系统由硬件系统和应用程序构成,汇编语言 高级语言,应用程序设计方法,汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。,高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。,2020/6/30,3,4.1 程序编制的方法和技巧,4.1.1 汇编语言程序设计的步骤,分析问题,抽象出描述问题的数学模型。,确定解决问题的算法或解题思想。,分配存储空间和工作单元。,绘制流程图,编制程序。,程序调试和程序优化。,2020/6/30,4,绘制流程图,流程图符号,202。

2、0/6/30,5,强化模块化观念,使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容),程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便,4.1.2 编制程序的方法和技巧,采用循环和子程序结构,对中断子程序还有注意保护PSW的内容,2020/6/30,6,4.1.3 汇编语言的语句格式,非数字字符开头,后跟字母、数字、“-”、“?”等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”,标号(即符号地址),标号: 指令助记符 操作数1, 操作数2, 操作数3, ;注释,指令助记符,是指令功能。

3、的英文缩写。,2020/6/30,7,数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意AF开头时要加“0” ASCII码,如 A,1245 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成,操作数,注释,英文分号“;”开头,4.1.3 汇编语言的语句格式,2020/6/30,8,补充知识,2020/6/30,9,4.2.1 顺序结构程序设计,4.2 基本程序结构,【例4-1】试编制双字节加法程序。 题目要求:设被加数的高字节放在30H中,低字节放在31H中,加数的高字节放在32H,低字节放在33H中。加法结果的高字节放在34H中,低字节放在35H中(大端模式。

4、)。,程序分析:由于80C51单片机的加法指令只能处理8位二进制数,所以双字节加法程序的算法应首先从低字节开始相加,然后依次将次低字节和来自低字节相加的进位进行加法运算。,2020/6/30,10,ORG 0040H START:CLR C MOV A,31H ADD A,33H MOV 35H,A MOV A,30H ADDC A,32H MOV 34H,A SJMP $ END,2020/6/30,11,【例4-3】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。,2020/6/30,1。

5、2,ORG 0040H START:MOV A,21H ;取十位ASCII码 ANL A,#0FH ;保留低半字节 SWAP A ;移至高半字节 MOV 20H,A ;存于20H单元 MOV A,22H ;取个位ASCII码 ANL A,#0FH ;保留低半字节 ORL 20H,A ;合并到结果单元 SJMP $ END,2020/6/30,13,4.2.2 分支结构程序设计,在实际问题的编程处理中,通常会根据不同的条件进行判断,根据不同的判断结果,程序作出不同的相应处理,这种结构被称为分支。分支程序的设计主要依靠条件转移指令、比较转移指令和位转移指令来实现。,2020/6/30,14,该图使。

6、用条件转移指令来实现分支,当给出的条件成立时,执行程序段1,否则执行程序段2。,2020/6/30,15,该图使用条件转移指令来实现分支,当给出的条件成立时,执行程序段A,否则执行程序段B。,2020/6/30,16,该图使用散转指令JMP来实现多分支转移,它首先将分支程序按序号的值来实现分支转移。,2020/6/30,17,【例4-6】 编制计算符号函数y=SGN(x)的程序。 y= 设片内RAM的30H单元内有自变量x(-128x127)的值,编制程序求函数Y的值,并将其存入片内RAM的31H单元中。,2020/6/30,18,2020/6/30,19,ORG 1000H START:MO。

7、V A,30H ;将X送入A中 JZ ZERO ;为0转移 JNB ACC.7,POSITIVE ; 为正数转移 MOV A, #0FFH ; 将1(补码)送入A中 SJMP ZERO POSITIVE:MOV A, #01H ;将+1送入A中 ZERO:MOV 31H, A ; 结果存入Y END,2020/6/30,20,【补充例题】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y并送回原单元。,2020/6/30,21,ORG 0040H START:MOV A,30H。

8、 ;取x至累加器 JZ NEXT ;x = 0,转NEXT ANL A,#80H ;否,保留符号位 JZ DONE ;x 0,转结束 MOV A,#05H ;x 0处理 ADD A,30H MOV 30H,A ;X+05H送Y SJMP DONE NEXT:MOV 30H,#20H ;x = 0,20H送Y DONE:SJMP DONE END,2020/6/30,22,4.2.3 循环结构程序设计,2020/6/30,23,循环程序的组成大致包括以下内容: 1、循环初始化:位于循环程序开头,设置各工作单元的初始值,设定循环次数等。 2、循环体:循环体也称为循环处理部分,是循环程序的核心;用于。

9、完成实际操作处理,是重复的执行部分。 3、循环控制:位于循环体内,一般由循环次数修改、指针修改和条件控制等组成,用于控制循环次数循环参数。 4、循环结束:用于存放执行循环程序运行后的结果,以及恢复各工作单元的初值。,2020/6/30,24,【例4-8】将内部RAM的30H至3FH单元初始化为00H。,MAIN:MOV R0,#30H ;置初值 MOV A,#00H ; MOV R7,#16 ; LOOP:MOV R0,A ;循环处理 INC R0 ; DJNZ R7,LOOP ;循环修改,判结束 SJMP $ ;结束处理,2020/6/30,25,【例4-9】将内部RAM起始地址为60H的数。

10、据串传送到外部RAM中起始地址为1000H的存储区域,直到发现$ 字符停止传送。,MAIN:MOV R0,#60H ;置初值 MOV DPTR,#1000H LOOP0:MOV A,R0 ;取数据 CJNE A,#24H,LOOP1 ;循环结束? SJMP DONE ;是 LOOP1:MOVX DPTR,A ;循环处理 INC R0 ;循环修改 INC DPTR SJMP LOOP0 ;继续循环 DONE:SJMP DONE ;结束处理,2020/6/30,26,【例 4-12】 设80C51单片机的时钟频率为fosc =12 MHz,试设计0.1s的延时程序。 DELAY:MOV R3, #。

11、Data1 ;1个机器周期(T) DEL2:MOV R4, #Data2 ;1个机器周期(T) DEL1:NOP ;1个机器周期(T) NOP ;1个机器周期(T) DJNZ R4,DEL1 ;2个机器周期(T) DJNZ R3,DEL2 ;2个机器周期(T) RET 延时时间的计算结果: 1+1+(1+1+2)*Data2+2* Data1*机器周期(T) 若Datat1=125,Data2=200,则该程序产生的延时时间为:100376*机器周期(T)=0.100376s=0.1s,2020/6/30,27,4.3 子程序设计,完成通用功能、反复使用的程序设计成子程序。使应用程序结构清晰紧。

12、凑,便于阅读和调试,执行要由其它程序来调用,执行完后要返回到调用程序,结构上仍然采用一般程序的3种结构,调用时注意: 一是现场的保护和恢复; 二是主程序与子程序间的参数传递。,2020/6/30,28,4.3.1 子程序的调用与返回,2020/6/30,29,4.3.2 保存与恢复寄存器内容,PUSH PSW ;保护现场( 含当前工作寄存器组号) PUSH ACC ; PUSH B ; POP B ;恢复现场 POP ACC ; POP PSW ;含当前工作寄存器组切换,2020/6/30,30,4.3.3 子程序的参数传递,主程序在调用子程序时传送给子程序的参数和子程序结束后送回主程序的参数。

13、统称为参数传递。 入口参数:子程序运行时所需要的原始参数。在调用子程序前,必须将所需参数送到指定的存储单元(或寄存器)中,然后子程序从约定的存储单元(或寄存器)中获得这些入口参数。 出口参数:子程序根据入口参数执行程序后所得的结果。子程序运行结束(返回)前,必须将出口参数送到指定的存储单元(或寄存器)中,以便主程序从指定的存储单元(或寄存器)中获得运行结果。,2020/6/30,31,4.3.3 子程序的参数传递,利用累加器或寄存器(简单、快速,但参数个数不多),【例4-15】实现两个8位的十六进制无符号数求和的子程序。,SADD:MOV A,R3 ;取加数(在R3中) CLR C ADD A。

14、,R4 ;被加数(在R4中)加A JC PP1 MOV R3,#00H ;结果小于255时,高字节R3内容为00H SJMP PP2 PP1:MOV R3,#01H ;结果大于255时,高字节R3内容为01H PP2:MOV R4,A ;结果的低字节在R4中 RET,入口:(R3)=加数; (R4)=被加数。,出口:(R3)=和的高字节; (R4)=和的低字节。,2020/6/30,32,利用存储器(个数多,用R0或R1及DPTR为参数表指针),【例4-16】将内部RAM 中两个4字节无符号整数相加,和的高字节由R0指向。数据采用大端模式存储。,入口:(R0)=加数低字节地址; (R1)=被加。

15、数低字节地址。,出口:(R0)=和的高字节起始地址。,NADD:MOV R7,#4 ;字节数4送计数器 CLR C ; NADD1:MOV A,R0 ;利用指针,取加数低字节 ADDC A,R1 ;利用指针,被加数低字节加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 ;调整指针,指向出口 RET,2020/6/30,33,利用堆栈,【例4-17】将内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。,入口:预转换数据(低半字节)在栈顶,出口:转换结果(ASCII码)在栈顶,HEASC:MOV R1,S。

16、P ;借用R1为堆栈指针 DEC R1 DEC R1 ;R1指向被转换数据 XCH A,R1 ;取被转换数据 ANL A,#0FH ;取一位十六进制数 ADD A,#2 ;偏移调整,所加值为MOVC与DB间总字节数 MOVC A,A+PC ;查表 XCH A,R1 ;1字节指令,存结果于堆栈中 RET ;1字节指令 ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,2020/6/30,34,验证程序段,MAIN:MOV A,20H ; SWAP A PUSH ACC ;预转换的数据(在低半字。

17、节)入栈 ACALL HEASC POP ACC ;弹出栈顶结果于ACC中 MOV R0,A ;存转换结果高字节 INC R0 ;修改指针 PUSH 20H ;预转换的数据(在低半字节)入栈 ACALL HEASC POP ACC ;弹出栈顶结果于ACC中 MOV R0,A ;存转换结果低字节 SJMP $,2020/6/30,35,4.3.5 常用子程序(略),4.3.4 编写子程序时应注意的问题,简要说明子程序的功能、入口参数、出口参数、占用资源。 子程序的第一条指令必须有标号,以明确子程序的入口地址。 主程序调用子程序用LCALL、ACALL指令进行,返回使用RET。 为增强子程序的通用性,应尽量避免使用具体的内存单元。 在子程序的内部有转移指令时,最好使用相对转移指令。 在使用子程序时,要注意现场的保护,在退出时要恢复现场。,Thank You。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值