找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7107|回复: 11
打印 上一主题 下一主题
收起左侧

74HC595驱动数码管时钟仿真

  [复制链接]
跳转到指定楼层
楼主


/***以下是部分源码,完整源码见附件***
74HC595驱动数码管时钟仿真,8位共阳数码管显示88-88-88样式,两个“-”1秒闪烁1次;按键调时部分没写,有兴趣的自己去添加;附件里有完整源码和仿真文件。

单片机源程序如下:
  1. [code]#include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char


  4. uchar code Table[] =
  5. { // 0         1          2           3        4         5          6           7        8         9          A           b        C    d          E    F    -
  6.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
  7. };
  8. //-----------------------------------------------------------------------------

  9. sbit SER = P1^0;        //串行数据输入端
  10. sbit STCP = P1^1;        //存储寄存器时钟端,并行输出
  11. sbit SHCP = P1^2;        / /移位寄存器时钟端

  12. sbit key1 = P3^0;        //选择键
  13. sbit key2 = P3^1;        //加键
  14. sbit key3 = P3^2;        //减键
  15. sbit key4 = P3^3;

  16. uchar shan,A,K,C,D,E,F;
  17. uchar knum;                //选择键计数变量

  18. void TimerInit();
  19. void KeyScan();
  20. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao);        // 数码管显示
  21. void SMG_Int(uchar Dat);                // 数码管单字节串行移位函数

  22. //*****************************************************************************
  23. // 主程序
  24. void main ()
  25. {
  26.         TimerInit();
  27.         while(1)
  28.         {
  29.                 Display (A,K,C,D,E,F);
  30.                 KeyScan();
  31.         }
  32. }

  33. void KeyScan()
  34. {
  35.         
  36. }


  37. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
  38. {
  39.         uchar i;

  40.         //显示第1位        小时10位
  41.         i = Table[shi10];

  42.         SMG_Int(i);                        
  43.         SMG_Int(0x01);               

  44.         STCP = 0;         //数据并行输出,(借助上升沿)
  45.         _nop_();
  46.         _nop_();
  47.         STCP = 1;

  48.         //显示第2位        小时个位
  49.         i = Table[shi];

  50.         SMG_Int(i);               
  51.         SMG_Int(0x02);               

  52.         STCP = 0;
  53.         _nop_();
  54.         _nop_();
  55.         STCP = 1;

  56.         //显示第3位        -
  57.         if(shan<10)         //"-" 闪烁
  58.         i = Table[16];
  59.         else
  60.         i = Table[15];
  61.         SMG_Int(i);                        
  62.         SMG_Int(0x04);        

  63.         STCP = 0;
  64.         _nop_();
  65.         _nop_();
  66.         STCP = 1;

  67.         //显示第4位        分钟10位
  68.         i = Table[fen10];

  69.         SMG_Int(i);                        
  70.         SMG_Int(0x08);               

  71.         STCP = 0;
  72.         _nop_();
  73.         _nop_();
  74.         STCP = 1;

  75.         //显示第5位        分钟个位
  76.         i = Table[fen];

  77.         SMG_Int(i);                        
  78.         SMG_Int(0x10);        

  79.         STCP = 0;
  80.         _nop_();
  81.         _nop_();
  82.         STCP = 1;

  83.         //显示第6位        -
  84.         if(shan<10)           //"-" 闪烁
  85.         i = Table[16];
  86.         else
  87.         i = Table[15];

  88.         SMG_Int(i);                        
  89.         SMG_Int(0x20);        

  90.         STCP = 0;
  91.         _nop_();
  92.         _nop_();
  93.         STCP = 1;

  94.         //显示第7位        秒10位
  95.         i = Table[miao10];

  96.         SMG_Int(i);                        
  97.         SMG_Int(0x40);        

  98.         STCP = 0;
  99.         _nop_();
  100.         _nop_();
  101.         STCP = 1;

  102.         //显示第8位        秒个位
  103.         i = Table[miao];

  104.         SMG_Int(i);               
  105.         SMG_Int(0x80);        

  106.         STCP = 0;
  107.         _nop_();
  108.         _nop_();
  109.         STCP = 1;
  110. }

  111. void SMG_Int(uchar Dat)         //通过8次循环将8位数据移入74HC595
  112. {
  113.         uchar i;
  114.         for(i=8;i>=1;i--)
  115.         {
  116.                 if (Dat & 0x80)
  117.                 {
  118.                         SER = 1;
  119.                 }
  120.                
  121.                 else
  122.                 {
  123.                         SER = 0;
  124.                 }
  125.                 Dat <<= 1;
  126.                 SHCP = 0;
  127.                 _nop_();
  128.                 _nop_();
  129.                 SHCP = 1;
  130.         }
  131. }

  132. void TimerInit()         //定时器0初始化
  133. {
  134.         TMOD = 0x01;
  135.         TH0 = (65536-50000)/256;        //50ms初值
  136.         TL0 = (65536-50000)%256;
  137.         EA = 1;
  138.         ET0 = 1;
  139.         TR0 = 1;

  140. }

  141. void Timer0() interrupt 1
  142. {
  143.         static uchar cnt,shi=12,fen=59,miao=30;
  144.         
  145.         TH0 = (65536-50000)/256;
  146.         TL0 = (65536-50000)%256;
  147.         
  148.         shan++;
  149.         if(shan==20)
  150.                 shan=0;

  151.         cnt++;
  152.         if(cnt==20)
  153.         {
  154.                 cnt = 0;
  155.                 miao++;
  156.                 if(miao == 60)
  157.                 {
  158.                         miao = 0;
  159.                         fen++;
  160.                         if(fen==60)
  161.                         {
  162.                                 fen = 0;
  163.                                 shi++;
  164.                                 if(shi==24)
  165.                                 {
  166.                                         shi=0;
  167.                                 }
  168.                         }
  169.                 }
  170.         }

  171.         A=shi/10;
  172.         K=shi%10;
  173.         C=fen/10;
  174.         D=fen%10;
  175.         E=miao/10;
  176.         F=miao%10;
  177. }

  178. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载(按键调时程序还没有写):
595数码管时钟资料.rar (20.57 KB, 下载次数: 191)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:140183 发表于 2017-9-27 05:57 | 只看该作者
谢谢分享!正需要 这个。
回复

使用道具 举报

板凳
ID:111182 发表于 2018-5-17 19:23 | 只看该作者
不错!!!
回复

使用道具 举报

地板
ID:111182 发表于 2018-5-17 19:24 | 只看该作者
用上时钟芯片就好了
回复

使用道具 举报

5#
ID:358284 发表于 2018-6-25 17:30 | 只看该作者
谢谢分享!非常有用!
回复

使用道具 举报

6#
ID:150257 发表于 2018-11-14 23:14 | 只看该作者
谢谢分享!正需要 这个。
回复

使用道具 举报

7#
ID:880853 发表于 2021-2-17 20:34 | 只看该作者
按键完全没用
回复

使用道具 举报

8#
ID:476623 发表于 2021-2-19 22:26 | 只看该作者
下载了学习一下,谢谢楼主的资料,楼主辛苦了!
回复

使用道具 举报

9#
ID:1011444 发表于 2022-11-29 20:23 | 只看该作者
希望补齐按键程序,不然就不是完整程序,按键等于虚设。
回复

使用道具 举报

10#
ID:140489 发表于 2022-11-30 11:58 | 只看该作者
你们要的按键完整程序来了
回复

使用道具 举报

11#
ID:140489 发表于 2022-11-30 14:58 | 只看该作者
kz0018 发表于 2022-11-29 20:23
希望补齐按键程序,不然就不是完整程序,按键等于虚设。

加按键调时的代码
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char


  4. uchar code Table[] =
  5. { // 0         1          2           3        4         5          6           7        8         9          A           b        C    d          E    不显    -
  6.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0xFF,0xbf
  7. };
  8. //-----------------------------------------------------------------------------

  9. sbit SER = P1^0;        //串行数据输入端
  10. sbit STCP = P1^1;        //时钟脉冲信号——上升沿有效 存储寄存器时钟输入端,并行输出
  11. sbit SHCP = P1^2;        //输入信号————上升沿有效 移位寄存器时钟输入端

  12. sbit key1 = P3^0;        //选择键
  13. sbit key2 = P3^1;        //加键
  14. sbit key3 = P3^2;        //减键
  15. sbit key4 = P3^3;

  16. char shi=12,fen=59,miao=30;
  17. uchar shan,A,K,C,D,E,F;
  18. uchar knum;                //选择键计数变量
  19. uchar keycont1,keycont2,keycont3;//消抖计时变量
  20. bit lock1,lock2,lock3;//按键自锁标志

  21. void TimerInit();
  22. void KeyScan();
  23. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao);        // 数码管显示
  24. void SMG_Int(uchar Dat);                // 数码管单字节串行移位函数

  25. //*****************************************************************************
  26. // 主程序
  27. void main ()
  28. {
  29.         TimerInit();
  30.         while(1)
  31.         {
  32.                 Display (A,K,C,D,E,F);
  33.                 KeyScan();
  34.         }
  35. }

  36. void KeyScan()
  37. {
  38.         if(key1)
  39.         {
  40.                 keycont1=0;
  41.                 lock1=0;       
  42.         }
  43.         else if(lock1==0)
  44.         {
  45.                 keycont1++;
  46.                 if(keycont1>50)
  47.                 {
  48.                         keycont1=0;
  49.                         lock1=1;
  50.                         knum++;
  51.                         if(knum==4)
  52.                                 knum=0;                       
  53.                 }       
  54.         }
  55. /////////////////////////
  56.         if(key2)
  57.         {
  58.                 keycont2=0;
  59.                 lock2=0;       
  60.         }
  61.         else if(lock2==0)
  62.         {
  63.                 keycont2++;
  64.                 if(keycont2>50)
  65.                 {
  66.                         keycont2=0;
  67.                         lock2=1;
  68.                         switch(knum)
  69.                         {
  70.                                 case 0:  break;
  71.                                 case 1: shi++; if(shi==24)shi=0; break;
  72.                                 case 2: fen++; if(fen==60)fen=0; break;
  73.                                 case 3: miao++; if(miao==60)miao=0; break;

  74.                         }
  75.                                        
  76.                 }       
  77.         }
  78. /////////////////////////
  79.         if(key3)
  80.         {
  81.                 keycont3=0;
  82.                 lock3=0;       
  83.         }
  84.         else if(lock3==0)
  85.         {
  86.                 keycont3++;
  87.                 if(keycont3>50)
  88.                 {
  89.                         keycont3=0;
  90.                         lock3=1;
  91.                         switch(knum)
  92.                         {
  93.                                 case 0:  break;
  94.                                 case 1: shi--; if(shi<0)shi=23; break;
  95.                                 case 2: fen--; if(fen<0)fen=59; break;
  96.                                 case 3: miao--; if(miao<0)miao=59; break;
  97.                         }
  98.                 }
  99.         }
  100. }


  101. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
  102. {
  103.         uchar i;

  104.         //显示第1位        小时10位
  105.         if(knum==1)
  106.         {
  107.                 if(shan%4==0)         //
  108.                 i = Table[15];
  109.                 else
  110.                 i = Table[shi10];
  111.        
  112.                 SMG_Int(i);                       
  113.                 SMG_Int(0x01);               
  114.        
  115.                 STCP = 0;         //数据并行输出,(借助上升沿)
  116.                 _nop_();
  117.                 _nop_();
  118.                 STCP = 1;
  119.        
  120.                 //显示第2位        小时个位
  121.                 if(shan%4==0)         //
  122.                 i = Table[15];
  123.                 else
  124.                 i = Table[shi];
  125.        
  126.                 SMG_Int(i);               
  127.                 SMG_Int(0x02);               
  128.        
  129.                 STCP = 0;
  130.                 _nop_();
  131.                 _nop_();
  132.                 STCP = 1;
  133.         }
  134.         else
  135.         {
  136.                 i = Table[shi10];
  137.        
  138.                 SMG_Int(i);                       
  139.                 SMG_Int(0x01);               
  140.        
  141.                 STCP = 0;         //数据并行输出,(借助上升沿)
  142.                 _nop_();
  143.                 _nop_();
  144.                 STCP = 1;
  145.        
  146.                 //显示第2位        小时个位
  147.                 i = Table[shi];
  148.        
  149.                 SMG_Int(i);               
  150.                 SMG_Int(0x02);               
  151.        
  152.                 STCP = 0;
  153.                 _nop_();
  154.                 _nop_();
  155.                 STCP = 1;       
  156.         }
  157.         //显示第3位        -
  158.         if(shan<10)         //"-" 闪烁
  159.         i = Table[16];
  160.         else
  161.         i = Table[15];
  162.         SMG_Int(i);                       
  163.         SMG_Int(0x04);       

  164.         STCP = 0;
  165.         _nop_();
  166.         _nop_();
  167.         STCP = 1;

  168.         //显示第4位        分钟10位
  169.         if(knum==2)
  170.         {
  171.                 if(shan%4==0)         //
  172.                 i = Table[15];
  173.                 else
  174.                 i = Table[fen10];       
  175.                 SMG_Int(i);                       
  176.                 SMG_Int(0x08);               
  177.        
  178.                 STCP = 0;
  179.                 _nop_();
  180.                 _nop_();
  181.                 STCP = 1;
  182.        
  183.                 //显示第5位        分钟个位
  184.                 if(shan%4==0)         //
  185.                 i = Table[15];
  186.                 else
  187.                 i = Table[fen];
  188.        
  189.                 SMG_Int(i);                       
  190.                 SMG_Int(0x10);       
  191.        
  192.                 STCP = 0;
  193.                 _nop_();
  194.                 _nop_();
  195.                 STCP = 1;
  196.         }
  197.         else
  198.         {
  199.                 i = Table[fen10];
  200.        
  201.                 SMG_Int(i);                       
  202.                 SMG_Int(0x08);               
  203.        
  204.                 STCP = 0;
  205.                 _nop_();
  206.                 _nop_();
  207.                 STCP = 1;
  208.        
  209.                 //显示第5位        分钟个位
  210.                 i = Table[fen];
  211.        
  212.                 SMG_Int(i);                       
  213.                 SMG_Int(0x10);       
  214.        
  215.                 STCP = 0;
  216.                 _nop_();
  217.                 _nop_();
  218.                 STCP = 1;       
  219.         }
  220.         //显示第6位        -
  221.         if(shan<10)           //"-" 闪烁
  222.         i = Table[16];
  223.         else
  224.         i = Table[15];

  225.         SMG_Int(i);                       
  226.         SMG_Int(0x20);       

  227.         STCP = 0;
  228.         _nop_();
  229.         _nop_();
  230.         STCP = 1;

  231.         if(knum==3)
  232.         {
  233.                 //显示第7位        秒10位
  234.                 if(shan%4==0)         //
  235.                 i = Table[15];
  236.                 else
  237.                 i = Table[miao10];
  238.        
  239.                 SMG_Int(i);                       
  240.                 SMG_Int(0x40);       
  241.        
  242.                 STCP = 0;
  243.                 _nop_();
  244.                 _nop_();
  245.                 STCP = 1;
  246.        
  247.                 //显示第8位        秒个位
  248.                 if(shan%4==0)         //
  249.                 i = Table[15];
  250.                 else
  251.                 i = Table[miao];
  252.        
  253.                 SMG_Int(i);               
  254.                 SMG_Int(0x80);       
  255.        
  256.                 STCP = 0;
  257.                 _nop_();
  258.                 _nop_();
  259.                 STCP = 1;
  260.         }
  261.         else
  262.         {
  263.                 //显示第7位        秒10位
  264.                 i = Table[miao10];
  265.        
  266.                 SMG_Int(i);                       
  267.                 SMG_Int(0x40);       
  268.        
  269.                 STCP = 0;
  270.                 _nop_();
  271.                 _nop_();
  272.                 STCP = 1;
  273.        
  274.                 //显示第8位        秒个位
  275.                 i = Table[miao];
  276.        
  277.                 SMG_Int(i);               
  278.                 SMG_Int(0x80);       
  279.        
  280.                 STCP = 0;
  281.                 _nop_();
  282.                 _nop_();
  283.                 STCP = 1;       
  284.         }
  285. }

  286. void SMG_Int(uchar Dat)         //通过8次循环将8位数据移入74HC595
  287. {
  288.         uchar i;
  289.         for(i=8;i>=1;i--)
  290.         {
  291.                 if (Dat & 0x80)
  292.                 {
  293.                         SER = 1;
  294.                 }
  295.                
  296.                 else
  297.                 {
  298.                         SER = 0;
  299.                 }
  300.                 Dat <<= 1;
  301.                 SHCP = 0;
  302.                 _nop_();
  303.                 _nop_();
  304.                 SHCP = 1;
  305.         }
  306. }

  307. void TimerInit()         //定时器0初始化
  308. {
  309.         TMOD = 0x01;
  310.         TH0 = (65536-50000)/256;        //50ms初值
  311.         TL0 = (65536-50000)%256;
  312.         EA = 1;
  313.         ET0 = 1;
  314.         TR0 = 1;

  315. }

  316. void Timer0() interrupt 1
  317. {
  318.         static uchar cnt;
  319.        
  320.         TH0 = (65536-50000)/256;
  321.         TL0 = (65536-50000)%256;
  322.        
  323.         shan++;
  324.         if(shan==20)
  325.                 shan=0;
  326.         if(knum==0)
  327.         {
  328.                 cnt++;
  329.                 if(cnt==20)
  330.                 {
  331.                         cnt = 0;
  332.                         miao++;
  333.                         if(miao == 60)
  334.                         {
  335.                                 miao = 0;
  336.                                 fen++;
  337.                                 if(fen==60)
  338.                                 {
  339.                                         fen = 0;
  340.                                         shi++;
  341.                                         if(shi==24)
  342.                                         {
  343.                                                 shi=0;
  344.                                         }
  345.                                 }
  346.                         }
  347.                 }
  348.         }
  349.         A=shi/10;
  350.         K=shi%10;
  351.         C=fen/10;
  352.         D=fen%10;
  353.         E=miao/10;
  354.         F=miao%10;
  355. }



复制代码
回复

使用道具 举报

12#
ID:140489 发表于 2022-12-1 08:50 | 只看该作者
动画演示

录像2_转.gif (1.39 MB, 下载次数: 77)

录像2_转.gif
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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