片机程序设计课件_第1页
片机程序设计课件_第2页
片机程序设计课件_第3页
片机程序设计课件_第4页
片机程序设计课件_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4章章 汇编语言程序设计简介汇编语言程序设计简介 4.1 伪指令伪指令 4.2 汇编语言程序设计汇编语言程序设计 4.1 伪伪 指指 令令 伪指令伪指令 是是 对汇编过程对汇编过程 起控制作用,但本起控制作用,但本身并没有对应的机器代码的指令。身并没有对应的机器代码的指令。 一、一、 汇编起始指令汇编起始指令 ORG 指令格式为指令格式为: ORG nn 该指令的作用是指明后面的程序或数据块的起始地址该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。它总是出现在每段源程序或数据块的开始。 式中式中, nn为为 16 位地址位地址, 汇编时汇编时nn确定

2、了此语句后面第一条指令或第一个数确定了此语句后面第一条指令或第一个数据的地址据的地址,此后的源程序或数据块就依次连续存放在以后的地此后的源程序或数据块就依次连续存放在以后的地址内址内, 直到遇到另一个直到遇到另一个ORG指令为止。指令为止。 例例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的伪指令说明其后面程序的目标代码在存储器中存放的起始地址是起始地址是2000H, 即即 存储器地址存储器地址 目标程序目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF

3、二、等值指令二、等值指令EQU 指令格式指令格式: 字符名称字符名称 EQU 数字或汇编符号数字或汇编符号 例例: PA8155 EQU 8001H ;即给标号;即给标号PA8155赋值为赋值为8001H。 功能功能: 使指令中的字符名称等价于给定的数字或汇编符号。使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便使用等值指令可给程序的编制、调试、修改带来方便, 如果如果在程序中要多次使用到某一地址在程序中要多次使用到某一地址,由由EQU指令将其赋值给一个指令将其赋值给一个字符名称字符名称, 一旦需要对其进行变动一旦需要对其进行变动, 只要改变只要改

4、变EQU命令后面的数命令后面的数字即可字即可, 而不需要对程序中涉及到该地址的所有指令逐句进行而不需要对程序中涉及到该地址的所有指令逐句进行修改。修改。 但要注意但要注意, 由由 EQU等值的字符名称必须先赋值后使用等值的字符名称必须先赋值后使用, 且在同一个源程序中且在同一个源程序中, 同一个标号只能赋值一次。同一个标号只能赋值一次。 三、三、 定义字节指令定义字节指令DB 指令格式指令格式: 标号标号: DB 8位二进制数表位二进制数表 功能功能: 把把 8 位二进制数表依次存入从标号开始的连续的位二进制数表依次存入从标号开始的连续的存储单元中。存储单元中。 格式中格式中, 标号区段可有可

5、无标号区段可有可无, DB指令之后的指令之后的 8 位二进制位二进制数表是字节常数或用逗号隔开的字节串数表是字节常数或用逗号隔开的字节串, 也可以是用引号括也可以是用引号括起来的起来的ASCII码字符串码字符串 (一个一个 ASCII字符相当于一个字节字符相当于一个字节)。 例例: ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG伪指令指定了标号伪指令指定了标号BUF1的地址为的地址为1000H, 而而DB伪指令是将其后的二进制数表伪指令是将其后的二进制数表38H, 7FH, 80H依次存放在依次存放在1000H, 1001H, 1002

6、H 3 个连续单元之个连续单元之中中, BUF2也是一个标号也是一个标号, 其地址与前一条伪指令连其地址与前一条伪指令连续续, 即即1003H, 1004H地址单元中依次存放地址单元中依次存放 45H, 66H。 四、四、 定义字指令定义字指令DW 指令格式指令格式: 标号标号: DW 16 位数据表位数据表 该指令的功能与该指令的功能与DB相似相似, 区别仅在于从指定地区别仅在于从指定地址开始存放的是指令中的址开始存放的是指令中的 16 位数据位数据, 而不是字节串。而不是字节串。每个每个 16 位数据要占两个存储单元位数据要占两个存储单元, 高高8 位先存位先存, 低低 8 位后存位后存,

7、 这和这和MCS -51指令中的指令中的16位数据存放顺序是位数据存放顺序是一致的。一致的。 五、五、 汇编结束指令汇编结束指令END 指令格式指令格式: 标号标号: END 地址或标号地址或标号 格式中标号以及格式中标号以及END后面的地址或标号可有可无。后面的地址或标号可有可无。 功能功能: 提供汇编结束标志。汇编程序遇到提供汇编结束标志。汇编程序遇到 END后就后就停止汇编停止汇编, 对对 END以后的语句不予处理以后的语句不予处理, 故故 END应放在应放在程序的结束处。程序的结束处。 4.2 汇编语言程序设计汇编语言程序设计 4.2.1 简单程序设计简单程序设计 例例 1 两个无符号

8、双字节数相加。两个无符号双字节数相加。 设被加数存放于内部设被加数存放于内部RAM的的40H(高位字节)(高位字节), 41H(低位字节)(低位字节), 加数存放于加数存放于50H(高位字节)(高位字节), 51H(低位字节)(低位字节), 和数存入和数存入 40H和和41H单元中。单元中。 程序如下: START: CLR C ; 将将Cy清零清零 MOV R0, 41H ; 将被加数地址送数据指针将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针将加数地址送数据指针R1 AD1: MOV A, R0 ; 被加数低字节的内容送入被加数低字节的内容送入AADD A,R

9、1 ; 两个低字节相加两个低字节相加MOV R0, A ; 低字节的和存入被加数低字节中低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节指向被加数高位字节 DEC R1 ; 指向加数高位字节指向加数高位字节 MOV A, R0 ; 被加数高位字节送入被加数高位字节送入AADDC A, R1 ; 两个高位字节带两个高位字节带Cy相加相加 MOV R0, A ; 高位字节的和送被加数高位字节高位字节的和送被加数高位字节 RET 例例 2 将两个半字节数合并成一个一字节数。将两个半字节数合并成一个一字节数。 设内部设内部RAM 40H#, 41H单元中分别存放着单元中分别存放着 8

10、 位二进制位二进制数数, 要求取出两个单元中的低半字节要求取出两个单元中的低半字节, 并成一个字节后并成一个字节后, 存入存入 50H单元中。单元中。 程序如下程序如下: START: MOV R1, 40H ; 设置设置R1为数据指针为数据指针MOV A, R1 ; 取出第一个单元中的内容取出第一个单元中的内容ANL A, 0FH ; 取第一个数的低半字节取第一个数的低半字节SWAP A ; 移至高半字节移至高半字节INC R1 ; 修改数据指针修改数据指针MOV A, R1 ; 取第二个单元中的内容取第二个单元中的内容ANL A, 0FH ; 取第二个数的低半字节取第二个数的低半字节ORL

11、 A, R1 ; 拼字拼字MOV 50H, A ; 存放结果存放结果RET 4.2.2 分支程序设计分支程序设计 图图 4.1 分支结构框图分支结构框图(a) 单分支流程单分支流程; (b) 多分支流程多分支流程 例例 3 x, y均为均为8位二进制数位二进制数, 设设 x存入存入R0, y存入存入R1, 求解求解: y=syn(x)程序如下程序如下: START: CJNE R0, 00H, SUL1 ; R0中的数与中的数与00比较不等转移比较不等转移 MOV R1, 00H; 相等相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等两数不等, 若(若(R0)0,

12、则则 R101H SJMP SUL2 NEG : MOV R1, 0FFH ; (R0)0, 则则 R10FFH SUL2 : RET 正确程序如下正确程序如下: SUBF : MOV A,R0 JZ ZERO JB ACC.7 , NEG MOV R1, #1 ZERO : MOV R1 , #0 SJMP ENDF NEG : MOV R1 , #0FFH ENDF : RET 例例 4 比较两个无符号数的大小。比较两个无符号数的大小。 设外部设外部 RAM 的存储单元的存储单元 ST1和和 ST2中存放两个不带符号的二进制数中存放两个不带符号的二进制数, 找出其中的大数存入外部找出其中的

13、大数存入外部 RAM 中的中的 ST3单元中。单元中。 图 4.3 程序如下:程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR C ; 清零清零Cy MOV DPTR, ST1 ; 第一个数的指针第一个数的指针 MOVX A, DPTR ; 取第一个数取第一个数 MOV R2, A ; 保存保存 MOV DPTR, ST2 ; 第二个数的指针第二个数的指针 MOVX A, DPTR ; 取第二个数取第二个数 CLR C SUBB A, R2; 两数比较两数比较JNC BIG2 ; 若第二个数大若第二个数大,

14、 则转则转XCH A, R2; 第一个数大第一个数大BIG1: MOV DPTR, ST3 MOVX DPTR, A ; 存大数存大数RETBIG2: MOVX A, DPTR; 第二个数大第二个数大SJMP BIG1RET 4.2.3 循环程序设计循环程序设计 一、一、 循环程序循环程序 图 4.4 循环程序一般由四个主要部分组成循环程序一般由四个主要部分组成: (1) 初始化部分初始化部分: 为循环程序做准备为循环程序做准备, 如规定循环次数、如规定循环次数、 给给各变量和地址指针预置初值。各变量和地址指针预置初值。 (2) 处理部分处理部分: 为反复执行的程序段为反复执行的程序段, 是循

15、环程序的实体是循环程序的实体, 也也是循环程序的主体。是循环程序的主体。 (3) 循环控制部分循环控制部分: 这部分的作用是修改循环变量和控制变这部分的作用是修改循环变量和控制变量量, 并判断循环是否结束并判断循环是否结束, 直到符合结束条件时直到符合结束条件时, 跳出循环为止。跳出循环为止。 (4) 结束部分结束部分: 这部分主要是对循环程序的结果进行分析、这部分主要是对循环程序的结果进行分析、 处理和存放。处理和存放。 例例 5 工作单元清零。工作单元清零。 在应用系统程序设计时在应用系统程序设计时, 有时经常需要将存储器中各部有时经常需要将存储器中各部分地址单元作为工作单元分地址单元作为

16、工作单元, 存放程序执行的中间值或执行结存放程序执行的中间值或执行结果果, 工作单元清零工作常常放在程序的初始化部分中。工作单元清零工作常常放在程序的初始化部分中。 设有设有50个工作单元个工作单元, 其首址为外部存储器其首址为外部存储器8000H单元单元, 则则其工作单元清零程序如下其工作单元清零程序如下: CLEAR: CLR A MOV DPTR, 8000H ; 工作单元首址送指针工作单元首址送指针 MOV R2, #50 ; 置循环次数置循环次数CLEAR1: MOVX DPTR, A INC DPTR ; 修改指针修改指针 DJNZ R2, CLEAR1; 控制循环控制循环 RET

17、 例例 6 设在内部设在内部 RAM的的BLOCK单元开始处有长度为单元开始处有长度为 LEN个的无符号数据块个的无符号数据块, 试编一个求和程序试编一个求和程序, 并将和存入内并将和存入内部部 RAM的的 SUM单元(设和不超过单元(设和不超过 8 位)。位)。 BLOCK EQU 20H LENEQU 30H SUM EQU 40HSTART: CLR A ; 清累加器清累加器A MOV R2, LEN; 数据块长度送数据块长度送R2 MOV R1, BLOCK ; 数据块首址送数据块首址送R1 LOOP: ADD A, R1 ; 循环加法循环加法 INC R1; 修改地址指针修改地址指针

18、 DJNZ R2, LOOP ; 修改计数器并判断修改计数器并判断 MOV SUM, A; 存和存和 RET 二、二、 多重循环多重循环 例例 7 10 秒延时程序。秒延时程序。 延时程序与延时程序与 MCS - 51 执行指令的时间有关执行指令的时间有关, 如果使用如果使用 6 MHz晶振晶振, 一个机器周期为一个机器周期为 2 s, 计算出一条指令以至一个循计算出一条指令以至一个循环所需要的执行时间环所需要的执行时间, 给出相应的循环次数给出相应的循环次数, 便能达到延时的便能达到延时的目的。目的。10 秒延时程序如下秒延时程序如下: DELAY: MOV R5, 100 DEL0: MO

19、V R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET 上例程序中采用了多重循环程序上例程序中采用了多重循环程序, 即在一个循环体中又包即在一个循环体中又包含了其它的循环程序含了其它的循环程序, 这种方式是实现延时程序的常用方法。这种方式是实现延时程序的常用方法。 使用多重循环时使用多重循环时, 必须注意必须注意: (1) 循环嵌套循环嵌套, 必须层次分明必须层次分明, 不允许产生内外层循环交叉。不允许产生内外层循环交叉。 (2) 外循环可以一层层向内循环进入外循环可以一层层向内循环进入,

20、结束时由里往外一结束时由里往外一层层退出。层层退出。 (3) 内循环可以直接转入外循环内循环可以直接转入外循环, 实现一个循环由多个条实现一个循环由多个条件控制的循环结构方式。件控制的循环结构方式。 4.2.8 运算程序运算程序 一、一、 加、加、 减法程序减法程序 例例 18 将将40H开始存放的开始存放的 10 个字节的数与个字节的数与 50H开始存放开始存放的的10 个字节的数相减(假设被减数大于减数)。个字节的数相减(假设被减数大于减数)。 设被减数指针为设被减数指针为 R0, 减数指针为减数指针为 R1, 差数放回被减数单元差数放回被减数单元, R5 存放字节个数存放字节个数, 则程

21、序如下则程序如下: SUB: MOV R0, 40HMOV R1, 50HMOV R5, 10CLR CSUB1: MOV A, R0SUBB A, R1MOV R0, AINC R0INC R1DJNZ R5, SUB1RET 二、二、 乘法运算程序乘法运算程序 在计算机中在计算机中, 常将乘法采用移位和加法来实现。常将乘法采用移位和加法来实现。 例例19 将(将(R2R3)和()和(R6R7)中双字节无符号数相乘)中双字节无符号数相乘, 结果存入结果存入 R4R5R6R7。 此乘法可以采用部分积右移的方法来实现此乘法可以采用部分积右移的方法来实现, 其程序框图其程序框图如图如图 4.6 所

22、示所示, 程序如下程序如下: NMUL: MOV R4, 0 ; 初始化初始化 MOV R5, 0 CLR C MOV R0, 16NMUL1: MOV A, R4 ; CyR4R5R6R7右移一位右移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC MOV R7, A JNC NMUL2; C为移出乘数的最低位为移出乘数的最低位 MOV A, R5 ; (R4R5)+(R6F7)(R4R5) ADD A, R3 MOV R5, A MOV A, R4 ADDC A, R2

23、MOV R4, A NMUL2: DJNZR0, NMUL1; 循环循环16位位 MOV A, R4; 最后结果再移一位最后结果再移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A RET 图图4.6 NMUL程序框图程序框图 例例 20 假定被乘数在(假定被乘数在(R4R3)中)中, 乘数放在乘数放在R2中中, 乘积放乘积放在在R7R6和和R5中。中。 MCS - 51 中有中有 8 位数的乘法指令位数的乘法指令MUL, 用它来实现多字节乘用它来实现

24、多字节乘法时法时, 可表示为可表示为 (R4R3)(R2) =(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中(其中(R4)(R2)和()和(R3)(R2)都是可直接用)都是可直接用MUL指令来实现指令来实现, 而乘以而乘以28意味着左移意味着左移 8 位。由此可编写如下程位。由此可编写如下程序序: NMUL1: MOV A, R2 MOV B, R3 MUL AB ; (R3)(R2) MOV R5, A ; 积的低位送积的低位送R5 MOV R6, B ; 积的高位送积的高位送R6 MOV A, R2 MOV B, R4 MUL AB ; (R4)(R2) ADD

25、 A, R6 ; (R3)(R2)的高位加)的高位加(R4)(R2)的低位的低位MOV A, B ADDC A, 00H ; (R4)(R2)的高位加)的高位加Cy MOV R7, A ; 结果送结果送R7 RET 三、三、 除法运算程序除法运算程序 除法是乘法的逆运算除法是乘法的逆运算, 用移位、用移位、 相减的方法来完成。相减的方法来完成。 首首先比较被除数的高位字与除数先比较被除数的高位字与除数, 如被除数高位大于除数如被除数高位大于除数, 则商则商为为1, 并从被除数中减去除数并从被除数中减去除数, 形成一个部分余数形成一个部分余数; 否则商位为否则商位为 0, 不执行减法。不执行减法

26、。 然后把新的部分余数左移一位然后把新的部分余数左移一位, 并与除数再次并与除数再次进行比较。循环此步骤进行比较。循环此步骤, 直到被除数的所有位都处理完为止直到被除数的所有位都处理完为止,一一般商的字长为般商的字长为 n, 则需循环则需循环n次。次。 一般计算机中一般计算机中, 被除数均为被除数均为双倍位双倍位, 即如果除数和商为双字节即如果除数和商为双字节, 则被除数为四字节。如果则被除数为四字节。如果在除法中发生商大于规定字节在除法中发生商大于规定字节, 称为溢出。称为溢出。 在进行除法前在进行除法前, 应应该检查是否会产生溢出。一般可在进行除法前该检查是否会产生溢出。一般可在进行除法前

27、, 先比较被除数先比较被除数的高位与除数的高位与除数, 如被除数高位大于除数如被除数高位大于除数, 则溢出则溢出, 置溢出标志置溢出标志, 不执行除法。不执行除法。 图图 4.7 除除法法程程序序的的流流程程 例例 21 将(将(R4R5R6R7)除以()除以(R2R3), 商放在(商放在(R6R7)中中, 余数放在(余数放在(R4R5)中。)中。 NDIV: MOV A, R5 ; 判商是否产生溢出判商是否产生溢出 CLR C SUBB A, R3 MOV A, R4 SUBB A, R2 JNC NDIV1 ; 溢出溢出, 转溢出处理转溢出处理 MOV B, 16; 无溢出无溢出, 执行除

28、法执行除法 NDIV2: CLR C ; 被除数左移一位被除数左移一位, 低位送低位送 0 MOV A, R7 RLC A MOV R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A XCH A, R4 RLC A XCH A, R4 MOV F0, C ; 保护移出的最高位保护移出的最高位 CLR C SUBB A, R3 ; 部分余数与除数比较部分余数与除数比较 MOV R1, A MOV A, R4 SUBB A, R2 JB F0, NDIV3; 移出的高位为移出的高位为 1, 肯定够减肯定够减 JC NDIV4 ; 否则

29、否则, (Cy) = 0才够减才够减 NDIV3: MOV R4, A ; 回送减法结果回送减法结果 MOV A, R1 MOV R5, A INC R7 ; 商上商上1 NDIV4: DJNZ B, NDIV2; 循环次数减循环次数减 1 ,若不为零则循环若不为零则循环 CLR F0 ; 正常执行无溢出正常执行无溢出 F0 = 0 RET NDIV1: SETB F0 ; 溢出溢出F0=1 RET 4.2.7 数制转换数制转换 例例 16 将一个字节二进制数转换成将一个字节二进制数转换成 3 位非压缩型位非压缩型BCD码。码。 设一个字节二进制数在内部设一个字节二进制数在内部RAM 40H单

30、元单元, 转换结果放转换结果放入内部入内部 RAM 50H#, 51H, 52H单元中(高位在前)单元中(高位在前), 程序如程序如下下: HEXBCD: MOV A, 40H MOV B, 100 DIV AB MOV 50H, A MOV A, 10 XCH A, B DIV AB MOV 51H, A MOV 52H, B RET 例例 17 设设 4 位位BCD码依次存放在内存码依次存放在内存 RAM中中 40H43H单元的低单元的低4 位位, 高高 4 位都为位都为 0, 要求将其转换为二进制数要求将其转换为二进制数, 结结果存入果存入 R2R3 中。中。 一个十进制数可表示为一个十

31、进制数可表示为: Dn10n +Dn-110n-1 + + D0100 =(Dn10+Dn-1)10+Dn-2)10+)+D0当当n=3时时, 上式可表示为上式可表示为: (D310+D2)10+D1)10+D0 BCDHEX: MOV R0, 40H ; R0指向最高位地址指向最高位地址MOV R1, 03 ; 计数值送计数值送R1MOV R2, 0 ; 存放结果的高位清零存放结果的高位清零MOV A, R0MOV R3, A LOOP: MOV A, R3MOV B, 10MUL ABMOV R3, A ; (R3)10 的低的低 8 位送位送R3MOV A, BXCH A, R2 ; (

32、R3)10的高的高 8 位暂存位暂存R2MOV B, 10 MUL AB ADD A, R2 MOV R2, A ; R210+( R310)高)高 8 位送位送R2 INC R0 ; 取下一个取下一个 BCD数数 MOV A, R3 ADD A, R0 MOV R3, A MOV A, R2 ADDC A, 0 ; 加低字节来的进位加低字节来的进位 MOV R2, A DJNZ R1, LOOP RET 排序程序设计排序程序设计例例 8 在外部在外部 RAM中中, BLOCK开始的单元中有一无符号数据开始的单元中有一无符号数据块块, 其个数为其个数为 LEN个字节。试将这些无符号数按递减次序

33、重个字节。试将这些无符号数按递减次序重新排列新排列, 并存入原存储区。并存入原存储区。 ORG 1000H START: MOV DPTR, BLOCK; 置地址指针置地址指针 MOV P2, DPH ; P2作地址指针高字节作地址指针高字节 MOV R7, LEN ; 置外循环计数初值置外循环计数初值 DEC R7 ; 比较与交换比较与交换 n-1次次 LOOP0: CLR F0 ; 交换标志清交换标志清 0 MOV R0, DPL; MOV R1, DPL ; 置相邻两数地址指针低字节置相邻两数地址指针低字节 INC R1 MOV R6, R7 ; 置内循环计数器初值置内循环计数器初值 L

34、OOP1: MOVX A, R0 ; 取数取数 MOV B, A ; 暂存暂存 MOVX A, R1 ; 取下一个数取下一个数 CJNE A, B, NEXT; 相邻两数比较相邻两数比较, 不等转不等转 SJMP NOCHA ; 相等不交换相等不交换 NEXT: JC NOCHA; Cy =1, 则前者大于后者则前者大于后者, 不必交换不必交换 SETB F0 ; 否则否则, 置交换标志置交换标志 MOVX R0, A ; XCH A, B ; 两数交换两数交换, 大者在前大者在前, 小者在后小者在后 MOVX R1, A ; NOCHA: INC R0 INC R1; 修改指针修改指针 DJ

35、NZ R6, LOOP1 ; 内循环未完内循环未完, 则继续则继续 JNB F0, EXIT ; 若从未交换若从未交换, 则结束则结束 DJNZ R7, LOOP0; 外循环未完外循环未完, 则继续则继续 EXIT: RET 图 4.5 例例 9 设某系统的模数转换器是设某系统的模数转换器是ADC0809, 它的转换结它的转换结束信号束信号 EOC连接到连接到8031 的的P1.7端端, 当当 EOC的状态由低变的状态由低变高时高时, 则结束循环等待则结束循环等待, 并读取转换值并读取转换值, 其程序如下其程序如下: START: MOV DPTR, addr ; 0809端口地址送端口地址送

36、DPTR MOV A, 00H ; 启动启动0809转换转换 MOVX DPTR, A LOOP: JNB P1.7, LOOP; 检测检测P1.7状态状态, 判是否转换结束判是否转换结束 MOVX A, DPTR; 读取转换结果读取转换结果 例例10 在内部在内部 RAM中从中从 50H单元开始的连续单单元开始的连续单元依次存放了一串字符元依次存放了一串字符, 该字符串以回车符为结束标该字符串以回车符为结束标志志, 要求测试该字符串的长度。要求测试该字符串的长度。 程序如下程序如下: START: MOV R2, 0FFH MOV R0, 4FH ; 数据指针数据指针R0置初值置初值 LOO

37、P: INC R0 INC R2 CJNE R0, 0DH, LOOP RET 4.2.6 查表程序设计查表程序设计 查表程序是一种常用程序查表程序是一种常用程序, 它广泛使用于它广泛使用于 LED显示控制、显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中打印机打印控制、数据补偿、数值计算、转换等功能程序中, 这类程序具有简单、执行速度快等特点。这类程序具有简单、执行速度快等特点。 所谓查表法所谓查表法, 就是预先将满足一定精度要求的表示变量与就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出函数值之间关系的一张表求出, 然后把这张表存于单片机的程然后把这张表存于

38、单片机的程序存储器中序存储器中, 这时自变量值为单元地址这时自变量值为单元地址, 相应的函数值为该地相应的函数值为该地址单元中的内容。查表址单元中的内容。查表, 就是根据变量就是根据变量 X在表格中查找对应的在表格中查找对应的函数值函数值 Y, 使使 Y=f(X)。 MCS - 51指令系统中指令系统中, 有两条查表指令有两条查表指令: MOVC A, A+PC MOVC A, A+DPTR 例例 13 一个十六进制数存放在内部一个十六进制数存放在内部 RAM 的的 HEX单元的单元的低低 4 位中位中, 将其转换成将其转换成ASCII码并送回码并送回 HEX单元。单元。 十六进制十六进制 0

39、9的的ASCII码为码为 30H39H, AF的的ASCII码为码为41H46H, ASCII码表格的首地址为码表格的首地址为ASCTAB。编。编程如下程如下: ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修改指针修改指针 MOVC A, A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在这个程序中在这个程序中, 查表指令查表指令MOVC A, A+PC到表

40、格首到表格首地址有两条指令地址有两条指令, 占用占用 3 个字节地址空间个字节地址空间, 故修改指针应加故修改指针应加 3。 例例 14 设有一个巡回检测报警装置设有一个巡回检测报警装置, 需对需对 96 路输入进行路输入进行控制控制, 每路有一个额定的最大值每路有一个额定的最大值, 是双字节数。当检测量大于是双字节数。当检测量大于该路对应的最大值时该路对应的最大值时, 就越限报警。假设就越限报警。假设R2 为保存检测路数为保存检测路数的寄存器的寄存器, 其对应的最大额定值存放于其对应的最大额定值存放于 31H和和 32H单元中。单元中。 查找最大额定值的程序如下查找最大额定值的程序如下: F

41、MAX: MOV A, R2 ADD A, R2 ; 表中一个额定值为表中一个额定值为2个字节个字节 MOV 31H, A MOV DPTR, TAB ; 表首址表首址 MOVC A, A+DPTR; 查表读取第一个字节查表读取第一个字节 XCH A, 31H ; 第一个字节内容存入第一个字节内容存入31H INC DPTR MOVC A, A+DPTR; 查表读取第二个字节查表读取第二个字节 MOV 32H, A ; 第二字节的内容存入第二字节的内容存入32H TAB: DW 1230H, 1450H, . DW 2230H, 2440H, . DW 3120H, 3300H, . 例例 1

42、5 在一个温度检测系统中在一个温度检测系统中, 温度模拟信号由温度模拟信号由 10 位位A/D输入。将输入。将A/D结果转换为对应温度值结果转换为对应温度值, 可采用查表方法实现。可采用查表方法实现。 先由实验测试出整个温度量程范围内的先由实验测试出整个温度量程范围内的A/D转换结果转换结果, 把把A/D转换结果转换结果000H3FFH所对应的温度值组织为一个表存储在所对应的温度值组织为一个表存储在程序存储器中程序存储器中, 那么就可以根据检测到的模拟量的那么就可以根据检测到的模拟量的 A/D转换转换值查找出相应的温度值。值查找出相应的温度值。 设测得的设测得的A/D转换结果已存入转换结果已存

43、入 20H#, 21H单元中(高位单元中(高位字节在字节在20H中中, 低位字节在低位字节在21H中)中), 查表得到的温度值存放查表得到的温度值存放在在22H#,23H单元(高位字节在单元(高位字节在 22H中中, 低位字节在低位字节在23H中)。中)。 程序如下程序如下: FTMP: MOV DPTR, TAB ; DPTR表首地址表首地址 MOVA, 21H ; (20H)()(21H)2CLRCRLCAMOV21H, AMOVA, 20HRLCAMOV20H, AMOVA, 21H ; 表首地址表首地址+偏移量偏移量 ADDC A, DPLMOVDPL, AMOVA, 20HADDC

44、A, DPHMOVDPH, ACLR AMOVC A, A+DPTR; 查表得温度值高位字节查表得温度值高位字节MOV22H, ACLRAINCDPTRMOVC A, A+DPTR; 查表得温度值低位字节查表得温度值低位字节MOV23H, ARETTAB: DW 4.2.4 散转程序设计散转程序设计 散转程序是分支程序的一种散转程序是分支程序的一种, 它可根据运算结果或输入它可根据运算结果或输入数据将程序转入不同的分支。数据将程序转入不同的分支。MCS - 51 指令系统中有一条跳指令系统中有一条跳转指令转指令JMPA+DPTR, 用它可以很容易地实现散转功能。用它可以很容易地实现散转功能。该

45、指令把累加器的该指令把累加器的 8 位无符号数与位无符号数与 16 位数据指针的内容相位数据指针的内容相加加, 并把相加的结果装入程序计数器并把相加的结果装入程序计数器PC, 控制程序转向目标控制程序转向目标地址去执行。此指令的特点在于地址去执行。此指令的特点在于, 转移的目标地址不是在编转移的目标地址不是在编程或汇编时预先确定的程或汇编时预先确定的, 而是在程序运行过程中动态地确定而是在程序运行过程中动态地确定的。目标地址是以数据指针的。目标地址是以数据指针 DPTR的内容为起始的的内容为起始的 256 字节字节范围内的指定地址范围内的指定地址, 即由即由 DPTR的内容决定分支转移程序的的

46、内容决定分支转移程序的首地址首地址, 由累加器由累加器 A的内容来动态选择其中的某一个分支转的内容来动态选择其中的某一个分支转移程序。移程序。 例例 11 根据工作寄存器根据工作寄存器R0 内容的不同内容的不同, 使程序转入相使程序转入相应的分支。应的分支。 (R0)=0 对应的分支程序标号为对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为对应的分支程序标号为PR1; (R0)=N 对应的分支程序标号为对应的分支程序标号为PRN。 程序如下程序如下: LP0: MOV DPTR, TAB ; 取表头地址取表头地址 MOV A, R0 ADD A, R0 ; R0内容乘以内容乘以2 JNC LP1 ; 无进位转移无进位转移 INC DPH ; 加进位位加进位位LP1: JMP A+DPTR; 跳至散转表中相应位置跳至散转表中相应位置 TAB: AJMP PR0 AJMP PR1 AJMP PRN 本例程序仅适用于散转表首地址本例程序仅适用于散转表首地址 TAB和处理程序入口和处理程序入口地址地址 PR0, PR1, , PRN在同一个在同一个 2 KB范围的存储区内的情范围的存储区内的情形。若超出形。若超出 2 KB范围可在分支程序入口处安排一条长跳转范围可在分支程序入口处安排一条长跳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论