mcs51程序设计(编辑修改稿)内容摘要:

元的起始地址 MOV A, @R0 ;读出数送 A 暂存 MOV DPTR, 20xxH ;定外部存储器存数单元的起始地址 MOVX @DPTR, A ;送数到 20xxH 单元 MOV R7, 08 ;定送数的个数 LOOP: INC R0 ;取数单元加 1,指向下一个单元 INC DPTR ;存数单元加 1,指向下一个单元 MOV A, @R0 ;读出数送 A 暂存 MOVX @DPTR, A ;送数到新单元 DJNZ R7, LOOP ; 8 个送完了吗。 未完转到 LOOP 继续送 END 送完了顺序执 行,结束。 程序初步编好后,在仿真软件中调试,调试时先打开 Franklin 仿真软件的数据窗口( Data View),在窗口中的 40H 为起点的 8 个单元中任意送数,再打开 Franklin 仿真软件的外部数据窗口( Xdata View),首先全速运行程序,看所有数据是否传到 20xxH为起点的 8 个单元中,若不正确,再单步运行程序,看程序的每一步是否正确,若不正确,再反复修改,直到正确为止。 例 12: 将外部存储器以 20xxH 为起始地址的 8 个单元中的内容传到内部 RAM以 40H为起始地址的 8 个单元中。 仿照例 2 我们可写 出程序如下: ORG 0000H MOV DPTR, 20xxH ;定外部存储器取数单元的起始地址 MOVX A, @DPTR ;读出数送 A 暂存 MOV R0, 40H ;定内部 RAM 存数单元的起始地址 MOV @R0 , A ;送数到 40H 单元 MOV R7, 08 ;定送数的个数 LOOP: INC R0 ;取数单元加 1,指向下一个单元 INC DPTR ;存数单元加 1,指向下一个单元 MOV A, @DPTR ;读出数送 A 暂存 MOVX @R0, A ;送数到新单元 DJNZ R7, LOOP ; 8 个送完了吗。 未完转到 LOOP 继续送 END 送完了顺序执行,结束。 程序初步编好后,在仿真软件中调试,调试时先打开 Franklin 仿真软件的外部数据窗口( Xdata View),在外部数据 窗口( Xdata View)中的 20xxH 为起点的 8 个单元中任意送数,再打开 Franklin 仿真软件的内部数据窗口( Data View)。 首先全速运行程序,看所有数据是否传到 40H 为起点的 8 个单元中,若不正确,再单步运行程序,看程序的每一步是否正确,若不正确,再反复修改,直到正确为止,若正确说明此程序编好了。 例 13: 将外部存储器以 20xxH 为起始地址的 8 个单元中的内容传到外部存储器以4000H 为起始地址的 8 个单元中。 编程时可以沿用以上编程思路,但在循环时要将 DPTR 分成两个字节,即 DPH 和 DPL,只要 这样改动就可编程如下: ORG 0000H MOV R2, 00H ;定外部存储器取数单元的起始地址低字节 MOV R3, 20H ;定外部存储器取数单元的起始地址高字节 MOV R4, 00H ;定外部存储器存数单元的起始地址低字节 MOV R5, 40H ;定外部存储器存数单元的起始地址高字节 MOV R7, 08 ;定送数的个数 LOOP: MOV DPL, R2 MOV DPH, R3 MOV A, @DPTR ;读出 20xx 单元的数送 A 暂存 MOV DPL, R4 MOV DPH, R5 MOVX @DPTR, A ;送数到 4000H 单元 INC R2 ;取数单元加 1,指向下一个单元 INC R4 ;存数单元加 1,指向下一个单元 DJNZ R7, LOOP ; 8 个送完了吗。 未完转到 LOOP 继续送 END 送完了顺序执行,结束。 程序初步编好后,在仿真软件中调试,调试时先打开 Franklin 仿真软件的外部数据窗口( Xdata View),在外部数据窗口( Xdata View)中的 20xxH 为起点的 8 个单元中任意送数,再又打开一个 Franklin 仿真软件的外部数据窗口( Xdata View)。 首先全速运行程序,看所有数据是否传到 4000H 为起点的 8 个单元中,若不正确,再单步运行程序,看程序的每一步是否正确,若不正确,再反复修改,直到正确为止。 此程序传数的最大个数为 FFH 即 256 个,超过此数该程序就有问题,该问题出在高字节不能改变,要使高字节也能变,程序要作如下变动: ORG 0000H MOV R2, 00H ;定外部存储器取数单元的起始地址低字节 MOV R3, 20H ;定外部存储器取数单元的起始地址高字节 MOV R4, 00H ;定外部存储器存数单元的起始地址低字节 MOV R5, 40H ;定外部存储器存数单元的起始地址高字节 MOV R6, 08H ;定送数的个数低字 节 MOV R7, 04H ;定送数的个数高字节 MOV A, R7 JZ LOP2 JNZ LOP ;以上三句是判一下 R7 高字节是否为 0 LOP1: MOV DPL, R2 MOV DPH, R3 MOV A, @DPTR ;读出 20xx 单元的数送 A 暂存 INC DPTR ;取数单元加 1,指向下一个单元 MOV R2, DPL MOV R3, DPH ;新地址送 R R3,为送下一个作准备 MOV DPL, R4 MOV DPH, R5 MOVX @DPTR, A ;送数到 4000H 单元 INC DPTR ;存数单元加 1,指向下一个单元 MOV R4, DPL MOV R5, DPH ;新地址送 R R5,为送下一个作准备 LOP: DJNZ R7, LOP1 ;高字节送完了吗。 未完转到 LOP1 继续送 LOP2: DJNZ R6, LOP1 ;未完接着转去送低字节,完了顺序执行, END ;结束程序。 象这样的小程序很有用的,一般将它编写成通用的子程序: MOVE: MOV DPL, R2 MOV DPH, R3 MOVX A, @DPTR MOV DPL, R4 MOV DPH, R5 MOVX A, @DPTR CJNE R2, 0FFH, MOV1 INC R3 MOV1: INC R2 CJNE R2, 0FFH, MOV2 INC R5 MOV2: INC R4 CJNE R6, 00H, MOV3 CJNE R7, 00H, MOV4 MOV3: DEC R6 SJMP MOVE MOV4: DEC R6 DEC R7 SJMP MOVE RET 程 序中 R R3 定数据块的首地址, R R5 定数据块目标地址, R6 为传送多少个数的低字节, R7 为传送多少个数的高字节,使用此子程序时只要将这 6 个数送入,调用此程序就行。 此章讲的所有程序都应在 Franklin 仿真软件中调试,调试是研究程序、读懂程序、学习编写程序的过程。 多重循环程序 如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,这种程序称为多重循环程序。 例 14: 10 秒延时程序 延时程序与 MCS51 执行指令的时间有关,如果使用 6MHz 晶振,一个机器周期为2μ s,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。 程序如下: DEL: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 ; 248*+4 DJNZ R6, DEL1 ;( 248*2+4) *200+4 DJNZ R5, DEL0 ;( 248*+4) *200+4) *100+4 RET 上例延时程序实际延时为 秒。 它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。 使用多重循环程序时,必须注意以下几点: ( 1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。 ( 2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。 ( 3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。 据以上程序可编出多重循环程序,也可 编出一(单)重循环程序 LOOP: MOV R7, 0FFH LOP1: DJNZ R7, LOP1 RET 也可编出两重循环程序为: DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 RET 例 15 冒泡程序 设有 N 个数,它们依次存放于 LIST 地址开始的存储 区域中,将 N 个数比较大小后,使它们按由小到大(或由大到小)的次序排列,存放在原存储区域中。 编制该程序的方法:依次将相邻两个单元的内容作比较,即第一个数和第二个数比较,第二个数和第三个数比较„„,如果符合从小到大的顺序则不改变它们在内存中的位置,否则交换它们之间的位置。 如此反复比较,直至数列排序完成为止。 由于在比较过程中将小数(或大数)向上冒,因此这种算法称为“冒泡法”或称排序法,它是通过一轮一轮的比较, 第一轮经过六次两两比较后,得到一个最大数。 第二轮经过五次两两比较后,得到次大数。 每 轮比较后得到本轮最大数(或最小数),该数就不再参加下一轮的两两比较,故进入下一轮时,两两比较次数减 1。 为了加快数据排序速度,程序中设置一个标志位,只要在比较过程中两数之间没有发生过交换,就表示数列已按大小顺序排列了。 可以结束比较。 设数列首地址在 R0 寄存器中, R2 为外循环次数计数器, R3 为内循环次数计数器,R1 为交换标志。 程序如下: ORG 8000H MOV R2, CNT1 ;数列个数 1 LOOP1: MOV A, R2 ;外循环计数值 MOV R3, A ;内循环计数值 MOV R1, 01 ;交换标志置 1 LOOP2: MOV A, @R0 ;取数据 MOV B, A ;暂存 B INC R0 CLR C SUBB A,。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。