打印

请教单片机中求几个数的平均数程序如何实现?

[复制链接]
5930|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forsuccess|  楼主 | 2007-8-1 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如 单片机 ACC寄存器 最大可储存 数为 99
有五个数,分别为 81、 82、 83、 84、 85
现在要求这五个数的平均数。
如果直接把这五个数相加,会溢出,再除以5肯定不对了。
那么
   1、是把每个数除以5再相加吗?
   2、除以5怎么实现呢?一般只能通过右移实现除以2、4、8等的啊?
谢谢指教。

相关帖子

沙发
gjg191| | 2007-8-1 15:20 | 只看该作者

dd

可以把1/5 约等于成1/8+1/16+1/64 不过比较麻烦 用c就简单多了

使用特权

评论回复
板凳
ayb_ice| | 2007-8-1 15:20 | 只看该作者

想办法不让它溢出...

使用特权

评论回复
地板
maychang| | 2007-8-1 15:26 | 只看该作者

问这个的还真是少见

加的时候,多字节加,楼主的问题应该是二字节加。
除以5,移位减,每次都要判断一下够减不够,和小学生用铅笔做竖式除法差不多。

使用特权

评论回复
5
computer00| | 2007-8-1 15:30 | 只看该作者

改成C语言写程序....

使用特权

评论回复
6
lbx_00| | 2007-8-1 19:57 | 只看该作者

lz也太懒了,

双字节的加法和除法都不愿意做

使用特权

评论回复
7
平常人| | 2007-8-1 20:13 | 只看该作者

嘿嘿,不愿意做双字节的加法和除法不要紧

拿第一个数做为基数,以后每个数与第一个数的差求和在除以5,把结果加到第一个数上就得到了平均值。

A0=81, A1=82, A2=83, A3=84, A4=85
sum=(A1-A0)+(A2-A0)+(A3-A0)+(A4-A0)=10
平均值=A0+sum/5=83

为防止sum溢出,可以每做一次减法(An-A0)后就做一次除法;而除法可以用循环减实现,循环减的次数即为商。

使用特权

评论回复
8
forsuccess|  楼主 | 2007-8-1 21:09 | 只看该作者

不是啊

   回六楼,我不是懒啊,我有如下思路,但不知道是否简洁可行,故向各位高手讨教,我思路如下:
   在RAM里开辟两个字节的空间,利用这两个字节空间来存这几个数,利用进位加法,可以算出五个数总和。我算了一下,这样空间足够。
   至于五个数平均数,我和2楼思路一样。

感谢7楼回复,我想过这个问题,但觉得有如下麻烦地方:
五个数开始不知道那个数最小,必须进行算出最小数才方便,否则涉及接位减法,也很麻烦,况且五个数求最小数,花费时间可不少。

四楼第一个答复好像是我的意思,他的第二个答复我 没有看懂懂。

使用特权

评论回复
9
diannaoza| | 2007-8-1 23:45 | 只看该作者

竖式除法差

这个有点意思

使用特权

评论回复
10
平常人| | 2007-8-2 08:15 | 只看该作者

计算过程中得到负数时就在A0上加一,再在sum上加5就可以了

我这个办法保证在8位运算的基础上不会有溢出,还避免了双字节的加法和除法运算。

使用特权

评论回复
11
GosTRider| | 2007-8-2 09:02 | 只看该作者

整数部分相加,乘2;小数部分正常处理

使用特权

评论回复
12
GosTRider| | 2007-8-2 09:35 | 只看该作者

错了,嘿嘿

十位相加乘2+正常的个位数相加除5

使用特权

评论回复
13
xc_cz| | 2007-8-2 12:16 | 只看该作者

我也有个思路

把每个数先除以5,把余数相加后再除以5,直到余数小于5为止.然后把所有的商相加.那么这个和就是5个书的平均数.如果需要四舍五入,只要判断最后的余数是否大于2.5 

使用特权

评论回复
14
mqy1977| | 2007-8-2 16:21 | 只看该作者

越来越复杂了

使用特权

评论回复
15
zusen| | 2007-8-2 18:12 | 只看该作者

哈哈

mov a,(81+82+83+84+85)/5

哈哈哈,如果是动态的就不行了

使用特权

评论回复
16
conwh| | 2007-8-2 23:04 | 只看该作者

没什么好说的,如果里面有1和255就只有加了

使用特权

评论回复
17
dengm| | 2007-8-3 09:08 | 只看该作者

人家是 bcd, X/5 就是 X*2 / 10

使用特权

评论回复
18
dengm| | 2007-8-3 09:35 | 只看该作者

如果为bin可以这样(51 asm)

   ; 256 = 51 * 5 + 1

AVE5:  
     ; SUM(DATA_BUF) = A*5 + B  
     MOV R0, #DATA_BUF
     MOV R2, #5
     CLR A
     MOV R3, A
AVE5LP:
       ADD A, @R0
       INC R0
       JNC AVE5L1
         INC A 
         XCH A, R3
         ADD A, #51
         XCH A, R3
AVE5L1:
    DJNZ R2, AVE5LP
    MOV B, #5
    DIV AB
    ADD A, R3
    RET

使用特权

评论回复
19
dengm| | 2007-8-3 12:01 | 只看该作者

BCD (ASM 51)

AVE5:  
     ; SUM(DATA_BUF) = A*5 + B  
     MOV R0, #DATA_BUF
     MOV R2, #5
     CLR A
     MOV R3, A
AVE5LP:
       ADD A, @R0
       INC R0
       DA A
       JNC AVE5L1
         INC R3
AVE5L1:
    DJNZ R2, AVE5LP
    ADD A, ACC
    DA A
    XCH A, R3
    RLC A
    SWAP A
    XCH A, R3
    MOV B, A
    ANL A, #1110B
    RR A
    XCH A, B
    SWAP A
    ANL A, #0FH
    ORL A, R3
    RET

        

    
    RET

使用特权

评论回复
20
一无所知| | 2007-8-4 09:05 | 只看该作者

不错啊,7楼平常人的方法很好啊~~

~~象一个漏斗~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

69

帖子

0

粉丝