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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
子程序名称:SQR 功能:通过查表求出平方值y=x2 入口参数:x存放在堆栈中 出口参数:求得的平方值y存放在堆栈中 占用资源:累加器A,数据指针DPTR SQR:MOV R0, SP; R0作为参数指针 DEC R0; 堆栈指针退回子程序调用前的地址 DEC R0; XCH A, @R0; 保护ACC,取出参数 MOV DPTR, #TABLE;DPTR←表首地址 MOVC A, @A+DPTR; 查表 XCH A, @R0; 查表结果放回堆栈中 RET TABLE: DB 0,1,4,9,16,25,36,49,64,81 (3)子程序调用中应注意的问题 由于子程序调用过程中,CPU自动使用了堆栈,因此,容易出现以下几种错误: a)忘记给堆栈指针SP赋栈底初值,堆栈初始化位置与第1组工作寄存器重合,如果以不同的方式使用了同一个内存区域,会导致程序乱套。 b)程序中的PUSH和POP没有配对使用,使RET指令执行时不能弹出正确的断点地址,造成返回错误。 c)堆栈设置太小,堆栈操作增长太大,使栈区与其它内存单元重合。 ORG 0000H ADDDUO:MOV R0, #20H; 循环初始化部分 MOV R1, #2AH; MOV R7, #03H; 循环次数 CLR C; LOOP:MOV A, @R0; 循环体部分 ADDC A, @R1; MOV @R0, A; INC R0; 修改指针变量 INC R1; DJNZ R7, LOOP; 循环控制部分 CLR A; 循环结束处理部分 ADDC A, #00H; MOV @R0, A; RET; END 返回 返回 例:把内部RAM中起始地址为DATA的数据串传送到外部RAM以BUFFER为首地址的区域,直到发现“$”字符的ASCⅡ码为止,同时规定数据串最大长度为32个字节。 解:(1)分析任务:数据传送;(2)算法:比较、控制转移 (3)程序结构:分支、循环(4)数据类型:多字节字符串 (5)RAM单元安排:内部RAM单元、外部RAM单元 (6)采用寄存器间接寻址方式(R0、R1或DPTR) (7)程序流程框图; ORG 0000H DATACS:MOV R0, #DATA; DATA数据区首地址 MOV DPTR, #BUFFER;BUFFER数据区首地址 MOV R1, #20H; 最大数据串长 LOOP:MOV A, @R0; 取数据 SUBB A, #24H; 判是否为“$”字符 JZ LOOP1; 是“$”字符,转结束 MOVX @DPTR,A; 数据传送 INC R0; INC DPTR; DJNZ R1, LOOP; 循环控制 LOOP1:RET; 结束 END 4.3 80C51单片机汇编语言程序设计举例 4.3.2 定时程序 在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程定时/计数器实现外,还可以使用软件程序(定时程序)完成。 定时程序是典型的循环程序,它是通过执行一个具有固定延迟时间的循环体来实现定时的。 (1)单循环定时程序 MOV R5, #TIME; LOOP: NOP; NOP; DJNZ R5, LOOP; 假设单片机晶振频率fosc=6MHz,则一个机器周期为2μs,NOP、DJNZ指令分别是单、双机器周期指令。定时程序的总延迟时间是循环程序段延时时间的整数倍,由于R5是8位寄存器,因此,这个定时程序的最长定时时间为:

文档评论(0)

niupai11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档