3-20 编写程序,采用算术平均值滤波法求采样平均值,设8次采样值依次放在20H~27H的连续单元中,结果保留在A中。
解:首先需要对这块区域中八个数相加,然后做平均值处理
ORG 0200H
FILT: MOV R0,#08H
MOV A,#0H
MOV R1,#20H
MOV B,#8
FILT1:ADD A,@R1
INC R1
DJNZ R0,FILT1
DIV AB
RET
3-21 编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相减,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
顺序执行的写法:从低位向高位逐个进行相减并考虑。
ORG 0000H
START: CLR C
MOV R0,#20H ;将20H的起始地址送给R0
MOV R1,#30H ;将30H的起始地址送给R1
MOV A,@R0 ;将20H的内容给A
SUBB A,@R1 ;将A和30H相减
MOV 70H,A ;将相减的值放在70H单元中
MOV R0,#21H ;将21H的起始地址送给R0
MOV R1,#31H ;将31H的起始地址送给R1
MOV A,@R0 ;将21H的内容给A
SUBB A,@R1 ;将A和31H的内容相减
MOV 71H,A ;将相减的值放在71H单元中
MOV R0,#22H ;将22H的起始地址送给R0
MOV R1,#32H ;将32H的起始地址送给R0
MOV A,@R0 ;将22H的内容给A
SUBB A,@R1 ;将A和32H的内容相减
MOV 72H,A ;将相减的值放在72H单元中
RET
循环控制的写法
ORG 0000H
START: MOV R0,#20H ;将20H的起始地址送给R0
MOV R1,#30H ;将30H的起始地址送给R1
MOV R2,#3 ;设置循环次数为3
MOV DPTR,#70H ;将70H的地址送给DPTR
CLR C ;对C清零
LOOP: MOV A,@R0
SUBB A,@R1
MOVX @DPTR,A
INC R0 ;指针加一指向下一个单元
INC R1 ;指针加一指向下一个单元
INC DPTR ;指针加一指向下一个单元
DJNZ R2,LOOP ;减1判断是否继续循环
CLR A ;对A清零
SUBB A,#0 ;判断A是否有借位
MOVX @DPTR,A ;将借位给DPTR
RET
3-22 假设在R0指向的片内RAM区,存有20个16进制数的ASCII字串。将ASCII码转换为16进制数,然后两两合成一个字节,从低地址单元到高地址单元依次组合。
解:设定本题中所指的160-进制数的ASCII码值仅考虑’0’-‘9’,‘A’-‘F,不考虑’a’-‘f’.
那么需要将连续相邻2个单元中的ASCII串取出来(内循环次数),分别取10次(外循环次数).针对这两种类型的ASCII,‘0’-'9’在30-39H,‘A’-‘F’在41-46H,而41H=30H+0AH+07H,那么可以通过减40H判断是否有借位,如果有借位说明属于’0’-‘9’类型,否则为’A’-‘F’类型。那么针对’A’-‘F’可以在判断借位后先减掉07H,再和’0’-'9’类一起共享减去30H转换为ASCII码的子程序。
ORG 0000H
MOV R0,#YUAN ;将存放ASCII码的源数据地址指针给R0
MOV R1,#MUBIAO ;将存放转换后十六进制数据的目标数据地址指针给R1
MOV R2,#10 ;外循环次数为10
CONT: MOV R3,#02H ;内循环次数为2
PANDUAN: CLR C
MOV A,@R0 ;取出第一个数
PUSH A ;数据备份
SUBB A,#40H ;将数据与40H相减判断是否有借位
POP A ;恢复A便于后续操作
JC ZHUANMA ;有借位则说明为数字,无借位则顺序执行
SUBB A,#007H ;将字母减掉07H
ZHUANMA: SUBB A,#30H ;第一个数处理完毕
PUSH A ;压栈保存数据
DJNZ R3,PANDUAN ;内循环没结束则继续
POP A ;弹出高位16进制
SWAP A ;放入高四位
MOV @R1,A ;放到目标地址
POP A ;弹出低位16进制
ADD A,@R1
MOV @R1,A
DJNZ R3,CONT
FINAL: END