51单片机加74hc595驱动多个数码管静态显示的程序设计

这是原理图请各位高手指点一下。我想可以任意控制一个数码管显示数值

1、首先数码管分为1位,4位,8位,4位和8位的又分为共阴和共阳数码管。

2、共阳数码管,即阳极全部连接在一起,单片机接口给低电位即可点亮对应的段位。

3、可利用MCS-51系列单片机的芯片AT89C52的P3.4,P3.5,P3.6,P3.7进行计时并在数码管上显示时间,作为按键的入口。

4、共阴数码管,即阴极全部连接在一起,单片机接口给高电位即可点亮对应的段位。

5、其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-24
每一片74HC595都需要串行输入8位数的段码,数码管才能显示,而且4片595是串联使用的,所以,想控制任意一个数码管的显示,都必须一次串行输入4个数码管的段码才行,即串行输入4X8=32位数,而且是DIS4的段码在前,DIS1的段码在后,每个段码的8位数要求是高位在前,低位在后,即先输出最高位,后输出最低位。追问

本人是菜鸟级别的,能否帮忙提供一个程序示例。

追答

给一个仿真图,给出的程序是在这个仿真图上测试通过的,与你显示电路很相似,所以,显示子程序可以移植的,但是HC595的引脚需要重新定义的。

程序:

#include <reg52.h>
#include <INTRINS.H>
sbit sclk=P1^7;     //HC595第11脚,串行时钟输入端
sbit sdat=P1^6;     //HC595第14脚,串行数据输入端
sbit cpla=P1^5;     //HC595第12脚,输出锁存脉冲输入端
sbit ins1=P3^2;     //外接按钮
unsigned char dis[]={0,1,2,3,4};   //定义显示缓冲区4个单元
unsigned char code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
     0x27,0x7F,0x6F}; //定义共阴数码管段码

//*串行输出一个字节子函数
void hc595(unsigned char word)
{
  unsigned char i;
  for (i=8;i>0;i--) 

  {
  sclk=0;
  sdat=0x80&word;
  word=_crol_(word,1);
  sclk=1;
  _nop_();
  }
}
//**显示子函数**//
void display()
{
 unsigned char j;
 for (j=4;j>0;j--)
 {
 hc595(segment[dis[j]]);
 }
 cpla=1;
    _nop_(); 
 cpla=0;
 }
//****主函数****//
void main()
{
unsigned char j;
cpla=0;
while (1)
{
 display();              //调用显示子程序
 if(ins1==0)             //按一次键,每位显示数加1
 {
  for(j=1;j<4;j++)
  dis[j]=dis[j+1];
  dis[4]++;
  if(dis[4]>9)dis[4]=0;
  while(ins1==0);
 }
   }
}

其中的主函数你不用,其余两个子函数是可以移植的。

追问

怎么控制某一位数码管显示,例如只要一个数码管显示数字其他的不显示

追答

既然用了4位数码管,可为什么只显示一位呢?这实现这个要求也很简单的,定义段码表时,再加一个全灭的段码就好了,全灭的段码是0,在段码表中排第10,所以,哪一位灭,就在哪一位的显示缓冲区写入0:

例如,只在第一位显示1时,定义显示缓冲区如下:其余三位为灭

unsigned char dis[]={0,1,10,10,10};   //定义显示缓冲区4个单元,第一个单元为空
unsigned char code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
     0x27,0x7F,0x6F,0}; //定义数字0-9共阴数码管段码,最后一个为灭的段码

为了显示效果,主程序也改成如下的:

//****主函数****//
void main()
{
unsigned char j,n=1,i=1;
cpla=0;
while (1)
{
 display();   //调用显示子程序
 if(ins1==0)  //按一次键,显示下一位
 {
 i++;if(i>4)i=1; //要显示的位
 n++;if(n>9)n=0; //要显示的数
 for(j=1;j<5;j++)
 dis[j]=10;   //灭掉所有位
 dis[i]=n;    //第i位显示n
 while(ins1==0);
 }
   }
}

效果图

本回答被提问者和网友采纳
第2个回答  2014-09-10
想要让某一位亮、灭,而不影响其它位正常显示,可见:

http://hi.baidu.com/do_sermon/item/e799050b28e6b03df3eafc84
第3个回答  2019-07-08
做完了没有?
相似回答