作业帮 > 综合 > 作业

【单片机】编程计算存放在片外RAM30H单元开始的64个无符号数的平均值,结果存入片内RAM30H单元

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 11:35:05
【单片机】编程计算存放在片外RAM30H单元开始的64个无符号数的平均值,结果存入片内RAM30H单元
编程计算存放在片外RAM30H单元开始的64个无符号数的平均值,结果存入片内RAM30H单元.
;
CLR A
MOV R1,A
MOV 30H,A
MOV R0,#30H
MOV R2,#64
LOOP:
MOVX A,@R0
ADD A,R1
MOV R1,A
JNC NEXT
INC 30H
NEXTl
INC R0
DJNZ R2,LOOP
MOV A,R1
ANL A,#0C0H
ADD A,30H
RL A
RL A
MOV 30H,A
SJMP $
END
再问: SJMP $

是什么?
再答: 这一句和题目无关。

你如果看不懂,可以把它删除。
再问: ANL A, #0C0H
ADD A, 30H

这两句什么用?
再答: ;这几句,是除以 64 的。

MOV A, R1
ANL A, #0C0H
ADD A, 30H
RL A
RL A
MOV 30H, A

并没有用除法,是用右移六位,代替了除以 64。

实际上,也并没有用右移六位,是用左移两位,代替了。
这个做法,效率最高。
再问: RL A
RL A

这个是除以8再除以8,我知道。

就是不懂这两句:
ANL A, #0C0H
ADD A, 30H

ANL A, #0C0H ,这样子A不就剩最高的两位了,后面的六位都变成了零。。。
ADD A, 30H , 还把30H的内容再累加到A上,这是在干啥?

这两步不可以去掉么?
再答: ;
RL A
RL A
这个是除以8再除以8,我知道。
--不是除以8再除以8。
--是左环移两位。

就是不懂这两句:
ANL A, #0C0H ,这样子A不就剩最高的两位了,后面的六位都变成了零。。。
ADD A, 30H , 还把30H的内容再累加到A上,这是在干啥?

这两步不可以去掉么?
-----------------------
求平均值,要除以 64。

就是把 30H__R1 两个单元的内容除以64。

即,把 30H__R1 两个单元中的 16 位数,右移 6 位。

得到的结果,应该是八位,即:30H 的低 6 位__R1 的高 2 位。
-----------------------
;这几句,是除以 64 的。

MOV A, R1

ANL A, #0C0H ;这就剩最高的两位了

ADD A, 30H ;加上 30H 的低6位

RL A ;是左环移。最高位,环形移动到最低位
RL A ;是左环移

MOV 30H, A ;30H 的低 6 位__R1 的高 2 位

并没有用除法,是用右移六位,代替了除以 64。

实际上,也并没有用右移六位,是用左移两位,代替了。

这个做法,效率最高。