第4章 MCS-51系列单片机的程序设计

上传人:人*** 文档编号:568842920 上传时间:2024-07-27 格式:PPT 页数:60 大小:966.50KB
返回 下载 相关 举报
第4章 MCS-51系列单片机的程序设计_第1页
第1页 / 共60页
第4章 MCS-51系列单片机的程序设计_第2页
第2页 / 共60页
第4章 MCS-51系列单片机的程序设计_第3页
第3页 / 共60页
第4章 MCS-51系列单片机的程序设计_第4页
第4页 / 共60页
第4章 MCS-51系列单片机的程序设计_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《第4章 MCS-51系列单片机的程序设计》由会员分享,可在线阅读,更多相关《第4章 MCS-51系列单片机的程序设计(60页珍藏版)》请在金锄头文库上搜索。

1、MCS-51系列单片机的程序设计第四章 交叉汇编语言交叉汇编语言MASM51MASM51 单片机汇编语言程序设计方法及技巧单片机汇编语言程序设计方法及技巧 本章内容本章内容本章内容本章内容了解交叉汇编语言了解交叉汇编语言MASM51MASM51的特点的特点掌握掌握顺序程序、分支程序、循环程顺序程序、分支程序、循环程序、查表程序、子程序的基本设计序、查表程序、子程序的基本设计方法和技巧方法和技巧学习目的学习目的学习目的学习目的掌握汇编语言程序设计的一般步骤掌握汇编语言程序设计的一般步骤4.1 交叉汇编语言交叉汇编语言MASM51 汇编语言源程序是由汇编指令和伪指令组成汇编语言源程序是由汇编指令和

2、伪指令组成汇编语言源程序是由汇编指令和伪指令组成汇编语言源程序是由汇编指令和伪指令组成的文件,其扩展名为的文件,其扩展名为的文件,其扩展名为的文件,其扩展名为“ “ASM”ASM”。 源程序编辑完后只有转换为机器码表示的源程序编辑完后只有转换为机器码表示的源程序编辑完后只有转换为机器码表示的源程序编辑完后只有转换为机器码表示的目标程序计算机才能执行,这个转换的过程称目标程序计算机才能执行,这个转换的过程称目标程序计算机才能执行,这个转换的过程称目标程序计算机才能执行,这个转换的过程称为为为为汇编汇编汇编汇编。 1)1)人工汇编人工汇编人工汇编人工汇编 人工汇编是通过人工查出源程序中所人工汇编是

3、通过人工查出源程序中所人工汇编是通过人工查出源程序中所人工汇编是通过人工查出源程序中所有汇编指令的机器码,并依次将机器码输有汇编指令的机器码,并依次将机器码输有汇编指令的机器码,并依次将机器码输有汇编指令的机器码,并依次将机器码输入单片机中,使之成为单片机能直接执行入单片机中,使之成为单片机能直接执行入单片机中,使之成为单片机能直接执行入单片机中,使之成为单片机能直接执行的目标程序。的目标程序。的目标程序。的目标程序。 2)2)机器汇编机器汇编机器汇编机器汇编 机器汇编是指在计算机上通过汇机器汇编是指在计算机上通过汇机器汇编是指在计算机上通过汇机器汇编是指在计算机上通过汇编程序对源程序进行汇编

4、,即从源程编程序对源程序进行汇编,即从源程编程序对源程序进行汇编,即从源程编程序对源程序进行汇编,即从源程序到目标程序的转换过程是由计算机序到目标程序的转换过程是由计算机序到目标程序的转换过程是由计算机序到目标程序的转换过程是由计算机上的汇编程序自动完成的。上的汇编程序自动完成的。上的汇编程序自动完成的。上的汇编程序自动完成的。3)3)交叉汇编交叉汇编交叉汇编交叉汇编 是指用一种计算机上的汇编程序去是指用一种计算机上的汇编程序去是指用一种计算机上的汇编程序去是指用一种计算机上的汇编程序去汇编另一种计算机的源程序,为另一种汇编另一种计算机的源程序,为另一种汇编另一种计算机的源程序,为另一种汇编另

5、一种计算机的源程序,为另一种计算机产生目标程序。计算机产生目标程序。计算机产生目标程序。计算机产生目标程序。单片机单片机单片机单片机MCS-51MCS-51汇编语言程序设计步骤:汇编语言程序设计步骤:汇编语言程序设计步骤:汇编语言程序设计步骤: 1 1 分析问题分析问题分析问题分析问题 2 2 确定算法确定算法确定算法确定算法 3 3 设计程序流程图设计程序流程图设计程序流程图设计程序流程图 4 4 分配内存单元分配内存单元分配内存单元分配内存单元 5 5 编写汇编语言源程序编写汇编语言源程序编写汇编语言源程序编写汇编语言源程序 6 6 调试程序调试程序调试程序调试程序4.2 程序设计方法及技

6、巧程序设计方法及技巧4.2.1 4.2.1 顺序程序设计顺序程序设计顺序程序设计顺序程序设计例4.1 请用MCS-51汇编指令编写程序,将片内RAM104、105单元中的内容分别传送到片外数据存储器 104H、105H单元中。分析:应注意片内和片外的寻址指令不同分析:应注意片内和片外的寻址指令不同 ORG 1000H ORG 1000HMOV R0 MOV R0 ,#68H#68HMOV A MOV A ,R0 R0 ; ; 片内片内片内片内RAM104RAM104单元内容送累加器单元内容送累加器单元内容送累加器单元内容送累加器MOV DPTR MOV DPTR ,#0104H#0104HMO

7、VX DPTR MOVX DPTR ,A A ; ; 完成片内完成片内完成片内完成片内RAM104RAM104单元内容送片单元内容送片单元内容送片单元内容送片 ; ; 外外外外104H104H单元中单元中单元中单元中INC R0INC R0MOV A MOV A ,R0 R0 ; ; 片内片内片内片内RAM105RAM105单元内容送累加器单元内容送累加器单元内容送累加器单元内容送累加器INC DPTRINC DPTRMOVX DPTR MOVX DPTR ,A A ; ; 完成片内完成片内完成片内完成片内RAM105RAM105单元内容送片单元内容送片单元内容送片单元内容送片 ; ; 外外外

8、外105H105H单元中单元中单元中单元中SJMP $ SJMP $ END END 1. 1. 简单分支程序简单分支程序简单分支程序简单分支程序YN 顺序执行条件满足?转向目标程序4.2.4.2.2 2 分支程序设计分支程序设计分支程序设计分支程序设计图4.1 简单分支程序转移分析:只要将两数进行比较,用比较的结果作为分分析:只要将两数进行比较,用比较的结果作为分分析:只要将两数进行比较,用比较的结果作为分分析:只要将两数进行比较,用比较的结果作为分支转移的条件就很容易地找出其中的大数。支转移的条件就很容易地找出其中的大数。支转移的条件就很容易地找出其中的大数。支转移的条件就很容易地找出其中

9、的大数。 已知片内已知片内已知片内已知片内RAM FIRST RAM FIRST 开始的两个单元中各开始的两个单元中各开始的两个单元中各开始的两个单元中各存放有一个存放有一个存放有一个存放有一个8 8位无符号二进制数,要求找出其中的位无符号二进制数,要求找出其中的位无符号二进制数,要求找出其中的位无符号二进制数,要求找出其中的大数并存入片内大数并存入片内大数并存入片内大数并存入片内RAMRAM的的的的SECONDSECOND单元中。单元中。单元中。单元中。例例 4.2 ORG 1000HORG 1000HCLR CCLR CMOV R0 , #FIRSTMOV R0 , #FIRST ; ;第

10、一个数地址送第一个数地址送第一个数地址送第一个数地址送R0R0中中中中MOV A , R0 MOV A , R0 ; ;取第一个数取第一个数取第一个数取第一个数INC R0 INC R0 ;R0 ;R0指向第二个数地址指向第二个数地址指向第二个数地址指向第二个数地址SUBB A , R0 SUBB A , R0 ; ;两数比较两数比较两数比较两数比较JC BIG JC BIG ; ;第二个数大转第二个数大转第二个数大转第二个数大转BIGBIGDEC R0 DEC R0 ;R0 ;R0指向第一个数地址指向第一个数地址指向第一个数地址指向第一个数地址BIG:BIG:MOV SECOND , R0

11、;MOV SECOND , R0 ;存大数存大数存大数存大数SJMP $SJMP $ENDEND参考程序参考程序参考程序参考程序2 2)多路分支程序(散转程序)多路分支程序(散转程序)多路分支程序(散转程序)多路分支程序(散转程序)K=n K=n-1 K=2 转向分支n-1 转向分支2 转向分支1 转向分支n K=? K=1 图图图图4.2 4.2 多路分支程序转移多路分支程序转移多路分支程序转移多路分支程序转移1 1)把)把)把)把AJMPAJMP或或或或LJMPLJMP指令组成一个分支程序的指令组成一个分支程序的指令组成一个分支程序的指令组成一个分支程序的 转移表,表的首地址放入转移表,表

12、的首地址放入转移表,表的首地址放入转移表,表的首地址放入DPTRDPTR中;中;中;中;2 2)调整后的出口信息放入累加器)调整后的出口信息放入累加器)调整后的出口信息放入累加器)调整后的出口信息放入累加器A A中;中;中;中;3 3)执行)执行)执行)执行JMP A+DPTRJMP A+DPTR转向对应的分支程序。转向对应的分支程序。转向对应的分支程序。转向对应的分支程序。 可通过间接转移指令可通过间接转移指令可通过间接转移指令可通过间接转移指令JMP A+DPTRJMP A+DPTR和和和和无条件转移指令中的无条件转移指令中的无条件转移指令中的无条件转移指令中的AJMPAJMP或或或或LJ

13、MPLJMP指令来实现指令来实现指令来实现指令来实现多路分支转移:多路分支转移:多路分支转移:多路分支转移:例例 4.3 已知已知已知已知R0R0中存放有一数字关键码,要求根据中存放有一数字关键码,要求根据中存放有一数字关键码,要求根据中存放有一数字关键码,要求根据码值的不同,分别转向对应的码值程序段去执码值的不同,分别转向对应的码值程序段去执码值的不同,分别转向对应的码值程序段去执码值的不同,分别转向对应的码值程序段去执行。即当行。即当行。即当行。即当R0=KR0=K时,便执行时,便执行时,便执行时,便执行CODEKCODEK程序。程序。程序。程序。 ORG 1000HORG 1000H M

14、OV DPTR MOV DPTR ,#TAB #TAB ; ;表首址送表首址送表首址送表首址送DPTRDPTR MOV A MOV A ,R0 R0 ; ;取数字关键码取数字关键码取数字关键码取数字关键码 ADD A ADD A ,R0 R0 ; ;每条每条每条每条AJMPAJMP指令占用两个字指令占用两个字指令占用两个字指令占用两个字; ;节,将节,将节,将节,将关键码关键码关键码关键码乘以乘以乘以乘以2 2 JNC LESS JNC LESS ; ;关键码小于关键码小于关键码小于关键码小于128128转转转转LESSLESS INC DPH INC DPH LESS: JMP A+DPTR

15、LESS: JMP A+DPTR TAB: AJMP CODE0 TAB: AJMP CODE0 ; ;关键码为关键码为关键码为关键码为0 0,转,转,转,转CODE0CODE0执行执行执行执行 AJMP CODE1 AJMP CODE1 ; ;关键码为关键码为关键码为关键码为1 1,转,转,转,转CODE1CODE1执行执行执行执行 AJMP CODE255 AJMP CODE255 ; ;关键码为关键码为关键码为关键码为255255,转,转,转,转CODE255CODE255; ;执行执行执行执行 AJMPAJMP指令的转移范围不超出所在的指令的转移范围不超出所在的指令的转移范围不超出所在

16、的指令的转移范围不超出所在的2KB2KB字节区间,如各小段程序较长,在字节区间,如各小段程序较长,在字节区间,如各小段程序较长,在字节区间,如各小段程序较长,在2KB2KB字节内无法全部容纳,上面的程序应该怎样字节内无法全部容纳,上面的程序应该怎样字节内无法全部容纳,上面的程序应该怎样字节内无法全部容纳,上面的程序应该怎样修改?修改?修改?修改?思考思考1)1)循环初始化循环初始化循环初始化循环初始化 设置循环的初始状态,位于循环程序的开设置循环的初始状态,位于循环程序的开设置循环的初始状态,位于循环程序的开设置循环的初始状态,位于循环程序的开头位置头位置头位置头位置2)2)循环处理循环处理循

17、环处理循环处理 循环程序的主体部分,是通过反复执行来循环程序的主体部分,是通过反复执行来循环程序的主体部分,是通过反复执行来循环程序的主体部分,是通过反复执行来完成数据的具体处理,它位于循环体内。完成数据的具体处理,它位于循环体内。完成数据的具体处理,它位于循环体内。完成数据的具体处理,它位于循环体内。4.2.4.2.3 3 循环程序设计循环程序设计循环程序设计循环程序设计循环程序由循环程序由4部分组成:部分组成:3)3)循环控制循环控制循环控制循环控制 也在循环体内,是用于控制循环的继续也在循环体内,是用于控制循环的继续也在循环体内,是用于控制循环的继续也在循环体内,是用于控制循环的继续与否

18、。与否。与否。与否。4)4)循环结束循环结束循环结束循环结束 通常位于循环体后,是用来存放循环处通常位于循环体后,是用来存放循环处通常位于循环体后,是用来存放循环处通常位于循环体后,是用来存放循环处理的最终结果及恢复各寄存器与工作单元的理的最终结果及恢复各寄存器与工作单元的理的最终结果及恢复各寄存器与工作单元的理的最终结果及恢复各寄存器与工作单元的原始值。原始值。原始值。原始值。 设设设设MCS-51MCS-51单片机内部单片机内部单片机内部单片机内部RAMRAM从从从从4040HH开始的连开始的连开始的连开始的连续续续续1616个单元中,每个单元中分别存放有单字节个单元中,每个单元中分别存放

19、有单字节个单元中,每个单元中分别存放有单字节个单元中,每个单元中分别存放有单字节的带符号数。要求将其中的正数存入的带符号数。要求将其中的正数存入的带符号数。要求将其中的正数存入的带符号数。要求将其中的正数存入5050HH开始的开始的开始的开始的连续单元中,负数存入连续单元中,负数存入连续单元中,负数存入连续单元中,负数存入6060HH开始的连续单元中,开始的连续单元中,开始的连续单元中,开始的连续单元中,并将正数、负数和零的个数分别存入并将正数、负数和零的个数分别存入并将正数、负数和零的个数分别存入并将正数、负数和零的个数分别存入7070HH、71H71H、72H72H单元中。单元中。单元中。

20、单元中。例例 4.41 1)带符号数的最高位为符号位,可通过)带符号数的最高位为符号位,可通过)带符号数的最高位为符号位,可通过)带符号数的最高位为符号位,可通过最高位来判断正负。最高位来判断正负。最高位来判断正负。最高位来判断正负。 2 2)程序中需要分别从)程序中需要分别从)程序中需要分别从)程序中需要分别从40H40H、50H 50H 和和和和60H60H单单单单 元开始取源数、存放正数和负数,故需要三元开始取源数、存放正数和负数,故需要三元开始取源数、存放正数和负数,故需要三元开始取源数、存放正数和负数,故需要三个地址指针来指向对应的内存单元;设对应个地址指针来指向对应的内存单元;设对

21、应个地址指针来指向对应的内存单元;设对应个地址指针来指向对应的内存单元;设对应的地址指针分别为的地址指针分别为的地址指针分别为的地址指针分别为R0R0、R1R1和和和和R2R2,由于由于由于由于R2R2不不不不能用间接寻址方式,故能用间接寻址方式,故能用间接寻址方式,故能用间接寻址方式,故R2R2需要同需要同需要同需要同R1R1或或或或R0R0进行进行进行进行交换后,才能进行负数的存放。交换后,才能进行负数的存放。交换后,才能进行负数的存放。交换后,才能进行负数的存放。 分析分析分析分析图图图图4.3 4.3 程序流程图程序流程图程序流程图程序流程图参考程序:参考程序:参考程序:参考程序: O

22、RG 1000HORG 1000H CLR A CLR A MOV 70H , A MOV 70H , A ; ; 存放正数的个数单元清存放正数的个数单元清存放正数的个数单元清存放正数的个数单元清0 0 MOV 71H , A MOV 71H , A ; ; 存放负数的个数单元清存放负数的个数单元清存放负数的个数单元清存放负数的个数单元清0 0 MOV 72H , A MOV 72H , A ; ; 存放零的个数单元清存放零的个数单元清存放零的个数单元清存放零的个数单元清0 0 MOV R3 , #10H MOV R3 , #10H ; ; 设循环计数器初值设循环计数器初值设循环计数器初值设循

23、环计数器初值 MOV R0 , #40H MOV R0 , #40H ; ;设源数地址指针设源数地址指针设源数地址指针设源数地址指针 MOV R1 , #50H MOV R1 , #50H ; ;设正数地址指针设正数地址指针设正数地址指针设正数地址指针 MOV R2 , #60H MOV R2 , #60H ; ;设负数地址指针设负数地址指针设负数地址指针设负数地址指针LOOP:MOV A , R0 LOOP:MOV A , R0 ; ; 取源数取源数取源数取源数 JZJZ ZERO ZERO ; ; 源数为源数为源数为源数为0 0,转,转,转,转ZER0ZER0 JNB ACC.7 , JN

24、B ACC.7 , POSI POSI ; ; 源数为正,转源数为正,转源数为正,转源数为正,转POSIPOSI INC 71H INC 71H ; ; 负数个数加负数个数加负数个数加负数个数加1 1 MOV R4 , A MOV R4 , A ; ; 暂存暂存暂存暂存源源数数数数 MOV A , R2 MOV A , R2 XCH A , R1 XCH A , R1 ; R1; R1与与与与R2R2中的内容交换中的内容交换中的内容交换中的内容交换 XCH A , R4XCH A , R4 MOV R1 , A MOV R1 , A ; ;存负数存负数存负数存负数 XCH A , R4XCH

25、A , R4 XCH A , R1 XCH A , R1 ; R1 ; R1与与与与R2R2中的内容交换中的内容交换中的内容交换中的内容交换 INC R2 INC R2 ; ;调整负数地址指针调整负数地址指针调整负数地址指针调整负数地址指针 SJMPSJMP LOOP1 LOOP1 ; ; 转循坏控制转循坏控制转循坏控制转循坏控制POSI: INC 70HPOSI: INC 70H; ;正数个数加正数个数加正数个数加正数个数加1 1 MOV R1 , A MOV R1 , A ; ;存正数存正数存正数存正数 INC R1 INC R1 ; ;调整正数地址指针调整正数地址指针调整正数地址指针调整

26、正数地址指针 SJMP LOOP1SJMP LOOP1ZERO: INC 72H ZERO: INC 72H ; ;零的个数加零的个数加零的个数加零的个数加1 1LOOP1:INC R0 LOOP1:INC R0 ; ;调整源数地调整源数地调整源数地调整源数地址指针址指针址指针址指针 DJNZ R3 , LOOP DJNZ R3 , LOOP ; ;未送完,继续未送完,继续未送完,继续未送完,继续 SJMP $ SJMP $ END END 查表指令有:查表指令有: MOVC A,A+DPTR MOVC A,A+PC 查表就是把事先计算或测得的数据按照一查表就是把事先计算或测得的数据按照一查表

27、就是把事先计算或测得的数据按照一查表就是把事先计算或测得的数据按照一定的顺序编制成表格存放在存储器中,然后根定的顺序编制成表格存放在存储器中,然后根定的顺序编制成表格存放在存储器中,然后根定的顺序编制成表格存放在存储器中,然后根据输入的数据,从表格中查出所需的结果。据输入的数据,从表格中查出所需的结果。据输入的数据,从表格中查出所需的结果。据输入的数据,从表格中查出所需的结果。4.2.4.2.4 4 查表程序设计查表程序设计查表程序设计查表程序设计 片内片内RAMRAM的的EGAEGA单元中有一个大写单元中有一个大写的的英文字母英文字母,要求将此字母在英文字母,要求将此字母在英文字母表中的位置

28、送入片内的表中的位置送入片内的COUNTCOUNT单元中,单元中,如如EGAEGA单元中字母为单元中字母为I I时,则时,则COUNTCOUNT单元单元中需送入数字中需送入数字9 9。 例例 4.6如果将如果将2626个英文字母按照顺序编成个英文字母按照顺序编成一个表,通过查表法得到一个字母一个表,通过查表法得到一个字母与与EGAEGA单元中的字母比较,若不相单元中的字母比较,若不相等再查,同时记录查表的次数。查等再查,同时记录查表的次数。查完后,将记录次数送完后,将记录次数送COUNTCOUNT单元。单元。分析分析 ORG 1000HORG 1000HEGA EQU 50HEGA EQU 5

29、0HCOUNT EQU 60HCOUNT EQU 60H MOV COUNT MOV COUNT,#00H#00H MOV A , #16 MOV A , #16 ; ;调整地址调整地址调整地址调整地址LOOP: PUSH A LOOP: PUSH A MOVC A , A+PC ; MOVC A , A+PC ;查表查表查表查表 CJNZ A , EGA , NF CJNZ A , EGA , NF ; ;所查字母与所查字母与所查字母与所查字母与EGAEGA中字中字中字中字母比较母比较母比较母比较 SJMP LAST SJMP LAST ; ;相等则转到相等则转到相等则转到相等则转到LAST

30、LASTNF: POP ANF: POP A INC A INC A ; ;调整地址调整地址调整地址调整地址 INC COUNT INC COUNT ; ;记数值加记数值加记数值加记数值加1 1 SJMP LOOP SJMP LOOP ; ;继续查继续查继续查继续查LAST: INC COUNT LAST: INC COUNT ; ;记数值加记数值加记数值加记数值加1 1 SJMP $ SJMP $ ; ;等待等待等待等待ALPT: DBA,B,YALPT: DBA,B,Y, ZZ 求求求求y= n! (n=0,1,9)y= n! (n=0,1,9),已知已知已知已知n n的值在的值在的值在的

31、值在片内片内片内片内RAMRAM的的的的NUMNUM单元中,求得的单元中,求得的单元中,求得的单元中,求得的y y 值值值值用用用用BCDBCD码表示且存放到片内码表示且存放到片内码表示且存放到片内码表示且存放到片内GETYGETY开始开始开始开始的单元中。的单元中。的单元中。的单元中。 例例 4.6 分析:分析:可将函数值列成表,采用查表法求可将函数值列成表,采用查表法求可将函数值列成表,采用查表法求可将函数值列成表,采用查表法求y= n!y= n! 当当当当n= 9n= 9时,时,时,时,y= 362880Hy= 362880H,需要三个单元存放结需要三个单元存放结需要三个单元存放结需要三

32、个单元存放结果。设每个果。设每个果。设每个果。设每个n n对应的对应的对应的对应的y y值都用值都用值都用值都用3 3个单元来存放,则个单元来存放,则个单元来存放,则个单元来存放,则y y值在值在值在值在表格中的首地址的计算公式为:表格中的首地址的计算公式为:表格中的首地址的计算公式为:表格中的首地址的计算公式为: y y地址地址地址地址= =函数表首址函数表首址函数表首址函数表首址+ n*3+ n*3参考程序参考程序参考程序参考程序 ORG 1000HORG 1000HNUM EQU 50HNUM EQU 50HGETY EQU 60HGETY EQU 60H MOV R1 MOV R1,#

33、03H#03H MOV R0 MOV R0,#GETY#GETY MOV A MOV A ,NUM ; NUM ; 取取取取n n值值值值 MOV B MOV B ,#03H#03H MUL AB ; n*3 MUL AB ; n*3 MOV R2 MOV R2 ,A ; A ; 暂存暂存暂存暂存 MOV DPTR MOV DPTR ,#TAB ; #TAB ; 表的首地址送表的首地址送表的首地址送表的首地址送DPTRDPTR中中中中LOOP: MOVC A ,A+DPTR ;查表 MOV R0 , A ;存结果 INC R0 ;调整存放结果地址指针 INC DPTR ;修正表地址指针 MOV

34、 A , R2 ;恢复n*3 DJNZ R1 , LOOP ;未查完,继续 SJMP $ TAB: DB 01H , 00H , 00H , 01H , 00H , 00H DB 02H , 00H , 00H , 06H , 00H , 00H DB 24H , 00H , 00H , 20H , 01H , 00H DB 20H , 07H , 00H , 40H , 50H , 00H DB 20H , 03H , 04H , 80H , 28H , 36H编写子程序时应注意:编写子程序时应注意:编写子程序时应注意:编写子程序时应注意:a.子程序的第一条指令之前必须有标号;子程序的第一条

35、指令之前必须有标号;b.子程序中需要保护现场;子程序中需要保护现场;c.主程序和子程序之间的参数传递。主程序和子程序之间的参数传递。4.2.4.2.5 5 子程序设计子程序设计子程序设计子程序设计1) 数码转换子程序数码转换子程序 已知已知已知已知R0R0的低半个字节为一个四位的低半个字节为一个四位的低半个字节为一个四位的低半个字节为一个四位的二进制数,要求将其转换为的二进制数,要求将其转换为的二进制数,要求将其转换为的二进制数,要求将其转换为ASCAIIASCAII码后送回码后送回码后送回码后送回R0R0中。中。中。中。例4.7 二进制码转换为ASCII码 二进制数与二进制数与ASCII码的

36、对应关系码的对应关系: 四位二进制四位二进制 ASCII 0000 (0) 30H 0001 (1) 31H 1001 (9) 39H 1010 (A) 41H 1111 (F) 46H ORG 1000ORG 1000BTOASC: BTOASC: PUSH A PUSH A PUSH PSW PUSH PSW MOV A , R0MOV A , R0 ANL A , #0FH ANL A , #0FH ; ;取四位二进制数取四位二进制数取四位二进制数取四位二进制数 MOV R0 , A MOV R0 , A ; ;暂存暂存暂存暂存 CLR CCLR C SUBB A , #0AH SUBB

37、 A , #0AH ; ;与与与与1010比较比较比较比较 MOV A , R0 MOV A , R0 ; ;恢复四位二进制数恢复四位二进制数恢复四位二进制数恢复四位二进制数 JC LOOP JC LOOP ; ;小于小于小于小于1010转转转转LOOPLOOP ADD A , #07H ADD A , #07H ; ;大于大于大于大于1010先加先加先加先加07H07HLOOP: LOOP: ADD A , #30H ADD A , #30H ; ;加加加加30H30H MOV R0 , A MOV R0 , A ; ;存结果存结果存结果存结果 POP PSW POP PSW POP A P

38、OP A RET RET 已知片内已知片内BLOCKBBLOCKB单元开始处有一数据块,单元开始处有一数据块,块长在块长在R2R2中,在此数据块的每个单元中存放有一中,在此数据块的每个单元中存放有一个未组合的个未组合的BCDBCD码,要求将每个码,要求将每个BCDBCD码转换为码转换为ASCAIIASCAII码,并存放在片内码,并存放在片内BLOCKABLOCKA开始的连续单开始的连续单元中。元中。例例4.8 BCD码转换为码转换为ASCAII码码 主程序:主程序:主程序:主程序: ORG 1000HORG 1000H MOV R2 MOV R2 ,#L#L MOV R0 MOV R0 ,#B

39、LOCKB#BLOCKB ; ;设设设设BCDBCD码的地址指针码的地址指针码的地址指针码的地址指针 MOV R1 MOV R1 ,#BLOCKA#BLOCKA ; ;设设设设ASCAIIASCAII的地址指针的地址指针的地址指针的地址指针LOOPLOOP:ACALL TRANS ACALL TRANS ; ;调用调用调用调用TRANSTRANS子程序子程序子程序子程序 DJNZ R2 DJNZ R2 ,LOOP LOOP ; ;未转换完,继续未转换完,继续未转换完,继续未转换完,继续 SJMP $ SJMP $ 将一位将一位BCDBCD码转换为码转换为ASCAIIASCAII码的子程序:码的

40、子程序:TRANS:TRANS:MOV A , R0 MOV A , R0 ; ;取取取取BCDBCD码码码码 ADD A , #30H ADD A , #30H MOV R1 , A MOV R1 , A ; ;送送送送ASCAIIASCAII码码码码 INC R0INC R0 INC R1INC R1 RET RET ; ;返回返回返回返回分析:分析:将一位将一位BCDBCD码转换为相应的码转换为相应的ASCAIIASCAII码只码只 需加上需加上30H30H即可。即可。 设片内设片内4040H H单元中有一组合的单元中有一组合的BCDBCD码,码,要求将其转换为二进制数存回原处。要求将其

41、转换为二进制数存回原处。分析:分析:1 1)组合的)组合的BCDBCD码为两位十进制数,需将十位码为两位十进制数,需将十位 数和个位数分开处理。数和个位数分开处理。2 2)十位数转换时只要累加)十位数转换时只要累加0 0AHAH就能将其转换就能将其转换 为相应的二进制数,然后再将个位数直接为相应的二进制数,然后再将个位数直接 加到转换后的十位数上就可完成整个数的加到转换后的十位数上就可完成整个数的 转换。转换。例例例例4.9 4.9 BCDBCD码转换为二进制数码转换为二进制数码转换为二进制数码转换为二进制数ORG 1000HORG 1000HBCDTOB: MOV A , 40HBCDTOB

42、: MOV A , 40H ANL A ANL A ,#F0H ;#F0H ;取十位数取十位数取十位数取十位数 SWAP A SWAP A ; ;将十位数换到低将十位数换到低将十位数换到低将十位数换到低4 4位位位位 JZ DONE JZ DONE ; ;十位数为十位数为十位数为十位数为0, 0,返回返回返回返回 MOV R3 MOV R3 ,#00H #00H ; ;累加和寄存器清累加和寄存器清累加和寄存器清累加和寄存器清0 0LOOPLOOP: DEC ADEC A ACALL ADD0AH ACALL ADD0AH ; ;调用加调用加调用加调用加1010子程序子程序子程序子程序 JNZ

43、LOOP JNZ LOOP ; ;未加完继续未加完继续未加完继续未加完继续 MOV A MOV A ,40H40H ANL A ANL A ,#0FH #0FH ; ;取个位数取个位数取个位数取个位数 ADD AADD A,R3 R3 ; ;与十位相加与十位相加与十位相加与十位相加 MOV 40H , A MOV 40H , A ; ;转换完,存结果转换完,存结果转换完,存结果转换完,存结果DONE:DONE: RET RET ;( ;(书上此处有错书上此处有错书上此处有错书上此处有错) )ADD0AHADD0AH:PUSH A PUSH A ;保护现场保护现场保护现场保护现场 MOV AMO

44、V A,R3 R3 ;累加的和送累加的和送累加的和送累加的和送A A中中中中 ADD AADD A,#0AH #0AH MOV R3 MOV R3,A A ;加加加加1010后送回原处后送回原处后送回原处后送回原处 POP A POP A ;恢复现场恢复现场恢复现场恢复现场 RET RET ;返回返回返回返回 加加10子程序子程序: 已知已知8 8位二进制数在位二进制数在R0R0中,要求中,要求将其转换为将其转换为BCDBCD码并存放在片内码并存放在片内3030H H、31H31H单元中。单元中。分分分分析析析析:8 8位位二二进进制制数数转转换换成成3 3位位BCDBCD码码数数,用用压压缩

45、缩BCDBCD码码存存放放,百百位位数数放放3131H H单单元元,十十位位、个个位位数放数放3030H H单元。单元。例4.10 二进制数转换为BCD码程序流程图为程序流程图为程序流程图为程序流程图为:开始开始开始开始A/100A/100商为商为商为商为BCDBCD码的百位数存于码的百位数存于码的百位数存于码的百位数存于3131HH单元单元单元单元余数余数余数余数A A中中中中A/10A/10商为商为商为商为BCDBCD码的十位数码的十位数码的十位数码的十位数余数为余数为余数为余数为BCDBCD码的个位数码的个位数码的个位数码的个位数BCDBCD码十位数、个位数组成压缩码十位数、个位数组成压

46、缩码十位数、个位数组成压缩码十位数、个位数组成压缩BCDBCD码码码码3030HH单元单元单元单元结束结束结束结束R0AR0AORG 1000HORG 1000HBTOBCD: MOV ABTOBCD: MOV A,R0 R0 ; ;取二进制数取二进制数取二进制数取二进制数 MOV BMOV B,#100#100 DIV AB DIV AB ; ;除以除以除以除以100100 MOV R1 MOV R1,#31H#31H MOV R1 , A MOV R1 , A ; ;百位的百位的百位的百位的BCDBCD码数存码数存码数存码数存31H31H单元单元单元单元 DEC R1DEC R1 XCH

47、A XCH A ,B B ; ; 二进制数除以二进制数除以二进制数除以二进制数除以100100的余数送累加器中的余数送累加器中的余数送累加器中的余数送累加器中 MOV B , #10MOV B , #10 DIV AB DIV AB ; ; 除以除以除以除以1010 SWAP A SWAP A ADD A ADD A ,B B ; ;十位与个位的十位与个位的十位与个位的十位与个位的BCDBCD码进行组合码进行组合码进行组合码进行组合 MOV R1 MOV R1 ,A A ; ;组合的组合的组合的组合的BCDBCD码送码送码送码送30H30H中中中中 RET RET 已知片内已知片内RAM AD

48、R1RAM ADR1开始的单元依次从低开始的单元依次从低位到高位存放有位到高位存放有L L个字节的无符号数,片外个字节的无符号数,片外RAM ADR2RAM ADR2开始的单元也依次从低位到高位存开始的单元也依次从低位到高位存放有放有L L个字节的无符号数。请编一个加法程序,个字节的无符号数。请编一个加法程序,将他们的和存放在将他们的和存放在ADR1ADR1开始的连续单元中。开始的连续单元中。2) 算术运算子程序算术运算子程序例例例例4.11 4.11 多字节无符号数相加多字节无符号数相加多字节无符号数相加多字节无符号数相加R0: 片内片内RAM地址指针,初值为地址指针,初值为ADR1DPTR

49、:片外片外RAM地址指针,初值为地址指针,初值为ADR2每每完完成成一一个个字字节节的的加加法法后后,R0、DPTR各各自自加加1,调整为加数、被加数下一待加字节的地址。调整为加数、被加数下一待加字节的地址。R2:计计数数器器。存存放放待待加加的的字字节节数数,每每完完成成一一个个字字节的加法后,内容减节的加法后,内容减1,当,当R2=0时,程序结束。时,程序结束。开始开始#ADR1(R0)#ADR2(DPRTR)#L(R2)C清零(R0)+(DPTR)(A) (A) (R0)(R0)+1 (R0)(R1)+1 (R1)(R2)-1 (R2)(R2) = 0?YN出口出口初始化初始化设初值设初

50、值循环体循环体工作部分工作部分修改修改循环体循环体参数参数判别判别程序流程框图:程序流程框图:程序流程框图:程序流程框图: ORG 1000HORG 1000HNSADDNSADD: MOV R0MOV R0,#ADDR1#ADDR1; ;设被加数的地址指针设被加数的地址指针设被加数的地址指针设被加数的地址指针 MOV DPTR MOV DPTR ,#ADDR2 #ADDR2 ; ;设加数的地址指针设加数的地址指针设加数的地址指针设加数的地址指针 MOV R2 MOV R2 ,#L #L ; ;设循环计数器初值设循环计数器初值设循环计数器初值设循环计数器初值 CLR CCLR CLOOPLOO

51、P: MOVX A MOVX A ,DPTR DPTR ; ;取加数取加数取加数取加数 ADDC A , R0 ADDC A , R0 ; ;两数相加两数相加两数相加两数相加 MOV R0 , A MOV R0 , A ; ;存和存和存和存和 INC R0 INC R0 ; ;调整被加数地址指针调整被加数地址指针调整被加数地址指针调整被加数地址指针 INC DPTR INC DPTR ; ;调整加数地址指针调整加数地址指针调整加数地址指针调整加数地址指针 DJNZ R2 , LOOP DJNZ R2 , LOOP ; ;未加完,继续未加完,继续未加完,继续未加完,继续 RET RET ; ;返

52、回返回返回返回已已知知被被乘乘数数和和乘乘数数分分别别为为双双字字节节的的无无符符号号数数,被被乘乘数数的的高高字字节节和和低低字字节节分分别别存存放放在在R7R7和和R6R6中中,乘乘数数的的高高字字节节和和低低字字节节分分别别存存放放在在R5R5和和R4R4中中。要要求求乘乘积积存存放放在在片片内内RAMRAM以以ADRADR开开始始的单元中。的单元中。分分分分析析析析:由由于于只只有有单单字字节节乘乘法法指指令令,双双字字节节的乘法需要分作的乘法需要分作4 4次乘法运算才能实现。次乘法运算才能实现。 例例4.15 两双字节无符号数相乘两双字节无符号数相乘 a b c dbdH bdLad

53、H adLbcH bcLacH acLR0+3 R0+2 R0+1 R0 b da db ca c积积+R7 R6R5 R4 ORG 1000HMUL1: MOV 40H ,#00H ;统计统计bdH+adL+bcL ;的的进位单元清进位单元清0 MOV 41H ,#00H ;统计统计adH+bcH+acL ;的的进位单元清进位单元清0 MOV R0 ,#50H ;积的首地址送积的首地址送R0中中 MOV A ,R6 ;b送送A MOV B ,R4 ;d送送B MUL AB ;b d MOV R0 , A ;bdL送送50H单元中单元中 MOV R1 , B ;bdH送送R1中中R1 MOV

54、A , R7 MOV A , R7 ; a ; a送送A A MOV B , R4 MOV B , R4 ; d ; d送送B B MUL AB MUL AB ; ; a a d d MOV R2 , A MOV R2 , A ; ; adLadL送送R2R2中中 MOV R3 , B MOV R3 , B ; ; adHadH送送R3R3中中 MOV A , R6 MOV A , R6 ; b ; b送送A A MOV B , R5 MOV B , R5 ; c ; c送送B B MUL AB MUL AB ; ; b b c c ADD A , R2 ADD A , R2 ; ; bcL+

55、adLbcL+adL JNC NEXT1 JNC NEXT1 INC 40H INC 40H ; ; 统计进位统计进位NEXT1: ADD A , R1 NEXT1: ADD A , R1 ; ; bcL+adL+bdHbcL+adL+bdH JNC NEXT2 JNC NEXT2 INC 40H INC 40H ; ; 统计进位统计进位NEXT2: INC R0NEXT2: INC R0 MOV R0 , A ; MOV R0 , A ; 存存bcL+adL+bdHbcL+adL+bdH结果于结果于51H51H单元单元R3R1R2 MOV R1 , B ;bcH存R1中 MOV A , R7

56、 ;a送A MOV B , R5 ;c送B MUL AB ;a c ADD A , 40H ;acL加低位进位 JNC NEXT3 ;无进位转NEXT3 INC 41H ;统计进位NEXT3: ADD A , R1 ;acL+bcH JNC NEXT4 ;无进位转NEXT4 INC 41H ;统计acL+bcH进位NEXT4: ADD A , R3 ;acL+bcH+adH INC R0 MOV R0 , A ;存acL+bcH+adH的结 果于52H单元中 MOV A , B ADDC A , 41H ;acH加低位进位 INC R0 MOV R0 , A ;积最高位存53H单元中 RET

57、R1R3 1. 1.用用硬件电路实现硬件电路实现2. 2.定时器实现定时器实现3. 3.软件延时软件延时定时(或延时)方法:定时(或延时)方法:3) 延时程序延时程序不需另添硬件,且变化灵活。软软件件延延时时:利利用用计计算算机机执执行行程程序序耗耗用用的的时间来实现延时,又称时间来实现延时,又称“延时程序延时程序”。优点:优点:延时过程中占用CPU,所以不宜设计太长的延时程序。缺点:缺点: DELAY1: MOV R1, #0AH ; 1DL2: MOV R2, #18H ; 1DL1: NOP ; 1 NOP ; 1 DJNZ R2, DL1 ; 2 DJNZ R1, DL2 ; 2 RE

58、T ; 2 机器周期机器周期内循环内循环外循环外循环例:例:例:例:设计一延时程序,延时时间为设计一延时程序,延时时间为1 1msms。若若MCSMCS5151单片机系统采用单片机系统采用1212M M晶振,则晶振,则TcyTcy1us1us 内循环一次要内循环一次要内循环一次要内循环一次要4 4个机器周期,共循环个机器周期,共循环个机器周期,共循环个机器周期,共循环18H18H2424次次次次延时时间:延时时间:延时时间:延时时间:11(1(14244242)*102)*102*2*T Tcycy993us 993us 1ms 1ms延时程序常设计为子程序,以便频繁调用。延时程序常设计为子程序,以便频繁调用。延时程序常设计为子程序,以便频繁调用。延时程序常设计为子程序,以便频繁调用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号