MOV PI,A ;从PI口输出
INC DPTR
DJNZ R0,LOOP ;循环
AJMP $
END
【4-23】 编写将1 O位十六进制数转换为ASCII码的程序。假定十六进制数存放在内部RAM的20 H单元开始的区域中,转换得到的ASCII码存放在内存3O H单元开始的区域中。加上必要的伪指令,并对源程序加以注释。
【答】查表法:
ORG 0000H
SJMP BEGIN
ORG 0030H
BEGIN: MOV R2,#5 ;10位十六进制数
MOV R0,#20H ;读指针
MOV RI,#30H ;写指针
MOV DPTR,#ASCTB ~ASCII码表首址
LOOP: MOV A,@R0 ‘
ANL A,#0FOH ;取高半字节
SWAP A
ACALL TRANS ;调用十六进制到ASCII码转换子程序
MOV A,@R0
ANL A,#0FH ;取低半字节
ACALL TRANS ;调用十六进制到ASCII码转换子程序
INC R0
很难找到
DJNZ R2,LOOP
SJMP $ ;查表法子程序 .
TRANS:
MOVC A,@A+DPTR ;取得ASCII码
MOV @R1,A
INC R1
RET
ASCTB: ;ASCII码表
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
END
注意:十六进制数0~9所对应的ASCII码为30 H~39 H,十六进制数A~F所对应的ASCII码为41 H~46 H。 ,
例如:在20 H开始输入5个十六进制数:11 H,F4 H,F1 H,12 H,34 H。
执行程序后:内存3 0 H单元开始的区域中依次为31 H,31 H,46 H,34 H,46 H,31 H,31 H,32 H,33 H,34 H。 、
【4-24]80C51单片机的P1.7、P1.6和P 1.5输出的6拍波形如图4-3所示,后面输出波形重复,输出波形9O拍后停止。请编写源程序,并加以注释,并加上必要的伪指令。
【答】由图4-3分析,可以得到一个周期为6拍的波形表。
ORG 0000H
0000 802E SJMP BEGIN
ORG 003 0H
0030 7860 BEGIN: MOV R0,#90 ;90拍波形计数器
0032 7906 LOOP2: MOV R1,#6 ;6拍波形计数器
0034 9 00047 MOV DPTR,#TAB
0037 E4 LOOPI: CLR A
0038 93 MOVC A,@A+DPTR ;查表得到输出波形值
0039 F59 0 MOV PI,A
003B E8 MOV A,R0 、;判断90拍波形输出结束?
003C 14 DEC A
003D F8 MOV R0,A
003E 6005 JZ STOP ;90拍波形输出完,则转停止输出
0040 A3 INC DPTR
0041 D9F4 DJNZ R1,LOOP1 ;6拍波形循环
很难找到
0043 80ED SJMP L00P2
0045 80FE STOP:SJMP STOP
0047 E040A0 TAB:DB 0E0H,40H,0A0H,60H,0C0H,60H;6拍波形表
004A 60C060
END
【4-25】编写求无符号数最大值的子程序。入口条件:采样值存放在外部RAM的1000 H~100F H单元中。出口结果:求得的最大值存入内部RAM区的20 H单元中。对源程序加以注释和加上必要的伪指令。
【答】程序如下:
;求无符号数最大值的子程序CMP
ORG 1000H
CMP: MOV R0,#10H ;采样值数据区长度
MOV DPTR,#1000H ;采样值存放首址
MOV 20H,#00H ;最大值单元初始值设为最小数
LP: MOVX A,@DPTR ;取采样值
CJNE A,20H,CHK ;数值比较
CHK: JC LPI ;A值小,转移
MOV 20H,A ;A值大,则送20H
LPI: DJNZ R0,LP ;继续
RET ;结束
注意:20 H中始终存放两个数比较后的较大值,比较结束后存放的即是最大值。
【4-26】编写求无符号数最小值的子程序。
入口条件:20 H和21 H中存放数据块起始地址的低位和高位,22 H中存数据 块的长度。出口结果:求得的最小值存入3O H单元中。对源程序加以注释和加上必要的伪指令。
【答】程序如下: .
;求无符号数最小值的子程序CMPI
ORG 2000H
CMPI: MOV DPL,20H
MOV DPH,21H
MOV 30H,#0FFH ;最小值单元初始值设为最大值
LOOP: MOVX A,@DPTR
MOVX A,@DPTR ’
CJNE A,3 0H,CHK ;比较两个数大小
SJMP LOOP1 ;两个数相等,不交换
CHK: JNC LOOP1 ;A较大,不交换
MOV 30H,A ;A较小,交换
LOOP1: INC DPTR
DJNZ 22H.LOOP
RET
注意:30 H中始终存放两个数比较后的较小值,比较结束后存放的即是最小值。 例如:(20 H)=00 H,(21 H)=80 H.(22 H)=0 5 H。从8000 H开始存放下列数:02 H, 04 H,01 H,FFH,03 H。
调用子程序CMPl后的结果:(30 H)=01 H
【4-27】数据组为X1,X2, ,X1 0共10个。采用冒泡法对10个数据进行排序。最小值
很难找到
存入低位地址单元。编写源程序并加以注释,加上必要的伪指令。
【答】程序如下:
ORG 0000H
0000 755021 MOV 50H,#21H ;置准备排序的数据1 0个
0003 755132 MOV 51H,#32H
0006 755223 MOV 52H,#23H
0009 755322 MOV 53H,#22H
000C 755489 MOV 54H,#89H
000F 75559A MOV 55H,#9AH
0012 755635 MOV 56H,#35H
0015 7557F6 MOV 57H,#0F6H
0018 755865 MOV 58H,#65H
001B 755983 MOV 59H,#083H
001E C200 PX: CLR 00H ;设交换过标志
002 0 7809 MOV R3,#09H ;第一次比较二个数,比较次数为(n-1) 0022 785 0 MOV R0,#5 0H ;1 0个无符号数存放单元首地址 0024 E6 MOV A,@R0
0025 08 PX3: INC R0
0026 F9 MOV R1,A ‘
0027 9 6 SUBB A,@R0 ;DX- (DX+1)
0028 E9 MOV A,R1
0029 4006 JC PX2 ;DX<(DX+1)则转PX2,不交换
002B D200 SETB 00H ;DX>(DX+1)量交换标志位,20H.0=1