找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C语言程序问题,新手小白求指教

[复制链接]
跳转到指定楼层
楼主
for(a=0;a<8;a++)
{
SER= dat >>7;//从最高位开始发送
dat<<=1;
SRCLK =0;//发送时序
_nop_();
_nop_();
SRCLK = 1;
}
程序是这样的
那这个程序的含义是不是每当SRCLK由0变为1的时候就把一位数据输入到SER中呢求前辈指
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2021-7-23 15:48 | 只看该作者
看代码不能截头截尾,这是DS1302的写入代码吧? 还是595的?
正确解释应该是
先把一位数据放到SER脚输出
然后用SRCLK脚输出一个下降沿
等待两个时钟周期
把SRCLK脚还原高电平

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:955868 发表于 2021-7-23 16:17 来自手机 | 只看该作者
lkc8210 发表于 2021-7-23 15:48
看代码不能截头截尾,这是DS1302的写入代码吧? 还是595的?
正确解释应该是
先把一位数据放到SER脚输 ...

感谢指教可我还是有一个点不太懂
          SRCLK=0;
                 _nop_();
            _nop_();
               SRCLK=1;
SRCLK是一个移位寄存器,为什么要输入一个下降沿呢?具体实现了什么作用?(刚刚学这个,很多东西都不知道,见谅)
具体代码如下
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit LED=P0^7;
u8 ledNum;

void Hc595SendByte(u8 dat)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;

        for(a=0;a<8;a++)                 //发送8位数
        {
                SER = dat >> 7;                 //从最高位
                dat <<= 1;
                SRCLK=0;
                     _nop_();
                _nop_();
                    SRCLK=1;
       
        }
        RCLK=0;
        _nop_();
        _nop_();
        RCLK=1;
}
void delay(u16 i)
{
        while(i--);
}
void main()
{
        LED=0;
        ledNum = ~0x01;
        while(1)
        {
        Hc595SendByte(ledNum);
        ledNum=_crol_(ledNum,1);
        delay(100000);
        }
}
就是控制8*8LED矩阵的一列的一个程序
回复

使用道具 举报

地板
ID:824490 发表于 2021-7-23 16:21 | 只看该作者
刚好看到一个时序图
这类串行传送数据的,要按时序图来。
正确的做法是
1、时钟置低       SRCLK =0;
2、准备好数据    SER= dat >>7;
3、延时 (可选,目的是要建立可靠的数据保持时间)
4、时钟置高       SRCLK =1;    //传出1bit
5、数据移位       dat<<=1;

这样代码会更符合时序要求。

串行传输,简单地说就是:在CLK的上升沿(个别是下降沿),把SDA上的数据传出(或读入)。
回复

使用道具 举报

5#
ID:844772 发表于 2021-7-23 16:49 | 只看该作者
机械嗷嗷嗷 发表于 2021-7-23 16:17
感谢指教可我还是有一个点不太懂
          SRCLK=0;
                 _nop_();

对CLK的时序要求都是手册要求的,不用管为什么,看手册时序图就可以了。但你搞错一个事,按你程序是时钟置高时准备SER的数据,置低时把SER发送出去,一次只能发1位。
回复

使用道具 举报

6#
ID:161164 发表于 2021-7-23 16:57 来自手机 | 只看该作者
名字不是重点 发表于 2021-7-23 16:21
刚好看到一个时序图
这类串行传送数据的,要按时序图来。
正确的做法是

没错~是上升沿才对

Screenshot_2021-07-23-16-53-46-189_com.google.android.apps.docs~01.jpg (98.86 KB, 下载次数: 29)

Screenshot_2021-07-23-16-53-46-189_com.google.android.apps.docs~01.jpg
回复

使用道具 举报

7#
ID:123289 发表于 2021-7-23 17:16 | 只看该作者
你可以这样理解!
实际上是需要看电路是如何连接的。即硬件设计。
回复

使用道具 举报

8#
ID:844772 发表于 2021-7-23 17:37 | 只看该作者
lkc8210 发表于 2021-7-23 16:57
没错~是上升沿才对

你看楼主程序延时的位置跟你说的正好相反,所以我说按这个程序,是clk置低时发数据。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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