SJMP $
END
例如:(2OH)=03H,(3OH)=41H,(31H)=42H,(32H)=43H,(5OH)=41H,(51H)= 42H,(52H)=43H。两个字符串均为“ABC"。
执行结果:F0=0
【4—1 5】已知经A/D转换后的温度值存在4 0 H中,设定温度值存在4 1 H中。要求编写控制程序,当测量的温度值大于(设定温度值+2℃)时,从P 1.0引脚上输出低电平;当测量的温度值小于(设定温度值一2℃)时,从P 1.0引脚上输出高电平;其他情况下,P 1.0引脚输出电平不变(假设运算中C中的标志不会被置1)。加上必要的伪指令,并对源程序加以注释。
【答】程序如下:
ORG 0000H
AJMP MAIN
ORG ‘0020H
MAIN: .
MOV B,41H ;设定的温度值
MOV A.B
ADD A,#02H
MOV B,A ;设定温度值+2℃
MOV A,40H ;测量的温度值
CLR C
SUBB A,B
JNC LOWER ;测量的温度值>(设定温度值+2℃),转LOWER子程序,使P1.0引脚上输出低电平
MOV B,41H ;设定的温度值
MOV A,B
DEC A
DEC A .
MOV B,A ;设定温度值一2℃
MOV A,40H ;测量的温度值
CLR C
很难找到
SUBB A,B
JC HIGH ;测量的温度值<设定温度值-2℃,转HIGH子程序,使P1.0引脚上输出高电平
SJMP $ ;都不是,则P1.0引脚上输出不变
LOWER: CLR P1.0
SJMP $
HIGH: SETB P1.0 ’
SJMP $
END
【4—1 6】80C51单片机从内部RAM的31H单元开始存放一组8位带符号数,字节个数存放在30H中。请编写程序统计出其中正数、0和负数的数目,并把统计结果分别存入20H、21H和22H三个单元中。加上必要的伪指令,并对源程序加以注释。
【答】程序如下:
LENGTH EQU 30H ;数据长度
DATA_ADR EQU 31H ;数据首地址
POS_NUM EQU 20H ;正数个数
ZERO_NUM EQU 21H ;0个数
NEG_NUM EQU 22H ;负数个数
ORG 0000H
AJMP MAIN ,
ORG 0030H
MAIN: MOV POS_NUM,#0 ;计数单元初始化为0
MOV ZERO_NUM,#0
MOV NEG_NUM,#0
MOV R1,#LENGTH ;数据长度
MOV R0,#DATA_ADR ;数据首地址
LOOP: MOV A,@R0 .
JB ACC.7,INC_NEG ;符号位为1,该数为负数,跳转加1
CJNE A,#0,INC_POS
INC ZERO_NUM ;该数为0,0个数加1
AJMP L00P1
INC NEG:INC NE~_NUM ;负数个数加1
AJMP LOOPl .
INC_POS:INC POS_NUM ;该数为正数,正数个数加1
LOOPl: INC R0 ;判断统计是否结束
DJNZ R1,LOOP
END
例如:已知(30H)=08H,31H单元起存放数据为00H,80H,7EH,6DH,2FH,34H, EDH,FFH。
执行结果:(20 H)=04 H,(21 H)=01H,(22H)=03 H。
【4-17]两个10位的无符号二一十进制数,分别从内部RAM的40 H单元和50H单元开始存放。请编程计算该两个数的和,并从内部RAM的60 H单元开始存放。加上必要的伪指令,并对源程序加以注释。
【答】10位的无符号二~十进制数,占5字节,每个字节存放一个压缩BCD码(2位)。
很难找到
ORG 0000H
AJMP MAIN
0Re 0030H
MAIN: MOV R7,#05H ;十位(5字节)计数
MOV R0,#40H ;被加数首址
MOV R1,#50H ;加数首址
MOV R2,#60H ;和数首址
CLR C ;清C标志位
ADDB: MOV A,@R0
ADDC A,@R1
DA A ;二一十进制调整
MOV B,R0 ;保护被加数地址
MOV 20H, R2
MOV R0,20H
MOV @R0,A ;存和
MOV R2,20H ;恢复和数地址
MOV R0,B ;恢复被加数地址
INC R0 ;三个地址指针均加1
INC R1
INC R2
DJNZ R7,ADDB ;多字节加未结束,则循环
HERE: SJMP HERE
END
注意:寄存器间接寻址只针对R0和R1,所以存和时不能使用指令“MOV@R2,A”。 例如:
40 H~44 H内容为78 H,10 H,10 H,10 H,10 H
5O H~54 H内容为42 H,10 H,10 H,10 H,10 H
1 0 1 0 1 0 1 0 7 8
即BCD数 +1 0 1 0 1 0 1 0 4 2
2 0 2 0 2 0 2 1 2 0
运行结果:6O H~64 H单元中的数为20 H,21 H,20 H,20 H,20 H。
【4-18】编写子程序,实现4位非压缩BCD码数转换为二进制数,加上必要的伪指令,并对源程序加以注释。
【答】程序如下:
ORG OOH
0000 0130 AJMP MAIN
0RG 30H
0030 752006 MAIN: MOV 20H,#06H ;4位BCD数为6553
0033 7521 05 MOV 21H,#05H
0036 752205 MOV 22H,#05H
0039 752303 MOV 23H,#03H
003C 7820 MOV R0,#20H ;高位地址指针
003E 7A03 MOV R2,#3 ;循环(n一1)次,n为BCD码位数
0040 1144 ACALL BCDB
很难找到
0042 0142 AJMP $
………………..
;转换原理:假设4位BCD码为a3 a2 a1 a0,即a3×103+a2×102 + al X 101+a0×100 ;二进制值:((a3 X 1 0+a2)X 10+a1)X 10+a0
;4位非压缩BCD码数转换为二进制数子程序
0044 CODO BCDB:PUSH I:'SW ;现场保护
0046 COEO PUSH ACC
0048 COFO PUSH B
004A 7BOO MOT R3,#00H ;设R3中的初始值为b1
004C E6 MOT A,@RO
004D FC MOV R4,A ;BCD码千位a3送R4
004E EC LOOP: MOT A,R4 ;以下()H表示高8位,()L表示低8位 004F 7 5FOOA MOT B,#1 0
0052 A4 MUL AB ;R4 X 10,设(R4×l0)L=b2,(R4 X 10)H=b3
0053 FC MOV R4,A ;将R4×10后的低8位送到R4中