标题: 关于C语言在for语句循环赋值的作用? [打印本页]

作者: 代码虾1    时间: 2019-4-10 14:55
标题: 关于C语言在for语句循环赋值的作用?
1 谁能给解释一下这个C语言 for语句用法的意义
for(ld=9;ld>0;ld--)
      {
       ld1_buffer [ ld ]   =  ld1_buffer [ ld-1 ];
      }
2.这个定时器的用法意思是什么啊???

       (TH0<<8)|TL0)


谁能给解释一下呗,快想的脑瓜子炸了

作者: 疯子本人    时间: 2019-4-10 17:00
第一个那个ld1_buffer应该是个数组,用for循环的方式把整个数组从尾到头打印出来(把数组前一个赋给后一个数),第二个是TH0左移八位,然后再按位或上TL0
作者: 此刻尽言    时间: 2019-4-10 17:04
1. ld1_buffer [ 9 ]   =  ld1_buffer [ 8 ]
作者: 此刻尽言    时间: 2019-4-10 17:06
1. ld1_buffer [9]   =  ld1_buffer [ 8]........ ld1_buffer [ 2]   =  ld1_buffer [ 1 ]。2.高8位加低8位,即将8位为转换成16位为
作者: cm小明    时间: 2019-4-10 17:19
第1个问题:相当于将数组ld1_buffer整个向右移位1位,如ld1_buffer[9]变为d1_buffer[8],d1_buffer[8]变为d1_buffer[7],......,d1_buffer[1]变为d1_buffer[0]。但是这段代码并没有处理d1_buffer[0],则d1_buffer[0]还是保持原值。运行过这个for循环后,d1_buffer[1]和d1_buffer[0]会是同一个值,楼主需要注意。
第2个问题:有些较大的数值如707(表示成二进制位:10 1100 0011,则至少需要10个bit位来存储,在单片机中则是用2字节=16bit,存储为:(0000 0010 1100 0011)。但51单片机是8位的,一个寄存器只有8位,对于这个707数值则需要两个寄存器来存储,TH0存储高8位(0000 0010),TL0用来存储低8位(1100 0011)。在还原707这个数值时就需要将TH0左移8位,变成(0000 0010 0000 0000),“|”是按位或的符号,再与TL0相或,得到(0000 0010 1100 0011)。楼主问题中的TH0与TL0应该是用来测量某个值得到的数值,  (TH0<<8)|TL0就是将这个数值恢复成一个完整的数罢了。
作者: king_zxt    时间: 2019-4-10 18:01
1.数组 ld1_buffer [ 9 ] = ld1_buffer [8 ] ..相当于数组整体右移一位,但是ld1_buffer [0 ]不变,2.把TH0和TL0合并成一个16位数据,相当于TH0*256+TL0
作者: dukeyi    时间: 2019-4-10 18:37
没有详细的程序,只能简单分析一下。第一个程序常见于滑动平均滤波之中,建立一个数组储存上连续几次的数据,取其平均值作为结果,新数据进来的时候要将前面的数据移出去,这个就是移出去的过程,将数组的最后一个元素移出去。第二个则是将TH0左移8位,然后再或TL0,等价于TH0 * 256 + TL0其主要目的是为了获取计数值,因为定时器0在虽然是一个16位定时器,但是计数的时候要分成两个八位寄存器,所以要获取最终的计数值要经过这样的运算。
作者: louis333    时间: 2019-4-10 19:44
5#回答的比较精辟
作者: 1246698540    时间: 2019-4-10 21:34
先ld=9;判断,如果符合进入循环,循环完一次后,进行id--;重复进行,直到不符合条件退出循环。
作者: hls123    时间: 2019-4-10 21:56
原 ld1_buffer [ 9 ]   =  ld1_buffer [ 8 ];
原 ld1_buffer [ 8 ]   =  ld1_buffer [ 7 ];。。。。。以此类推,直到ld1_buffer [ 1 ]   =  ld1_buffer [0];

  (TH0<<8)|TL0)是左移8位
作者: ccc743623660    时间: 2019-4-11 11:00
第一个是数组的循环右移,直至ld1_buffer [1]=ld1_buffer [0];
第二个则是逻辑运算中的或运算,按位或,将8位变16位
作者: 代码虾1    时间: 2019-4-11 14:57
dukeyi 发表于 2019-4-10 18:37
没有详细的程序,只能简单分析一下。第一个程序常见于滑动平均滤波之中,建立一个数组储存上连续几次的数据 ...

下面是部分程序的完整版,谢谢你给的解答瞬间明白了。这个就是获取一个数据十次,新数据进来就会把旧数据排除出去,添加新数据并重新算平均值,是这样解释吗。
定时器的是获取定时的时间从脉冲发出到接受到返回的脉冲中间持续的时间长短。

还有其它的方法可以一次获取十次数据在求平均值的吗???
                        if(ch==7)               
                                {               
                                A7= ADC_RES;B7= ADC_RESL;
                                if((A7>ad_bjz))                                          //ad_bjz=0x2a     42
                                        {
                                        TR0=0;
                                        for(ld_xhcount=9;ld_xhcount>0;ld_xhcount--)
                                                {
                                                 ld1_buffer[ld_xhcount]=ld1_buffer[ld_xhcount-1];
                                                }
                                        ld1_buffer[0]= ((TH0<<8)|TL0)*0.009;       
                                        if(( ((TH0<<8)|TL0)*0.009)>0xfe)
                                                {
                                                ld1_buffer[0]= 0xfe;
                                                }
                                        else
                                                {
                                                ld1_buffer[0]= ((TH0<<8)|TL0)*0.009;
                                                }
                                        ad_ld2flag=0;
                                        }
                                AD7_buffer[0]=A7;
                                }
作者: 代码虾1    时间: 2019-4-11 15:02
cm小明 发表于 2019-4-10 17:19
第1个问题:相当于将数组ld1_buffer整个向右移位1位,如ld1_buffer[9]变为d1_buffer[8],d1_buffer[8]变为d ...

谢谢解除了我的疑惑。怎样解决数组d1_buffer[0]和d1_buffer[1]重复的问题啊!是只要将ld最大值写成10就可以解决吗

作者: robinsonlin    时间: 2019-4-11 16:13
此刻尽言 发表于 2019-4-10 17:06
1. ld1_buffer [9]   =  ld1_buffer [ 8]........ ld1_buffer [ 2]   =  ld1_buffer [ 1 ]。2.高8位加低8位 ...

我还以为楼主的问题很特别,原来你的回答更加的特别。妙!!!
作者: Sluvian    时间: 2019-4-11 18:32
代码虾1 发表于 2019-4-11 15:02
谢谢解除了我的疑惑。怎样解决数组d1_buffer[0]和d1_buffer[1]重复的问题啊!是只要将ld最大值写成10就可 ...

ld1_buffer[0]之前没有值了,所以这个循环无法给d1_buffer[0]赋值,你直接在循环结束复制就好了呀




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1