考资料教你74hc595时序图怎么看知识详解 - 电子常识 - 电子发烧友网
74HC595是串行输入并行/串行输出的移位锁存器。SHCP是移位脉冲,前沿(上升沿)有效,STCP是锁存脉冲,前沿有效,DS是输入信号,MR(低电平有效)清零,OE(低电平有效)输出使能,Q0-Q7并行输出,Q7S串行输出。
在移位脉冲SHCP的上升沿作用下,输入信号DS在芯片内部进行八次移位,STCP负责锁存,把移位信号保持在芯片内部,OE低电平时,移位后的信号从Q0-Q7八个脚并行输出,同时这八个脚上的信号也以串行的方式从Q7S脚依次输出。该脚输出的信号可作为下一个595的输入信号,理论上讲,可实现无限级联。
下图第一条竖线表示清零,第二三四竖线表示锁存与输出,第五至十竖线表示移位、锁存、输出,第十一竖线表示清零。
下图是2片595串联运行时的时序,由例子程序运行所得,数据脉冲,前八个移位脉冲与后八个移位脉冲,锁存脉冲:
下图单独写一个驱动595函数,数据为1时的时序:
下图为添加清零时序图:
搭建一个简单的595仿真,写一个简单的测试程序之后把程序仿真一下:
#include<reg52.h>//头文件
sbit shcp=P1^2;//数据输入时钟线 595的11脚
sbit stcp=P1^1;//输出存储器锁存时钟线 595的12脚
sbit ds=P1^0;//数据线 595的14脚
sbit mr=P1^3;//数据清零
void QuDong595(unsigned char sj)
{
char aa=8;
mr=0;//595清零
mr=1;
// sj=255-sj;//十进制取反
sj=(127+sj)/sj;//八位对应位移
while(aa--)
{
ds=sj%2;//数据发送
shcp=1;//上升沿发生移位 上升沿时数据寄存器的数据锁存。
shcp=0;
sj/=2;
}
stcp=0;
stcp=1;//上升沿将数据送到输出锁存器
stcp=0;
}
void main() //主函数
{
unsigned char aa=0;
unsigned int i=0;
while(1)
{
if(++i==0)QuDong595(++aa);
}
}
可见正确地仿真从1到255之间的变化,假如把代码mr=1;注释掉再仿真即可看到仿真的变化,从而证实时序图中标示的变化了,其他雷同,都可以变化代码进行仿真来学时序图表示的内容;对应第也可对照真值表一一对应起来看;当然了,为了能验证时序图之间的关系,还可以把OE引脚接到IO进行仿真观察,自然要观察Q0-7的输出在程序里面是无法做到的,只有对照仿真能体现出来,当固定一个值时,放慢循环可观察到如主函数内那样延时八个循环。修改代码控制使能,如下:
sbit oe=P1^4;//锁存使能
void QuDong595(unsigned char sj)
{
char aa=8;
mr=0;
mr=1;
while(aa--)
{
ds=sj%2;//数据发送
shcp=1;//上升沿发生移位 上升沿时数据寄存器的数据锁存。
shcp=0;
sj/=2;
}
stcp=0;
stcp=1;//上升沿将数据送到输出锁存器
stcp=0;
oe=1;//锁存使能
oe=0;
}
之下是发送4这个值的时序图:其实看这样的时序图更容易明白,不像找到的时序图对得太整齐了,有时还真分别不出对齐的部分到底是看成低电平还是高电平;从下图的时序可明显清晰地看出发送给595一个4这个值所处的高低电平00100000,当然如果使用十六进制数据和移位函数发送看到的也是一样的时序。
配合仿真图可看到Q0-Q7的输出:
.
程序运行的时序图与网络上找到的时序图不同的地方是发送八位后锁存输出与发送1位就锁存输出的区别.
兼顾回复请问C51单片机串转并74HC595的串行输入引脚的电平是怎么输入的? - 24小时必答区
数据电平由移位脉冲存储到芯片内这在芯片说明书上都是有文字描述和时序图示意的,送一个电平移入再送一个电平移入进行八次所以才是串口不是并行,至于数据是要移动7位或1位看电路需求而定,电路可以顺序或逆序连接。
兼顾回复https://ask.csdn.net/questions/7397729 只有启动后停止才生效
#include<reg52.h>//头文件
sbit shcp=P1^2;//数据输入时钟线 595的11脚
sbit stcp=P1^1;//输出存储器锁存时钟线 595的12脚
sbit ds=P1^0;//数据线 595的14脚
sbit mr=P1^3;//数据清零
sbit oe=P1^4;//锁存使能
sbit k1=P3^0;//
sbit k2=P3^1;//
unsigned char alt;//数据移动定时时间
void QuDong595(unsigned char sj)
{
char aa=8;
// mr=0;
mr=1;
// sj=255-sj;//取反
// sj=(127+sj)/sj;//八位对应位移
while(aa--)
{
ds=sj%2;//数据发送
shcp=1;//上升沿发生移位 上升沿时数据寄存器的数据锁存。
shcp=0;
sj/=2;
}
stcp=0;
stcp=1;//上升沿将数据送到输出锁存器
stcp=0;
// oe=1;
oe=0;
}
void zdsz()
{
// TMOD=0x01;//定时器0 模式1 16位定时模式
// TH0=(65536-10000)/256;//定时10.000ms
// TL0=(65536-10000)%256;
// ET0=1;//使能定时器0
// EA=1;//开启总中断
// TR0=1;//开始计数
}
void main() //主函数
{
unsigned char aa=0,xd=0;
unsigned int i=0;
bit k=0;
// zdsz();
while(1)
{
if(!k&&++xd==0&&k1==0)k=1;
if(k&&++xd==0&&k2==0)k=0;
if(k&&++i==0)
QuDong595(aa++);
}
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;//10.000ms 进入一次中断
TL0=(65536-10000)%256;
alt++;
}
按键不等待释放的例子,兼顾解决关于单片机驱动独立按键的几个问题,求分析 - 24小时必答区 问题
发送2次8位数据,可看到下面的数据往上移动. 单片机+两个74hc595驱动LED程序实在搞不懂了 求大神帮忙 - 24小时必答区
unsigned int QY(unsigned char sj, unsigned char jz)
{
return (sj-sj/jz*jz);
}
void QuDong595(unsigned char sj)
{
unsigned char aa=8, er[8];
while(aa--){er[aa]=QY(sj,2);sj/=2;}
while(++aa<8)
{
ds=er[aa];
// ds=sj&0x80;sj<<=1;//十六进制数据高位发送
// ds=QY(sj,2);sj/=2;//十进制数据低位发送
shcp=1;//上升沿发生移位 上升沿时数据寄存器的数据锁存。
shcp=0;
}
stcp=0;
stcp=1;//上升沿将数据送到输出锁存器
stcp=0;
}
QuDong595(ShuMa[j%10]%256);QuDong595(7);