找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3277|回复: 14
打印 上一主题 下一主题
收起左侧

关于C语言在for语句循环赋值的作用?

  [复制链接]
回帖奖励 150 黑币 回复本帖可获得 30 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:394056 发表于 2019-4-10 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 谁能给解释一下这个C语言 for语句用法的意义
for(ld=9;ld>0;ld--)
      {
       ld1_buffer [ ld ]   =  ld1_buffer [ ld-1 ];
      }
2.这个定时器的用法意思是什么啊???

       (TH0<<8)|TL0)


谁能给解释一下呗,快想的脑瓜子炸了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:405033 发表于 2019-4-10 17:00 | 只看该作者
第一个那个ld1_buffer应该是个数组,用for循环的方式把整个数组从尾到头打印出来(把数组前一个赋给后一个数),第二个是TH0左移八位,然后再按位或上TL0
回复

使用道具 举报

板凳
ID:508932 发表于 2019-4-10 17:04 | 只看该作者
1. ld1_buffer [ 9 ]   =  ld1_buffer [ 8 ]
回复

使用道具 举报

地板
ID:508932 发表于 2019-4-10 17:06 | 只看该作者
1. ld1_buffer [9]   =  ld1_buffer [ 8]........ ld1_buffer [ 2]   =  ld1_buffer [ 1 ]。2.高8位加低8位,即将8位为转换成16位为
回复

使用道具 举报

5#
ID:154461 发表于 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就是将这个数值恢复成一个完整的数罢了。

评分

参与人数 1黑币 +10 收起 理由
代码虾1 + 10

查看全部评分

回复

使用道具 举报

6#
ID:198530 发表于 2019-4-10 18:01 | 只看该作者
1.数组 ld1_buffer [ 9 ] = ld1_buffer [8 ] ..相当于数组整体右移一位,但是ld1_buffer [0 ]不变,2.把TH0和TL0合并成一个16位数据,相当于TH0*256+TL0
回复

使用道具 举报

7#
ID:326333 发表于 2019-4-10 18:37 | 只看该作者
没有详细的程序,只能简单分析一下。第一个程序常见于滑动平均滤波之中,建立一个数组储存上连续几次的数据,取其平均值作为结果,新数据进来的时候要将前面的数据移出去,这个就是移出去的过程,将数组的最后一个元素移出去。第二个则是将TH0左移8位,然后再或TL0,等价于TH0 * 256 + TL0其主要目的是为了获取计数值,因为定时器0在虽然是一个16位定时器,但是计数的时候要分成两个八位寄存器,所以要获取最终的计数值要经过这样的运算。

评分

参与人数 1黑币 +10 收起 理由
代码虾1 + 10

查看全部评分

回复

使用道具 举报

8#
ID:509060 发表于 2019-4-10 19:44 | 只看该作者
5#回答的比较精辟
回复

使用道具 举报

9#
ID:385135 发表于 2019-4-10 21:34 | 只看该作者
先ld=9;判断,如果符合进入循环,循环完一次后,进行id--;重复进行,直到不符合条件退出循环。
回复

使用道具 举报

10#
ID:509148 发表于 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位
回复

使用道具 举报

11#
ID:509387 发表于 2019-4-11 11:00 | 只看该作者
第一个是数组的循环右移,直至ld1_buffer [1]=ld1_buffer [0];
第二个则是逻辑运算中的或运算,按位或,将8位变16位
回复

使用道具 举报

12#
ID:394056 发表于 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;
                                }
回复

使用道具 举报

13#
ID:394056 发表于 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就可以解决吗
回复

使用道具 举报

14#
ID:451718 发表于 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位 ...

我还以为楼主的问题很特别,原来你的回答更加的特别。妙!!!
回复

使用道具 举报

15#
ID:337204 发表于 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]赋值,你直接在循环结束复制就好了呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表