- 1、本文档共122页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【例 9】 设在内部 RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块, 试编一个求和程序, 并将和存入内部 RAM的 SUM单元(设和不超过 8 位)。 BLOCK EQU 20H LEN EQU 30H SUM EQU 40H START: CLR A ; 清累加器A MOV R2, #LEN ; 数据块长度送R2 MOV R1, #BLOCK ; 数据块首址送R1 LOOP: ADD A, @R1 ; 循环加法 INC R1 ; 修改地址指针 DJNZ R2, LOOP ; 修改计数器并判断 MOV SUM, A ; 存和 RET 【例10】求最小值。设内部RAM中有一无符号数数据块,其首地址为BLOCK,长度存于LEN单元,试求出数据块中的最小值,存入MIN单元。 分析:求最小值时,通常采用比较交换的方法。 即首先取第一个数作为基准,然后将基准数与第二个数进行比较,若基准数大于第二个数,则两数进行交换;若基准数小于第二个数则不进行交换,总之保证基准数单元中的值为最小值,再取下一个数与基准数进行比较,一直到所有数据比较完为止,则基准数单元中的数则为最小值。依此类推,求最大值也可采用类似方法。 具体程序编写如下: ORG 1000H MIN: DATA 20H LEN: DATA 21H BLOCK: DATA 22H MOV A, #0FFH MOV R2,LEN MOV R1,#BLOCK ;取数据块首地址 LOOP: CLR C ;清CY准备做减法 SUBB A,@R1 JC NEXT ;A<(R1),转NEXT MOV A,@R1 ;A>(R1),则A←(R1) SJMP NEXT1 NEXT: ADD A,@R1 ;A<(R1),恢复A NEXT1:INC R1 DJNZ R2,LOOP MOV MIN,A ;存最小值 HERE: SJMP HERE 【例11】设片内RAM中有一无符号数数据块,其首地址为BLOCK,长度未知,但数据结束标志存于LEN单元,求数据块的最小值并存于MIN单元中。 可以看出,这是一个循环次数未知的例题,通过设定特征值控制循环结束条件。 ORG 1000H MIN: DATA 20H LEN: DATA 21H BLOCK:DATA 22H MAIN: MOV R1,#BLOCK ;数表首地址 MOV B,@R1 ;取第一个数作为基准 NEXT: INC R1 ;修改指针 MOV A,@R1 CJNE A,LEN,NEXT1 ;是否为数表结尾? SJMP DONE ;循环结束 NEXT1: CJNE A,B,NEXT2 ;比较 NEXT2: JNC NEXT ;A>B,转NEXT继续取数 MOV B,A ;保存较小值 SJMP NEXT DONE: SJMP DONE 【例12】 在内部 RAM中从50H单元开始的连续单元依次存放了一串字符, 该字符串以回车符为结束标志, 要求测试该字符串的长度。 程序如下: START: MOV R2, #0FFH MOV R0, #4FH ; 数据指针R0置初值 LOOP: INC R0 INC R2 CJNE @R0, #0DH, LOOP RET (2) 多重循环 【例 13】 10 秒延时程序。 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 μs, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。10 秒延时程序如下: DE
文档评论(0)