找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 9421|回复: 9
收起左侧

单片机74hc595串行数码管时钟显示程序+Proteus仿真

  [复制链接]
ID:447891 发表于 2019-6-1 00:06 | 显示全部楼层 |阅读模式
分享给大家 简要:本文主要内容是用8051系列和74HC595构成的的数字钟的电路设计。
一、硬件设计
利用8951的端口进行控制74HC595的RCK,SCK和/G脚,控制显示部分的内容。为了节约89X51的端口,采用两片74HC595级联的方式,一片595控制八位数码管的段码端,一片595控制八位数码管的片选端,因此我们在选不同位数码管的同时,加以输入不一样的内容,这样我们采用动态显示的方法,可以利用八位数码管进行时钟显示的目的。因为595采用级联的方式,我们在给595数据的时候,应该先进行后联一片595的数据传输。举个例子,比方说我们采用第一片进行位选的控制,然后级联的一片595进行段码的输出。那么我们在向两片595采用数据传输的时候,就应该先进行数据显示的传输,而不是进行位选数据的传输。总之,我们要根据两片595的硬件设计不一样,在软件控制部分做好软件部分的设计。

0.png

图中共由三个部分构成,即:单片控制部分,数据传输显示部分和按键调整部分。
单片控制部分核心器件由8051系列构成,外围部分这里不给出。
数据传输显示部分又由两片74HC595和两个四位的数码管组成。
按键调整部分主要是三个按键,对秒,分,小时的校准和调节。

二、软件部分
  1. #include <AT89X51.H>
  2. unsigned int tcount;
  3. unsigned char m;
  4. static unsigned char second,minute,hour;

  5. unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6. unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  7. unsigned char  disbuf[8]={0,0,0,0,0,0,0,0};



  8. //数据传输//
  9. void sdata(void)
  10. {unsigned char b,c,num;

  11.          if(b==0)
  12.         {        
  13.           b++;
  14.         num=segbit[m];
  15.           for(c=0;c<8;c++)
  16.                   {P3_2=0;
  17.                    P3_3=num&0x80;
  18.                    num<<=1;
  19.                    P3_2=1;
  20.            }
  21.         
  22.         }

  23.         if(b==1)

  24.         {  
  25.             b--;
  26.           if(m==2||m==5)
  27.           {num=0xbf;}
  28.           else
  29.            {num=fseg[disbuf[m]];}

  30.                  for(c=0;c<8;c++)
  31.                    {  P3_2=0;
  32.                          P3_3=num&0x80;
  33.                          num<<=1;
  34.                          P3_2=1;
  35.                    }
  36.         
  37.         }
  38.              m++;
  39.              if(m==8)
  40.                  {m=0;
  41.                      }
  42. }
  43. //数据传输//

  44. //延时单位//

  45. void delay (unsigned char h)
  46.   {        while(h--);
  47.   }
  48.   //延时单位//


  49. //数据输出//
  50. void out(void)
  51. {P3_4=0;
  52.   delay(50);
  53.   P3_4=1;
  54. }
  55. //数据输出//

  56.   //按键控制//
  57.   void bcon(void)
  58.    {if(P3_5==0)
  59.      {delay(100);
  60.            if(P3_5==0)
  61.             {second=0;
  62.                   while(P3_5==0);
  63.                   
  64.                 }
  65.          }
  66.          disbuf[0]=second%10;
  67.         disbuf[1]=second/10;

  68.         if(P3_6==0)
  69.      {delay(100);
  70.            if(P3_6==0)
  71.             {minute++;
  72.                   while(P3_6==0);
  73.                   if(minute==60)
  74.                    {minute=0;
  75.                    }
  76.                 }
  77.          }
  78.         disbuf[3]=minute%10;
  79.         disbuf[4]=minute/10;


  80.          if(P3_7==0)
  81.      {delay(100);
  82.            if(P3_7==0)
  83.             {hour++;
  84.                   while(P3_7==0);
  85.                    if(hour==24)
  86.                     {hour=0;
  87.                         }
  88.                 }
  89.          }
  90.         
  91.         disbuf[6]=hour%10;
  92.         disbuf[7]=hour/10;
  93.         
  94.         disbuf[0]=second%10;
  95.         disbuf[1]=second/10;
  96.         disbuf[3]=minute%10;
  97.         disbuf[4]=minute/10;
  98.         disbuf[6]=hour%10;
  99.         disbuf[7]=hour/10;

  100.    }
  101.    //键盘控制//
  102.   
  103.   //主函数//



  104. void main(void)
  105. {        
  106.   TMOD=0x02;
  107.   TH0=0x06;
  108.   TL0=0x06;
  109.   TR0=1;
  110.   ET0=1;
  111.   EA=1;

  112.   while(1)
  113.   {
  114.    bcon();
复制代码
五、小结
本文主要利用74HC595芯片构成数字显示的一个例子,在硬件设计和软件控制部分,只要二者互相结合,可以得到不同的电路,效果也可以不一样,这主要给读者自己去发挥。

0.png

全部资料51hei下载地址:
595串行时钟显示.rar (72.67 KB, 下载次数: 284)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

举报

ID:362033 发表于 2019-6-1 22:33 | 显示全部楼层
谢谢分享!!!!!
回复

举报

ID:421410 发表于 2019-6-18 10:05 | 显示全部楼层
新手,刚好想实现595的时钟电路软件,下来学习
回复

举报

ID:320097 发表于 2019-6-18 18:45 | 显示全部楼层
请教一下,595写数据的时候是写最后一片再倒回来吗?
回复

举报

ID:566010 发表于 2019-6-18 20:32 | 显示全部楼层

请教一下,595写数据的时候是写最后一片再倒回来吗
回复

举报

ID:141072 发表于 2019-12-27 20:45 | 显示全部楼层
值得参考
回复

举报

ID:196311 发表于 2020-4-12 23:05 | 显示全部楼层
收下啦,谢谢分享
回复

举报

ID:726103 发表于 2020-4-13 10:32 | 显示全部楼层
有汇编版的吗
回复

举报

ID:85480 发表于 2021-11-2 16:34 | 显示全部楼层
某一个宝上的都没有C51的程序, 刚好又买了595模块,学习一下,谢谢分享。
回复

举报

ID:1011444 发表于 2022-11-13 11:46 | 显示全部楼层
驱动数码管还是7219比较方便好用,但595有价格优势,线路布局也方便点儿。
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表