74hc595驱动4位数码管电路连接图及程序解析

电子常识

2585人已加入

描述

      本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。74HC595部分电路图如下:

  74HC595

  与单片机相连接的三个脚分别为: HC_DAT,HC_RCK,HC_CLK。两片595采用级联方式,即U2的第9脚接到U3的第14引脚。

  74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。其管脚介绍如下:

  15: 数据输出A-接数码管数据A段;

  l: 数据输出B-接数码管数据B段;

  2: 数据输出C-接数码管数据C段;

  3: 数据输出D-接数码管数据D段;

  4: 数据输出E-接数码管数据E段;

  5: 数据输出F-接数码管数据F段;

  6: 数据输出G-接数码管数据G段;

  7: 数据输出H-接数码管数据H段;

  16: 电源正脚-接电源正;

  8: 电源负脚=接电源负;

  14: 数据输入脚-接单片机管脚;

  12: 数据锁存时钟-接单片机管脚;

  11: 数据输入时钟-接单片机管脚;

  13: 使能输出脚-低电平有效,接低电平;

  10 :数据清零-不清零,接高电平;

  9:数据级联输出-接下一片595的数据输入脚

  74hc595时序图

  通过时序可以看出:

74HC595

  SCK是上升沿的时候要把数据写入;

  RCK是上升沿的时候数据才能锁存显示;

  有数据操作的过程中RESET必须是高电平;

  EN必须是低电平,595才能工作;

  知道了以上4点就可以写程序了。其中3、4条是硬件连接上的事情(也可以用单片机的IO口来连接,这样的话可以随时控制74HC595的工作与否情况)。写程序主要靠1、2条。下面具体操作。

  74hc595驱动4位数码管电路连接图

74HC595

  74hc595驱动4位数码管程序解析

  //MCU:AT89S52

  //晶振:11.0592M.

  //采用4位共阳极数码管

  #include 《regx51.h》

  //#include 《INTRINS.H》

  #define uint unsigned int

  #define uchar unsigned char

  #define nop() _nop_();_nop_();

  sbit CLK=P2^0;

  sbit DAT=P2^1;

  sbit RCLK=P2^2;

  sbit CS1=P2^3;

  sbit CS2=P2^4;

  sbit CS3=P2^5;

  sbit CS4=P2^6;

  uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0};//0-9,-,全灭,全亮——共阳极数码管

  void write595(unsigned char word)

  {

  uchar num,c;

  num=tab[word];

  for(c=0;c《8;c++)

  {

  CLK=0;

  DAT=num&0x80;

  num=num《《1;

  CLK=1;

  }

  RCLK=0;

  // nop();

  // nop();

  RCLK=1;

  }

  void select1(void)

  {

  CS1=0;

  CS2=1;

  CS3=1;

  CS4=1;

  }

  void select2(void)

  {

  CS1=1;

  CS2=0;

  CS3=1;

  CS4=1;

  }

  void select3(void)

  {

  CS1=1;

  CS2=1;

  CS3=0;

  CS4=1;

  }

  void select4(void)

  {

  CS1=1;

  CS2=1;

  CS3=1;

  CS4=0;

  }

  int main(void)

  {

  //unsigned char i;

  while(1)

  {

  write595(12);

  select1();

  //for(i=0;i《10;i++) _nop_();

  write595(2);

  select2();

  //for(i=0;i《10;i++) _nop_();

  write595(3);

  select3();

  //for(i=0;i《10;i++) _nop_();

  write595(4);

  select4();

  //for(i=0;i《10;i++) _nop_();

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分