找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2525|回复: 14
收起左侧

请问C51单片机串转并74HC595的串行输入引脚的电平是怎么输入的?

[复制链接]
ID:609281 发表于 2021-1-18 01:09 | 显示全部楼层 |阅读模式
          小弟我遇到一个单片机问题,其实本可以忽略掉继续开开心心码程序的,但秉着想冲硬件工程师这个物以稀为贵的职业的念头,打算钻一钻牛角尖。          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;
}
          这一个是例程中进行74HC595移位并输出的自定义函数,假设

回复

使用道具 举报

ID:752974 发表于 2021-1-18 08:53 | 显示全部楼层
595相应的口线和单片机相连,单片机用软件模拟串行IO口,比较灵活方便。因串口输出,不能按字节操作。
供参考:
for(i=0;i<8;i++)
    {
                SCLK = 0;       
                _nop_();               
                SDI = (bit)(dat&0x80);               
                _nop_();       
                dat = dat << 1;
                _nop_();
                  SCLK = 1;       
                  _nop_();               
    }

评分

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

查看全部评分

回复

使用道具 举报

ID:390416 发表于 2021-1-18 09:13 | 显示全部楼层
你好 你可以看看我这个贴子 http://www.51hei.com/bbs/dpj-201201-1.html 最好把资料也下载
回复

使用道具 举报

ID:332444 发表于 2021-1-18 09:51 | 显示全部楼层
数据电平由移位脉冲存储到芯片内这在芯片说明书上都是有文字描述和时序图示意的.
回复

使用道具 举报

ID:332444 发表于 2021-1-18 09:57 | 显示全部楼层
下图单独写一个驱动595函数,数据为1时的时序:
1.png

之下是发送4这个值的时序图:其实看这样的时序图更容易明白,不像找到的时序图对得太整齐了,有时还真分别不出对齐的部分到底是看成低电平还是高电平;从下图的时序可明显清晰地看出发送给595一个4这个值所处的高低电平00100000,当然如果使用十六进制数据和移位函数发送看到的也是一样的时序。
2.png

配合仿真图可看到Q0-Q7的输出:
3.png

程序运行的时序图与网络上找到的时序图不同的地方是发送八位后锁存输出与发送1位就锁存输出的区别.

评分

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

查看全部评分

回复

使用道具 举报

ID:609281 发表于 2021-1-18 20:02 | 显示全部楼层
munuc_w 发表于 2021-1-18 08:53
595相应的口线和单片机相连,单片机用软件模拟串行IO口,比较灵活方便。因串口输出,不能按字节操作。
供 ...

您好,请问为什么SDI = (bit)(dat&0x80);  会放在SCLK = 1的前面?SDI是串行输入口吧?移位寄存器不是应该在上升沿才有效吗?S小弟觉得 SDI = (bit)(dat&0x80); 应该放在SCLK = 1的后面?
回复

使用道具 举报

ID:609281 发表于 2021-1-18 20:10 | 显示全部楼层
xianfajushi 发表于 2021-1-18 09:57
下图单独写一个驱动595函数,数据为1时的时序:

您好,其实我想问的是,C51不是8位单片机么?我是理解成一个IO口比如P0^0,一次性可以输出八位二进制数,可是74HC595芯片的串行输入端是按位输出的,一个字节为八位,一个IO口输出8位怎么送进595的串行输入端。
回复

使用道具 举报

ID:609281 发表于 2021-1-18 20:33 | 显示全部楼层
本帖最后由 15119014737 于 2021-1-18 20:50 编辑

我的问题没有敲完,假设我想通过51传1011 1001给74HC595,首先是1011 1001右移七位,变为0000 0001,然后595的串行口接收0000 0001,然后移位寄存器来一个上升沿,LQA = 0,LQB = 1,LQC =。。。LQH=0,紧接着1011 1001左移一位,变为0111 0010,然后0111 0010右移七位变成0000 0000传给595的串行输入口,此时LQA=LQB=。。。。=LQH=0,这样不就相当于原来移位寄存器的值被清除掉了吗?我这种想法是认为595按字节串行输入,但其实串行输入都是按位输入的,可C51不是8位单片机吗?它的IO口不应该可以输出一个字节的数据吗?而且dat<<7本身也是一个字节的数,然后通过单片机引脚输入进595中,为啥595只会接收一个字节中的最低位?
回复

使用道具 举报

ID:609281 发表于 2021-1-18 20:35 | 显示全部楼层
我的问题没有敲完,假设我想通过51传10111001给74hc595,首先
回复

使用道具 举报

ID:609281 发表于 2021-1-18 20:48 | 显示全部楼层
我的问题没有敲完,假设我想通过51传1011 1001给74hc595,,首先将1011 1001右移七位,变为0000 0001并送进串行输入口,移位寄存器来一个上升沿,这时QA=0,QB=1,QC=QD=...=QH=0,然后将1011 1001左移一位变为0111 0010,同样的方法将0111 0010右移七位成0000 0000,并送进串行输入口,移位寄存器来一个上升沿,这时QA=...=QH=0,那么之间的QB = 1跑到哪里去了?我这种想法是认为595的串行输入口是按字节输入的,但其实串行输入口是按位输入的,可C51不是8位单片机吗?它的IO口不应该可以输出一个字节的数据吗?而且dat<<7本身也是一个字节的数,然后通过单片机引脚输入进595中,为啥595只会接收一个字节中的最低位?
回复

使用道具 举报

ID:332444 发表于 2021-1-18 21:03 | 显示全部楼层
送一个电平移入再送一个电平移入进行八次所以才是串口不是并行
回复

使用道具 举报

ID:213173 发表于 2021-1-18 21:06 | 显示全部楼层
15119014737 发表于 2021-1-18 20:35
我的问题没有敲完,假设我想通过51传10111001给74hc595,首先

这里解释的很详细:
https://baike.baidu.com/item/74HC595/9886491?fr=aladdin
回复

使用道具 举报

ID:332444 发表于 2021-1-19 07:56 | 显示全部楼层
至于数据是要移动7位或1位看电路需求而定,电路可以顺序或逆序连接。
回复

使用道具 举报

ID:609281 发表于 2021-1-19 22:26 | 显示全部楼层
xianfajushi 发表于 2021-1-18 21:03
送一个电平移入再送一个电平移入进行八次所以才是串口不是并行

感谢,我弄懂了
回复

使用道具 举报

ID:332444 发表于 2021-1-20 12:42 | 显示全部楼层
我的例子传送十进制值,可以取反,也可以位移.比如把00000001移位为10000000都可以通过十进制完成的.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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