单片机初学者,求老师写一个74hc595控制两个数码管或流水灯的简单程序,参考参考,真心不懂该怎么

单片机初学者,求老师写一个74hc595控制两个数码管或流水灯的简单程序,参考参考,真心不懂该怎么,第1张

既然要用到74hc595,那么就要写一个595的驱动程序,以便后面的 *** 作简单化。

sbit hc595_si  =P2^5   //数据引脚

sbit hc595_sck =P2^4   //移位寄存器

sbit hc595_rck =P2^7   //输出寄存器

/*************595驱动*********************/

void HC595(unsigned char ch)

{

    unsigned char i

    for (i = 0 i < 8 i++)

    {

        hc595_si = (ch & 0x80)    //取写入数据的最高位送入595的数据引脚

        ch <<= 1      //相当于ch = ch << 1 数据左移1位,低位往高位移  

        hc595_sck=0   //送到移位寄存器

        hc595_sck=1

    }

    hc595_rck=0 

    hc595_rck=1//输出数据

}

做完这些,接下来只需要往595里写数据就可以了,例如:HC595(0xfe)则595芯片的Q0(最低位)输出端为“0”。可用仿真软件尝试一遍便知效果。

74HC595是在单片机系统中常用的芯片之一。它的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片,使用74HC595可以节约单片机的io口资源,用3个io就可以控制8个数码管的引脚,它还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器,应用非常广泛。我们先看一下图一74HC595的引脚图。

74HC595的数据端:

QA--QH(有的也叫Q0-Q7): 八位并行输出端,可以直接控制数码管的8个段,也可以直接控制8个LED。

QH': 级联输出端。通常我们将它接下一个595的SI端,实现多个芯片之间的级联。

SI: 串行数据输入端。

74hc595的控制端说明:

/SCLR(10脚): 低电平时将移位寄存器的数据清零。通常我们将它接Vcc。

SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。图二是74HC595脉冲图。

控制移位寄存器

SCK 上升沿 数据  移位        SCK 下降沿 数据  保持

RCK(12脚):上升沿时移位寄存器的数据进入存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲,更新显示数据。图三为74HC595真值表。

控制存储寄存器

RCK 上升沿,移位寄存器的数据进入存储寄存器。       RCK 下降沿,存储寄存器数据不变。

G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。数据在SHcp(见时序图)的上升沿输入,在STcp(见时序图)的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位。

寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出

(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使

能 OE时(为低电平),存储寄存器的数据输出到总线。

595具体使用的步骤:

第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。

方法:送位数据到_595。

第二步:目的:将位数据逐位移入74HC595,即数据串入

方法:SCK_595产生一上升沿,将PSI_595上的数据移入74HC595中.从低到高

第三步:目的:并行输出数据。即数据并出

方法:P1.1产生一上升沿,将由SI_595上已移入数据寄存器中的数据

送入到输出锁存器。

说明: 从上可分析:从SCK_595产生一上升沿(移入数据)和RCK_595产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。即可输出数据的 同时移入数据。

程序如下,复制就能用(因为我也是复制)。

sbit SI_595=P2^0

sbit RCK_595=P2^2

sbit SCK_595=P2^1

void HC595SendData(unsigned char SendVal)//发送数据

{

unsigned char i

for(i=0i<8i++)

{

if((SendVal<

else SI_595=0

SCK_595=0//从SCK_595产生一上升沿(移入数据)

_nop_()

_nop_()

SCK_595=1

}

}

void HC595ShowData()//RCK_595产生一上升沿(输出数据)

{

RCK_595=0

_nop_()

_nop_()

RCK_595=1

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11488392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存