找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于单片机中的一点C语言的问题

查看数: 3476 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-5-16 21:17

正文摘要:

这是ds1302中写字节的一部分,我想问问这部分里边的这个for循环,里边的那个dat一次不是只能传输一个位吗?最终是怎么传出来一个字节的呢?每次循环不应该都重新来了吗?所以就不懂了,麻烦看见的帮我解答解答,万分 ...

回复

ID:296970 发表于 2018-5-23 20:55
取最低位,传一位移一位,八次
ID:336678 发表于 2018-5-23 19:10
是每次传送一bit,传8次就是一个Byte了。如果要传输很多Byte,就连续调用这个循环。
ID:295783 发表于 2018-5-23 10:13
从你给的程序上第一句看,dat是8位,不是一位。
从最低位开始传
DSIO是一位,当DSIO=dat时,自动取低位。
所以你就可以看到八位数啦
希望对你能有帮助
ID:68143 发表于 2018-5-17 08:58

仔细理解下这两句
ID:68143 发表于 2018-5-17 08:54
每次传输一个位,循环8次不正好一个字节吗
ID:305599 发表于 2018-5-17 08:50
一个字节是8位。for循环里面循环8次,每一次循环把dat里面的数据给DSIO寄存器,然后dat获得value右移一位后的数据,8次共传输一个字节。for循环8次后,进入下一个函数。
ID:213173 发表于 2018-5-17 07:44
134849694164151 发表于 2018-5-17 00:33
图片里的东西在这里
for (i=0; i>= 1;                                   // 把addr右移一位
        }

就像8个人排队跳水,一次只跳下一个,后面的人依次向前移动一位,直至跳完。addr >>= 1; // 把addr右移一位
ID:164602 发表于 2018-5-17 07:23
134849694164151 发表于 2018-5-17 00:33
图片里的东西在这里
for (i=0; i>= 1;                                   // 把addr右移一位
        }

从你给的程序上看,dat是8位,不是一位。
主要是你想不通:为什么一个8位数据去给一个一位赋值?!
其实很简单:DSIO是一位,当DSIO=dat时,自动取低位。
你自己可以做实验的:对一个unsigned char 型变量,赋值0x1234,你会发现,最后得到的自动就是0x34,高位自动去掉了。
ID:329253 发表于 2018-5-17 00:33
        图片里的东西在这里
for (i=0; i<8; i++)
        {
                dat = addr & 0x01;                 // SPI是从低位开始传输的
                DSIO = dat;                                 // 把要发送的bit数据丢到IO引脚上去准备好
                SCLK = 1;                                 // 制造上升沿,让DS1302把IO上的值读走
                delay();                                // 读走之后,一个小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是为了给下一个小周期做准备
                delay();
                addr >>= 1;                                   // 把addr右移一位
        }
        // 第3部分: 写入第2字节,value
        for (i=0; i<8; i++)
        {
                dat = value & 0x01;                 // SPI是从低位开始传输的
                DSIO = dat;                                 // 把要发送的bit数据丢到IO引脚上去准备好
                SCLK = 1;                                 // 制造上升沿,让DS1302把IO上的值读走
                delay();                                // 读走之后,一个小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是为了给下一个小周期做准备
                delay();
                value = value >> 1;                   // 把addr右移一位
        }

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

Powered by 单片机教程网

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