找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
ID:329253 发表于 2018-5-16 21:17 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
10黑币
这是ds1302中写字节的一部分,我想问问这部分里边的这个for循环,里边的那个dat一次不是只能传输一个位吗?最终是怎么传出来一个字节的呢?每次循环不应该都重新来了吗?所以就不懂了,麻烦看见的帮我解答解答,万分感激

Screenshot_2018-05-16-21-07-21-52.png (139.08 KB, 下载次数: 64)

Screenshot_2018-05-16-21-07-21-52.png

评分

参与人数 1黑币 +10 收起 理由
cciejs12345 + 10 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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右移一位
        }
回复

使用道具 举报

板凳
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:213173 发表于 2018-5-17 07:44 | 只看该作者
134849694164151 发表于 2018-5-17 00:33
图片里的东西在这里
for (i=0; i>= 1;                                   // 把addr右移一位
        }

就像8个人排队跳水,一次只跳下一个,后面的人依次向前移动一位,直至跳完。addr >>= 1; // 把addr右移一位
回复

使用道具 举报

5#
ID:305599 发表于 2018-5-17 08:50 | 只看该作者
一个字节是8位。for循环里面循环8次,每一次循环把dat里面的数据给DSIO寄存器,然后dat获得value右移一位后的数据,8次共传输一个字节。for循环8次后,进入下一个函数。
回复

使用道具 举报

6#
ID:68143 发表于 2018-5-17 08:54 | 只看该作者
每次传输一个位,循环8次不正好一个字节吗
回复

使用道具 举报

7#
ID:68143 发表于 2018-5-17 08:58 | 只看该作者

仔细理解下这两句
回复

使用道具 举报

8#
ID:295783 发表于 2018-5-23 10:13 | 只看该作者
从你给的程序上第一句看,dat是8位,不是一位。
从最低位开始传
DSIO是一位,当DSIO=dat时,自动取低位。
所以你就可以看到八位数啦
希望对你能有帮助
回复

使用道具 举报

9#
ID:336678 发表于 2018-5-23 19:10 | 只看该作者
是每次传送一bit,传8次就是一个Byte了。如果要传输很多Byte,就连续调用这个循环。
回复

使用道具 举报

10#
ID:296970 发表于 2018-5-23 20:55 | 只看该作者
取最低位,传一位移一位,八次
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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