您的位置:首页 > 编程语言 > C语言/C++

基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例

2017-05-29 09:44 591 查看
1、本例中利用一片595控制一个数码管显示。实现了利用3个IO口控制8位数据的输出

2、74HC595的控制端口:

1)SH_CP(11脚):移位时钟脉冲输入端。在上升沿时移位寄存器将数据移位

2)DS(14脚):串行数据输入端。本例通过移位运算将每次移位的数据送到PWD寄存器的进位标志位CY,CY再将值传递给DS引脚,8次移位后完成一个字符的串行传送。

3)ST_CP(12脚):锁存脉冲控制端,在上升沿时移位寄存器的数据被传入存储寄存器,这时如果OE端为低电平,传入存储器的数据会直接输出到输出端Q0-Q7。本例在一个字节的移位操作完成后,通过在ST_CP端产生一个上升沿将数据送出。

4)/MR(10脚):低电平时将移位寄存器数据请0.一般情况下接VCC

5)/OE(13脚):高电平时输出端禁止输出(高阻态)。低电平时允许数据输出

 

使用74HC595的优点是能锁存数据,这样在移位过程中可以保持输出端的数据不变。而74HC164则没有这种功能。

//利用74HC595实现端口扩展

#include <reg51.h>   //  寄存器头文件包含

#include <intrins.h>  //  空操作函数,移位函数头文件包含

sbit SH_CP = P2^0;   //移位时钟脉冲端口

sbit DS = P2^1;    // 串行数据输入端口

sbit ST_CP = P2^2;   //锁存端口

unsigned char temp;

unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

                                    //数码管段码表

//延时函数

void delayms(unsigned int x)

{

  unsigned char i;

 while(x--)

 {

   for(i = 0;i < 120;i++);

 }

}

//串行输入函数

void input_595(void)

{

  unsigned char i;

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

 {

   temp <<= 1;     // 数据移位

  DS = CY;     //产生一个时钟上升沿,使数据移位

  SH_CP = 1;    //

  _nop_();

  _nop_();

  SH_CP = 0;

 }

}

//数据并行输出函数

void output_595(void)

{

  ST_CP = 0;     // 锁存器端口产生一个上升沿,将数据输出

 _nop_();

 ST_CP = 1;

 _nop_();

 ST_CP = 0;     //锁存数据

}

//

void main(void)

{

  unsigned char i;

 while(1)

 {

   for(i = 0;i < 10;i++)

  {

    temp = disp_buff[i];  //数码管显示

   input_595();    //将一个字节的数据串行输入595

   output_595();    //595移位寄存器数据传输到存储寄存器,并输出到数据端口

   delayms(500);

  }

 }

}

3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件

 

4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示



5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐