51单片机编程求指导。。。
编子程序,将内部数据存储区从20H开始的连续4个单字节二进制数相加,结果存于30H(高字节)、31H(低字节),并计算平均值,结果存于32H。...
编子程序,将内部数据存储区从20H开始的连续4个单字节二进制数相加,结果存于30H(高字节)、31H(低字节),并计算平均值,结果存于32H。
展开
2个回答
展开全部
嘿嘿 楼上的老兄给出的程序也不对呀 看上去挺工整的,错误好几出啊,是得不到正确结果的。
其实算法很简单,只要熟悉一下单片机的加法指令和循环移位指令,自己就可以编写出来。
1 算法:
就是使用指针 连续对20H开始的连续4个单字节二进制数相加,结果存入31H单元,要考虑进位,(进位部分存入31H单元)
求平均值 就是对和除4,可以使用循环右移指令 每移一次 相当于除2 总共2次就行了。
2 楼上的错误: 使用指令 ADD A,31H 求的和在累加器A里,并没有存入31H
使用指令 MOV A,31H ;低位送A
RRC A ;带进位循环右移完成一次除2
同样没有将结果回送给31H单元(保存)
呵呵 满意就选满意回答 (想要正确程序 可以发消息给我)
其实算法很简单,只要熟悉一下单片机的加法指令和循环移位指令,自己就可以编写出来。
1 算法:
就是使用指针 连续对20H开始的连续4个单字节二进制数相加,结果存入31H单元,要考虑进位,(进位部分存入31H单元)
求平均值 就是对和除4,可以使用循环右移指令 每移一次 相当于除2 总共2次就行了。
2 楼上的错误: 使用指令 ADD A,31H 求的和在累加器A里,并没有存入31H
使用指令 MOV A,31H ;低位送A
RRC A ;带进位循环右移完成一次除2
同样没有将结果回送给31H单元(保存)
呵呵 满意就选满意回答 (想要正确程序 可以发消息给我)
展开全部
SQUD:
MOV R0,#20H ;间接寻址首地址送R0
MOV 30H,#0 ;累加结果高位清零
MOV 31H,#0 ;累加结果低位清零
MOV R7,#4 ;循环4次累加4个数
SQUD1:
MOV A,@R0 ;取数送A
ADD A,31H ;与结果低位相加
JNC SQUD2 ;没有进位转
INC 30H ;有进位高位加1
SQUD2:
INC R0 ;地址加1
DJNZ R7,SQUD1 ;判断5个数是否加完
MOV R7,#2
SQUD3:
MOV A,30H ;高低位送A
RRC A ;带进位循环右移
MOV 30H,A ;回送30H
MOV A,31H ;低位送A
RRC A ;带进位循环右移完成一次除2
DJNZ R7,SQUD3 ;共移两次相当于除4
MOV 32H,A ;结果存32H
RET
MOV R0,#20H ;间接寻址首地址送R0
MOV 30H,#0 ;累加结果高位清零
MOV 31H,#0 ;累加结果低位清零
MOV R7,#4 ;循环4次累加4个数
SQUD1:
MOV A,@R0 ;取数送A
ADD A,31H ;与结果低位相加
JNC SQUD2 ;没有进位转
INC 30H ;有进位高位加1
SQUD2:
INC R0 ;地址加1
DJNZ R7,SQUD1 ;判断5个数是否加完
MOV R7,#2
SQUD3:
MOV A,30H ;高低位送A
RRC A ;带进位循环右移
MOV 30H,A ;回送30H
MOV A,31H ;低位送A
RRC A ;带进位循环右移完成一次除2
DJNZ R7,SQUD3 ;共移两次相当于除4
MOV 32H,A ;结果存32H
RET
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询