版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章汇编语言程序设计春第一页,共八十八页,编辑于2023年,星期五
4.1.1程序的设计步骤与方法
汇编和高级语言程序设计的过程:首先对问题进行分析,然后确定算法,再根据算法流程编写程序,最后是调试程序。汇编语言程序设计的独特点在于:(1)用汇编语言进行程序设计时,对数据的存放、寄存器和工作单元的使用等要由设计者安排。而高级语言程序设计时,这些工作都由计算机软件安排,程序设计者不必考虑。第二页,共八十八页,编辑于2023年,星期五(2)汇编语言程序设计要求设计人员必须对所使用的计算机的硬件结构有较为详细的了解。特别是对各类寄存器、端口、定时器/计数器、中断等内容要熟悉,以便在程序设计时能熟练使用。
第三页,共八十八页,编辑于2023年,星期五汇编语言程序的设计步骤:(1)分析问题,抽象出描述问题的数学模型(2)确定解决问题的算法(3)分配存储空间及工作单元(4)根据算法绘制流程图(5)编写源程序(6)上机调试第四页,共八十八页,编辑于2023年,星期五程序质量的判断标准:程序的执行时间短;占用的内存单元少;程序的语句行数少。
第五页,共八十八页,编辑于2023年,星期五4.1.2汇编语言源程序的编辑和汇编1.汇编语言源程序的编辑编辑好的源程序应以“.ASM”扩展名存盘
2.汇编语言源程序的汇编源程序经机器汇编之后,若无语法错误,一般将生成两个新文件,它们的扩展名分别是.OBJ和.LST。
第六页,共八十八页,编辑于2023年,星期五例4-1将内部RAM从30H开始的10个单元的内容相加,其和保存于A(假设其和仍为8位数)。列表文件(.LST)信息如下:地址机器码 汇编语言源程序 注释ORG 2000H ;定义程序起始地址20007830 START:MOV R0,#30H ;初始地址送R02002 7A0A MOV R2,#10 ;循环初始值送R220047400 MOV A,#00H ;累加和初始值送A200626 LOOP:ADDC A,@R0 ;完成累加2007 08 INC R0 ;修改地址2008 DAFC DJNZ R2,LOOP ;循环判断200A 80FE SJMP $ ;暂停 END ;程序结束INCLUDEINHASHTABSTART: 2000 LOOP: 2006目标文件(.OBJ)信息如下:2000200C78307A0A74002608DAFC80FE第七页,共八十八页,编辑于2023年,星期五4.2汇编语言源程序的基本结构共有四种结构形式:顺序结构、循环结构、分支结构和子程序结构。第八页,共八十八页,编辑于2023年,星期五方法一:用逻辑指令将高、低半字节分开,对数字0~9加上30H即可得到所对应的ASCII码30H~39H。
ORG 2000H MOV A,40H ;取数 ANL A,#0FH ;分离出低半字节 ADD A,#30H ;变为ASCII码 MOV 42H,A ;保存 MOV A,40H ;重新取数 SWAP A ;高、低半字节交换 ANL A,#0FH ;分离出高半字节 ADD A,#30H ;变为ASCII码 MOV 41H,A ;保存 END例4-2将40H单元的高、低半字节的两个BCD码拆开并变成其ASCII码,并分别存入41H和42H单元
4.2.1顺序结构第九页,共八十八页,编辑于2023年,星期五方法二:采用BCD数除以10H的方法,可把处于高、低半字节的两个BCD码分别移到A和B的低4位,然后再各自与30H相“或”即变为ASCII码。参考程序如下: ORG 2000H MOV A,40H ;取数 MOV B,#10H ;送被除数 DIV AB ;分离高、低半字节 ORL B,#30H ;低4位调整为ASCII码 MOV 42H,B ORL A,#30H ;高4位调整为ASCII码 MOV 41H,A END例4-2将40H单元的高、低半字节的两个BCD码拆开并变成其ASCII码,并分别存入41H和42H单元
第十页,共八十八页,编辑于2023年,星期五例(附1)求两个8位无符号数的和。设两个8位无符号数分别存放在内部RAM20H和21H单元,所求和(不超过255)存放在22H单元。
ORG 2000HSTART: MOV R0,#20H MOV A,@R0 INC R0 ADD A,@R0 INC R0 MOV @R0,A SJMP $ END只有这一种方法吗?第十一页,共八十八页,编辑于2023年,星期五例(附2)求两个8位无符号数的和。设两个8位无符号数分别存放在内部RAM20H和21H单元,所求和(不超过255)存放在22H单元。 ORG 2000HSTART: MOV A,20H ADD A,21H MOV 23H,A SJMP $ END第十二页,共八十八页,编辑于2023年,星期五4.2.2循环程序设计循环初态第十三页,共八十八页,编辑于2023年,星期五图a为先执行后判断,相当于直到(until)型循环。图b为先判断后执行,相当于当(do-while)型循环。第十四页,共八十八页,编辑于2023年,星期五循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。第十五页,共八十八页,编辑于2023年,星期五
循环:单重循环多重循环(二重以上)--循环嵌套。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。第十六页,共八十八页,编辑于2023年,星期五例4-3把外部RAM5000H~50FFH单元的内容清零。
ORG2000HSTART1: MOV DPTR,#5000H ;循环初始化 MOV R0,#00H MOV A,#00HLOOP1: MOVX @DPTR,A ;循环体 INC DPTR INC R0
DJNZ R0,LOOP1 ;循环控制 END第十七页,共八十八页,编辑于2023年,星期五例4-4将内部RAM从40H开始连续单元的数据传送到外部RAM从2000H开始的连续单元中,当所传送的数据为0FFH时,传送停止。解: ORG 2000H MOV R0,#40H ;循环初始化 MOV DPTR,#2000H LOOP:MOV A,@R0
CJNE A,#0FFH,LOOP1;循环控制 SJMP NEXT LOOP1:MOVX @DPTR,A ;循环体 INC R0 INC DPTR SJMP LOOP NEXT:SJMP $ END
第十八页,共八十八页,编辑于2023年,星期五例4-5从P1口重复256次读数并取平均值,平均值的整数和小数部分分别保存于内部RAM的30H和31H单元中。
解:假设将R2R3作为16位寄存器以保存连续256次读数的累加和 ORG 4000H INTEGER EQU 30H DECIMAL EQU 31HAVR: MOV R2,#0 ;循环初始化 MOV R3,#0 MOV R4,#0 ;累加次数为256AVR1: MOV A,P1 ;循环体 ADD A,R3 ;累加至低8位 JNC AVR2 ;无进位则暂存结果 INC R2 ;有进位则高8位加增1AVR2: MOV R3,A ;暂存低8位 DJNZ R4,AVR1 ;循环控制 MOV INTEGER,R2 MOV DECIMAL,R3 END第十九页,共八十八页,编辑于2023年,星期五例(附2)设单片机外部数据存储器起始地址为3000H的数据块中有100个补码,要求逐一检查,若为负数则求补后放回,正数则不变。
ORG1000HSTART1: MOV R7,#64H ;设置循环初始值 MOV DPTR,#3000H LOOP1: MOVX
A,@DPTR JNB ACC.7,LOOP2 CPL A INC A MOVX@DPTR,ALOOP2: INC DPTR ;外部RAM单元加1 DJNZ R7,LOOP1 END第二十页,共八十八页,编辑于2023年,星期五例(附3)有10个无符号数依次存放在内部RAM30H开始的单元中,求其和,并将结果放在R2和R3中。 ORG2000H MOV R0,#30H MOV R2,#00H MOV R3,#00H MOV R7,#0AHNEXT: MOV A,@R0 ;设置循环初始值 ADD A,R3 MOV R3,A MOV A,R2 ADDC A,#00H MOV R2,A INC R0 DJNZ R7,NEXT SJMP $ END第二十一页,共八十八页,编辑于2023年,星期五例4.6设MCS-51单片机的时钟频率为fosc=12MHz,试设计延时50ms的延时程序。延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积。通常,延时程序采用MOV和DJNZ指令来实现。单循环延时程序,最大的循环次数位256,则程序段为:
MOV R0,#00H ;机器周期数为1DJNZ R0,$ ;机器周期数为2若单片机晶振为12MHz,则一个机器周期为1us。延时时间:(1+256×2)×1μs=513μs。
需采用多重循环。
第二十二页,共八十八页,编辑于2023年,星期五 MOV R1,#M LOOP: MOV R2,#N NOP DJNZ R2,$ DJNZ R1,LOOP内层循环的机器周期数为Tn=1+1+2*N,总机器周期数为Tm=(Tn+2)*M+1.设N=123,M=200,则延时时间为50.001ms。第二十三页,共八十八页,编辑于2023年,星期五修改后程序清单: ORG 2000H MOV R1,#0C8H(200) LOOP: MOV R2,#7BH(123) NOP DJNZ R2,$ DJNZ R1,LOOP SJMP $ END第二十四页,共八十八页,编辑于2023年,星期五补充例4设三字节无符号数相加被加数:内部RAM22H~20H单元(低位在低字节),加数:内部RAM32H~30H单元(低位在低字节),结果:存于内部RAM22H~20H单元,进位位存于23H单元。利用ADDC指令进行多字节加法运算。第二十五页,共八十八页,编辑于2023年,星期五 ORG 4200H MOV R0,#20H ;被加数的低字节地址 MOV R1,#30H ;加数的低字节地址 MOV R2,#03H ;循环次数 CLR CLOOP:
MOV
A,@R0 ADDC
A,@R1 ;低字节相加 MOV
@R0,A ;存放字节相加结果
INC
R0 INC
R1
DJNZ
R2,LOOP ;循环控制
MOVA,#00H ADDC
A,#00H MOV
@R0,A ;进位位送23H END第二十六页,共八十八页,编辑于2023年,星期五4.2.3分支程序分支程序的基本结构:单分支和多分支。 其特点是:各处理模块是相互排斥的。第二十七页,共八十八页,编辑于2023年,星期五13条条件转移指令,分别为:JZ,JNZ:累加器判零转移指令;CJNE:比较条件转移指令;DJNZ:减1条件转移指令;JC,JNC,JB,JNB,JBC:位控制条件转移指令等四类。第二十八页,共八十八页,编辑于2023年,星期五(1)单重分支结构例4-7片内RAMDATA1和DATA2两个单元中各存有一个无符号数字,将两个数中的小者存入MIN单元。 ORG 4000H MIN EQU 30H DATA1 EQU 31H DATA2 EQU 32H MOV A,DATA1 ;第一数送A CLR C CJNE A,DATA2,UNEQU ;两数比较 SJMP STORE ;相等,DATA1作为小的数UNEQU:JC STORE ;有借位,DATA1为小 MOV A,DATA2 ;无借位,DATA2为小STORE:MOV MIN,A ;小者送RAM END第二十九页,共八十八页,编辑于2023年,星期五例4-8片内RAM两个单元中存有不相等的有符号数字X和Y,比较两数的大小,并将大数存入MAX单元。
若X-Y>0,则当(OV)=0时,X>Y; 当(OV)=1时,X<Y;若X-Y<0,则当(OV)=0时,X<Y;当(OV)=1时,X>Y。图4-6例4-8的流程图第三十页,共八十八页,编辑于2023年,星期五 ORG 1000H XD EQU 31H YD EQU 32H MAX EQU 30H CLR C MOV A,XD SUBB A,YD ;X-Y,形成OV标志 JZ XMAX ;若X=Y,则转向FINISH JB ACC.7,NEG ;若(X-Y)<0,则转向NEG JB OV,YMAX ;若(OV)=1,则转向YMAX SJMP XMAX ;若(OV)=0,则转向XMAXNEG: JB OV,XMAX ;若(OV)=1,则转向XMAXYMAX:MOV A,YD ;Y>X,存Y SJMP FINISHXMAX:MOV A,XD ;X>Y,存XFINISH:MOV MAX,A ;大数送MAX单元 END例4-8片内RAM两个单元中存有不相等的有符号数字X和Y,比较两数的大小,并将大数存入MAX单元。
第三十一页,共八十八页,编辑于2023年,星期五(2)多重分支结构例附5设x,y分别存放在内部RAM30H和40H中,根据x的值,给y赋值为01H,00H,0FFH(-1).第三十二页,共八十八页,编辑于2023年,星期五第三十三页,共八十八页,编辑于2023年,星期五 ORG 2000H
MOV A,30H JZ DONE
JB ACC.7,LOOP MOV A,#01H SJMP DONELOOP: MOV A,#0FFH DONE: MOV 40H,A SJMP $
END第三十四页,共八十八页,编辑于2023年,星期五(3)散转结构例设R7的内容为0~n,对应的处理程序入口地址分别为PROG0~PROGn,编写散转程序。
跳转方法:逐个比较,类似CASE。 使用散转指令JMP@A+DPTR。
设(R7)=0~n,对应的处理程序入口地址分别为PROG0~PROGn,且按照一定的规律排列。第三十五页,共八十八页,编辑于2023年,星期五ORG2000H
MOVDPTR,#TAB;设置处理程序入口首地址MOVA,R7 CLR C
RLCA ; JNC NEXT INC DPHNEXT:JMP@A+DPTR;转向形成的散转地址入口
TAB:AJMP PROG0;直接转移地址表
AJMP PROG1……
AJMP PROGn第三十六页,共八十八页,编辑于2023年,星期五例4-9在内部RAM20H和21H单元中有两个无符号的数,由22H中的值决定对该数完成加、减、乘或除运算(20H单元的数为被减数或被除数),运算规则及结果保存处见表4-1。
表4-1例4-9说明(22H)操作结果保存处0加30H(低字节),31H(高字节)1减40H2乘50H(低字节),51H(高字节)3除60H(余数),61H(商)第三十七页,共八十八页,编辑于2023年,星期五 ORG 1000H MOV A,22H MOV B,21H RL A MOV DPTR,#TAB JMP @A+DPTR NOPTAB: AJMP ADDM ;散转表 AJMP SUBM AJMP MULM AJMP DIVMADDM:MOV A,20H ;加法运算 ADD A,B MOV 30H,A MOV A,#0 ADDC A,#0 MOV 31H,A SJMP FINISH第三十八页,共八十八页,编辑于2023年,星期五SUBM: MOV A,20H ;减法运算 SUBB A,B MOV 40H,A SJMP FINISHMULM:MOV A,20H ;乘法运算 MUL AB MOV 51H,B MOV 50H,A SJMP FINISHDIVM: MOV A,20H ;除法运算 DIV AB MOV 61H,A MOV 60H,BFINISH:END第三十九页,共八十八页,编辑于2023年,星期五4.2.4子程序设计
子程序与一般程序的主要区别是在子程序的末尾有一条子程序返回指令(RET),其功能是执行完子程序后通过将堆栈内的断点地址弹出到PC而返回到主程序中。在编写子程序时应注意以下几点:
(1)要给每个子程序赋一个名字。
实际上是一个入口地址的代号。
(2)在子程序的末尾必须有子程序返回指令RET。(3)要能正确地传递参数。首先要有入口条件,说明进入子程序时它所要处理的数据如何得到,另外,要有出口条件,即处理的结果是如何存放的。第四十页,共八十八页,编辑于2023年,星期五(4)注意保护现场和恢复现场。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。保护现场:PUSH恢复现场:POP(5)注意子程序的通用性。主程序调用子程序的指令:“LCALL”,“ACALL”。 子程序返回指令:RET。子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。第四十一页,共八十八页,编辑于2023年,星期五例4-10在图3-11的P1口与LED的连接示意图中,若使得LED0~LED7依次点亮,其延时时间分别从1s至8s,LED7点亮之后又从LED0开始循环。编写汇编语言源程序实现该功能。
第四十二页,共八十八页,编辑于2023年,星期五ORG 1000H MOV A,#1 ;主程序NEXT1:MOV 20H,#0MOVR3,#8NEXT:INC 20HMOV R4,20HMOV P1,AACALL DELAY RL ADJNZR3,NEXT SJMP NEXT1DELAY:MOV R7,#10 ;1s延时子程序DELAY3:MOV R6,#200 DELAY2:MOV R5,#125 DELAY1:DJNZ R5,DELAY1 ;125×4=500μs=0.5ms DJNZ R6,DELAY2 ;0.5ms×200=0.1s DJNZ R7,DELAY3 ;0.1s×200=1s DJNZ R4,DELAY RET END第四十三页,共八十八页,编辑于2023年,星期五例4-11两个无符号数据块的首地址分别为30H和40H,每个数据块的第一个字节都存放着数据块的长度(小于15),求各数据块中最大值的乘积,并将结果存入50H(乘积低字节)和51H(乘积高字节)。
解:可将求最大值的过程编写成一个子程序,子程序的入口参数是数据块的首地址,存放在R1中,返回参数即为最大值,存放在A中,参考程序如下:
ORG 1000H ;主程序
MOV R1,#30H ;置入口条件参数
ACALL FMAX ;调用求最大值子程序
MOV B,A ;第一个最大值存放于B
MOV R1,#40H ;置入口条件参数
ACALL FMAX ;调用求最大值子程序
MUL AB ;求乘积
MOV50H,A ;存乘积低字节
MOV51H,B ;存乘积低高字节
SJMP $
第四十四页,共八十八页,编辑于2023年,星期五
ORG 1200H ;子程序
FMAX:MOV A,@R1 ;取数据块长度
MOV R2,A ;R2中存放数据块的长度
INC R1 ;改变地址指针
MOV A,@R1 ;将第一个数放入A
DEC R2 ;数据个数减1
LOOP1:INC R1 ;修改地址指针
CLRC
SUBB A,@R1 ;相减比较大小
JNC LOOP2 ;A中的数为大,跳向
MOV A,@R1 ;否则,更换大数到A
SJMP LOOP3
LOOP2:ADD A,@R1 ;恢复原最大值LOOP3:LOOP3:DJNZ R2,LOOP1 ;若未比较完,则循环
RET
END第四十五页,共八十八页,编辑于2023年,星期五例:将R0和R1所指的内部RAM中两个多字节无符号数相加,结果存入R0所指的内部RAM中。
NADD:CLR C NADD1:MOVA,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R7,NADD1 JNC NADD2 MOV @R0,#01H INC R0 NADD2:DEC R0 RET第四十六页,共八十八页,编辑于2023年,星期五4.3常用程序设计举例4.3.1代码转换类程序计算机内部的运算一般都是用二进制,而在计算机与外设的数据传送中常采用BCD码、ASCII码和其它代码,因此,就存在代码转换的问题。在程序设计中常采用算法处理和查表方式来实现代码转换。第四十七页,共八十八页,编辑于2023年,星期五十六进制数与ASCII码之间的转换
将A中存放的一位十六进制数转换成其所对应的ASCII码存入A中。解: HEXAS:CLR C SUBB A,#10 JC LOOP ADD A,#7LOOP:ADD A,#10 ADD A,#30H END第四十八页,共八十八页,编辑于2023年,星期五例4-12将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。解: ORG 2000H MOV R0,#30H ;设定地址指针 MOV R1,#40H MOV R7,#8 ;循环次数NEXT: MOV A,@R0 ;高字节转换 SWAP A ANL A,#0FH ACALL HEXAS MOV @R1,A INC R1 MOV A,@R0 ;低字节转换 ANL A,#0FH ACALL HEXAS MOV @R1,A INC R1 ;修改地址指针 INC R0 DJNZ R7,NEXT NOP SJMP $第四十九页,共八十八页,编辑于2023年,星期五HEXAS:CLR C ;十六进制转换成ASCII码子程序 SUBB A,#10 JC LOOP ADD A,#7LOOP: ADD A,#10 ;补偿减掉的10 ADD A,#30H RET END
第五十页,共八十八页,编辑于2023年,星期五例把外部RAM30H~3FH单元中的ASCII码依次转换为十六进制数,并存入内部RAM60H~67H单元之中。
假设:被转换的ASCII为十六进制数(0~F)的ASCII,则,因为:
0~9--ASCII30~39HA~F--ASCII41~46H
若(30H)=41H--A=1041H-30H=11H=17
第五十一页,共八十八页,编辑于2023年,星期五因为一个字节可装两个转换后得到的十六进制数,即两次转换才能拼装为一个字节。为了避免在程序中重复出现转换程序段,因此通常采用子程序结构,把转换操作编写为子程序。第五十二页,共八十八页,编辑于2023年,星期五 ORG5000HMAIN:MOVR0,#30H;设置ASCII码地址指针MOVR1,#60H;设置十六进制数地址指针MOVR7,#08H ;字节个数AB:ACALLTRAN ;调用转换子程序 SWAP A ;A高低字节交换 MOVX @R1,A INC R0
ACALL TRAN ;调用转换子程序 XCHD A,@R1;十六进制数拼装 INC R0 INC R1 DJNZ R7,AB第五十三页,共八十八页,编辑于2023年,星期五
子程序(TRAN):TRAN:CLR C MOVX A,@R0 ;取ASCII码
SUBB A,#30H
CJNE A,#0AH,BB AJMP BCBB: JC DONEBC: SUBB A,#07H ;大于等于0AH,再减07HDONE:RETEND第五十四页,共八十八页,编辑于2023年,星期五
例4-13将两字节十六进制整数转换成三字节的BCD码。若待转换的双字节十六进制整数在R6、R7中(R6中为高位),转换后的三字节BCD码整数存于R3、R4和R5中(R3中为高位)。 解:二进制数b7b6b5b4b3b2b1b0B所对应的十进制数X可按照下式计算因此,只要按照十进制运算法则,将bi(i=7,6,…,1,0)按权相加,就可以得到相应的十进制数X。参考程序如下: ORG 2000HHEBCD:MOV A,#0 ;BCD码初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#16 ;循环次数NEXT: CLR C MOV A,R7 ;R7右移一位并送回 RLC A MOV R7,A MOV A,R6 ;R6右移一位并送回 RLC A MOV R6,A
第五十五页,共八十八页,编辑于2023年,星期五 MOV A,R5 ;(R5)×2并调整为BCD码 ADDC A,R5 DA A MOV R5,A MOV A,R4 ;(R4)×2并调整为BCD码 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;若万位数不超过6,则不用调整 DJNZ R2,NEXT ;处理完16位了吗? NOP END第五十六页,共八十八页,编辑于2023年,星期五4.3.2查表程序
常用于非线性修正、非线性函数转换以及代码转换等。专用的查表指令:
MOVCA,@A+DPTR ;远程查表,64KB通过以下三步操作实现查表。·将所查表格的首地址送入DPTR;·将要查找的数据序号,即数据在表中的位置送入累加器A中;·执行查表指令MOVCA,@A+DPTR进行读数并存结果存于累加器A。第五十七页,共八十八页,编辑于2023年,星期五 MOVCA,@A+PC ;近程查表,0~+256B其实现查表也可通过以下三步操作来完成。·将要查找的数据序号,即数据在表中的位置送入累加器A中;·把从查表指令到表的首地址间的偏移量与A值相加;·执行查表指令MOVCA,@A+PC进行读数,查表结果送累加器A。第五十八页,共八十八页,编辑于2023年,星期五例4-14用查表指令编程实现将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。
ORG 2000H ASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37H;ASCII码表 DB38H,39H,41H,42H,43H,44H,45H,46H MOV R0,#30H ;设定地址指针 MOV R1,#40H MOV R7,#8 ;循环次数 MOV DPTR,#ASCTABNEXT: MOV A,@R0 ;高字节转换 SWAP A ANL A,#0FH MOVC A,@A+DPTR ;查表 MOV @R1,A INC R1 MOV A,@R0 ;低字节转换 ANL A,#0FH MOVC A,@A+DPTR ;查表 MOV @R1,A INC R1 ;修改地址指针 INC R0 DJNZ R7,NEXT NOP END
第五十九页,共八十八页,编辑于2023年,星期五例4-15在一个巡回检测系统中,需对8路输入进行控制,每路都有一最大允许值,为双字节数,且不全相同。控制时,需将输入值与最大值比较,若超过则进行报警。编写一子程序使其能查找每路的最大允许值。解:该查表运算中自变量X是单字节,而因变量Y是两字节的数。假设被检测路数存放在R7中(入口参数),0~7路的最大允许值依次存放在ROM中,查询得到的最大值存放在30H(低字节)和31H(出口参数)中,则参考程序如下: ORG 1000H MOV DPTR,#TABLE MOV A,R7 RL A ;乘2进行地址修正 MOV R7,A MOVC A,@A+DPTR ;查表取高字节 MOV 31H,A INC DPTR MOV A,R7 MOVC A,@A+DPTR ;查表取低字节 MOV 30H,ATABLE: DW 1245H,2345H,1022H,2390H ;最大允许值表 DW 3421H,2388H,2366H,2147H RET第六十页,共八十八页,编辑于2023年,星期五例若累加器A中存放的是一位BCD码。通过查表将其转换成为相应的七段显示码,并存入寄存器B中。七段数码显示管连接方式:共阳极和共阴极两种。共阳极是低电平为有效输入,共阴极为高电平为有效输入。假设数码显示管为共阴极。0~9的七段码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。由于代码没有规律,一般采用查表完成。第六十一页,共八十八页,编辑于2023年,星期五hgfedcba00111111acedbgfh3FH第六十二页,共八十八页,编辑于2023年,星期五若以DPTR为基址,程序段如下:ORG 2000H MOV A,#05H MOV DPTR,#TAB MOVCA,@A+DPTR MOV B,A SJMP $TAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH …
…第六十三页,共八十八页,编辑于2023年,星期五若以PC为基地址,则程序段如下:
…
… MOV A,#05H ADD A,#01H MOVC A,@A+PC RETTAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH …
…
第六十四页,共八十八页,编辑于2023年,星期五例4-16若内部RAM30H中存放的是一位BCD码,通过查表将其转换成为相应的七段显示码,并存入寄存器31H中。解:0~9的共阴极字形代码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 ORG1000H MOV A,30HADD A,#04H ;地址修正MOVC A,@A+PC MOV 31H,A ;2字节指令 SJMP$ ;2字节指令TAB:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHEND第六十五页,共八十八页,编辑于2023年,星期五4.2.6逻辑操作程序
例4-17写出图4-7所示电路的逻辑表达式,并编程实现其功能解:该电路图的最简逻辑表达式为, ORG 1000H X BIT P1.0 ;输入逻辑变量 Y BIT P1.1 Z BIT P1.2 F BIT P1.3 ;输出逻辑变量EXOR: MOV C,X ANL C,/Y MOV F,C ;保存结果于F位 MOV C,Y ANL C,/X ORL C,F ANL C,Z MOV F,C ;F←() MOV C,X ANL C,Y ;XY ORL C,F MOV F,C END图4-7例4-17的逻辑电路图=1&≥11XYZF第六十六页,共八十八页,编辑于2023年,星期五例4-18在图3-7中,假设K1、K2和K3分别表示X、Y和Z三人对某一提案的表决,当K闭合时,表示其同意该方案;当K断开时,表示不同意该方案。当多数人同意时,输出F为1。假设P1.7连接一共阴极LED,将结果用LED显示出来。编程实现此功能。解:根据数字电路中组合逻辑电路的设计知识,得出该逻辑电路的最简逻辑函数式是F=XY+XZ+YZ,据此设计的参考程序如下: ORG 1000H X BIT P1.0 Y BIT P1.1 Z BIT P1.2 MOV C,X ;实现XY ANL C,Y MOV 20H,C MOV C,X ;实现XZ ANL C,Z MOV 21H,C MOV C,Y ;实现YZ ANL C,Z ORL C,21H ORL C,20H MOV P1.7,C NOP END第六十七页,共八十八页,编辑于2023年,星期五例设P1.0~P1.3为准备就绪信号输入端,当该4位输入全为1时说明各项工作已准备好,单片机可顺序执行主程序,否则循环等待。 ORG 2000H LOOP:MOV A,P1 ANL A,#0FH CJNE A,#0FH,LOOP MAIN:第六十八页,共八十八页,编辑于2023年,星期五
例用软件实现逻辑函数。其中X、Y、Z、W、F均为位变量,分别对应P1.0、P1.1、P1.2、P1.3和P1.7。由开关为P1.0、P1.1、P1.2、P1.3输入值,而由P1.7输出该逻辑函数值。第六十九页,共八十八页,编辑于2023年,星期五 ORG5000H X BIT P1.0 Y BIT P1.1 Z BIT P1.2 W BIT P1.3 F BIT P1.7 TEMP BIT 20H.0 MOV C,X ANL C,Y ANL C,Z ;C←XYZ
MOV TEMP,C ;暂存XYZ ANL C,W
ORL C,TEMP ;C←XYZW+XYZ
MOV TEMP,C MOV C,X ANL C,/Y ANL C,W ;C←
ORL C,/TEMP ;C← MOV F,C ;输出最后结果 END第七十页,共八十八页,编辑于2023年,星期五思考题与习题4-1把外部RAM5000H的内容拆开,高位送5001H,低位送5002H。4-2 把外部RAM3000H开始的100字节的内容传送到从外部RAM3500H开始的连续单元中。4-3 设有100个有符号数,连续存放在外部RAM以2000H为首地址的存储区中,编程统计其中正数、负数和零的个数,并分别存放在R5、R6和R7。4-4 外部RAM1000H开始连续存放20个双字节无符号数,低字节在前,高字节在后,编写求和程序,将结果存入内部RAM30H,31H,32H单元中。4-5 编程计算片内RAM40H~47H单元中无符号数的算术平均值(假设和仍为8位数),结果存放在50H(商)和51H(余数)中。第七十一页,共八十八页,编辑于2023年,星期五4-6 从内部RAM30H开始存有一无符号数据块,其长度在2FH单元中。求出数据块中最小值和最大值并分别存入R6和R7中。4-7 将上题中“无符号数”改为“有符号数”,求出其中的最小值和最大值(参考例4-8)。4-8 从外部RAM首地址为1000H、长度为50H的数据块中找出第一个ASCII码‘#’,并将其地址送到1050H和1051H单元中,如果没有‘#’,则使1050H和1051H单元的内容为0。4-9 把外部RAM30H~3FH单元中的ASCII码依次转换为十六进制数,并存入内部RAM60H~67H单元之中。4-10 假设晶振频率fosc=6MHz,根据图3-11的线路设计灯亮程序。要求将8只发光二极管间隔地分两组,每组4只,两组交叉轮流发光,反复循环不止,每组灯亮持续时间为1s。4-11 用软件实现逻辑函数。其中X、Y、Z、W、F均为位变量,分别对应P1.0、P1.1、P1.2、P1.3和P1.7。由P1.0、P1.1、P1.2、P1.3输入值,而由P1.7输出该逻辑函数值。第七十二页,共八十八页,编辑于2023年,星期五
4-1把外部RAM5000H的内容拆开,高位送5001H,低位送5002H。MOV DPTR,#5000HMOVX A,@DPTRMOV R1,ASWAP AANL A,#0FHINC DPTRMOVX @DPTR,AMOV A,R1ANL A,#0FHINC DPTRMOVX @DPTR,A第七十三页,共八十八页,编辑于2023年,星期五
4-2 把外部RAM3000H开始的100字节的内容传送到从外部RAM3500H开始的连续单元中。 MOV DPTR,#3000H MOV R7,#100LOOP:MOVX A,@DPTR MOV R1,A MOV A,DPH ADD A,#5 MOV DPH,A MOV A,R1 MOVX @DPTR,A MOV A,DPH CLR C SUBB A,#05 MOV DPH,A DJNZ R7,LOOP第七十四页,共八十八页,编辑于2023年,星期五
4-3 设有100个有符号数,连续存放在外部RAM以2000H为首地址的存储区中,编程统计其中正数、负数和零的个数,并分别存放在R5、R6和R7。 MOV DPTR,#2000H MOV R0,#100 MOV R5,#0 ;正数个数 MOV R6,#0 ;负数个数 MOV R7,#0 ;0个数LOOP:MOVX A,@DPTR JZ ZERO JB ACC.7,NEG INC R5 SJMP LOOP1NEG:INC R6 SJMP LOOP1ZERO:INC R7LOOP1:INCDPTR DJNZ R0,LOOP第七十五页,共八十八页,编辑于2023年,星期五
4-4 外部RAM1000H开始连续存放20个双字节无符号数,低字节在前,高字节在后,编写求和程序,将结果存入内部RAM30H,31H,32H单元中。 MOV DPTR,#2000H MOV R7,#20 MOV 30H,#0 MOV 31H,#0 MOV 32H,#0LOOP:MOVX A,@DPTR ADD A,30H MOV 30H,A INC DPTR MOVX A,@DPTR ADD A,31H MOV 31H,A JNC LOOP1 INC 31HLOOP1:INCDPTR DJNZ R7,LOOP第七十六页,共八十八页,编辑于2023年,星期五4-5编程计算片内RAM40H~47H单元中无符号数的算术平均值(假设和仍为8位数),结果存放在50H(商)和51H(余数)中。 MOV R0,#40H MOV R7,#8 CLR CLOOP:ADD A,#@R0 INC R0 DJNZ R7,LOOP MOV B,#8 DIV AB MOV 50H,A MOV 51H,B第七十七页,共八十八页,编辑于2023年,星期五4-6 从内部RAM30H开始存有一无符号数据块,其长度在2FH单元中。求出数据块中最小值和最大值并分别存入R6和R7中。MOV R0,#30HMOV A,@R0MOV R6,AMOV R7,ADEC 2FHLOOP:INC R0CLR CMOV A,R6SUBB A,@R0JNC MINCLR CMOV A,R7SUBB A,@R0JNCLOOP1MAX:MOV A,@R0MOV R7,ASJMP LOOP1MIN:MOV A,@R0MOV R6,ALOOP1:DJNZ 2FH,LOOP第七十八页,共八十八页,编辑于2023年,星期五4-8 从外部RAM首地址为1000H、长度为50H的数据块中找出第一个ASCII码‘#’,并将其地址送到1050H和1051H单元中,如果没有‘#’,则使1050H和1051H单元的内容为0。MOV DPTR,#1000HMOV R7,#50HLOOP:MOVX A,@DPTRCJNE A,#23H,LOOP1SJMP DONE1LOOP1:INC DPTRDJNZ R7,LOOPCLR AMOVX @DPTR,AINCDPTRMOVX @DPTR,ASJMP DONEDONE1:MOV R1,DPLMOV R2,DPHMOV DPTR,#1050HMOV A,R1MOVX @DPTR,AINC DPTRMOVA,R2MOVX @DPTR,ADONE:END第七十九页,共八十八页,编辑于2023年,星期五4-9 把外部RAM30H~3FH单元中的ASCII码依次转换为十六进制数,并存入内部
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度个性化美发店服务股份制合作合同4篇
- 二零二五版新能源汽车充电桩投资分红合同3篇
- 2025年仓储租赁协议审核
- 二零二五年度木地板工程环保认证与施工合同4篇
- 2025年民用航空器租赁合规审查协议
- 2025年度绿色校园绿植种植与教育推广合同4篇
- 2024 年浙江公务员考试行测试题(A 类)
- 二零二五年度二手挖掘机转让与长期维护服务协议3篇
- 二零二五年度SSL协议安全审计与合规检查合同3篇
- 2025年度鲜花电商物流配送与销售合作协议3篇
- 2024年供应链安全培训:深入剖析与应用
- 飞鼠养殖技术指导
- 坏死性筋膜炎
- 整式的加减单元测试题6套
- 股权架构完整
- 山东省泰安市2022年初中学业水平考试生物试题
- 注塑部质量控制标准全套
- 银行网点服务礼仪标准培训课件
- 二年级下册数学教案 -《数一数(二)》 北师大版
- 晶体三极管资料
- 石群邱关源电路(第1至7单元)白底课件
评论
0/150
提交评论