找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数码管时钟 单片机c程序 时钟DIY

[复制链接]
跳转到指定楼层
楼主
六位数码管时钟,时、分、秒。附件里有程序和电路图,喜欢DIY的朋友可以自己动手做一个数码管钟表。电路简单,使用的是89c51或89c52单片机。
电路原理图如下:


单片机源程序如下:

  1. uv3编译生成hex文件烧入单片机
  2. 六位数码管显示时分秒
  3. 二十四小时制和十二小时制可切换

  4.        
  5. **************************************************************
  6. #include<reg52.h>
  7. #define uc unsigned char
  8. #define ui unsigned int
  9. sbit LED=P3^2;
  10. sbit key0=P3^3;
  11. sbit key1=P3^4;
  12. sbit key2=P3^5;
  13. sbit key3=P3^6;
  14. sbit wan=P3^7;
  15. uc min,hour,sec,num;
  16. bit bdata zhi;
  17. uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*

  18. void delay(ui x)
  19. {
  20.         ui i,j;
  21.         for(i=0;i<x;i++)
  22.         for(j=0;j<121;j++);
  23. }
  24. void display()
  25. {
  26.         P0=tab[hour/10];
  27.         P2=0xdf;//11011111
  28.         delay(1);
  29.         P2=0xff;

  30.         P0=(tab[hour%10])|0x80;//给第二位后加“点
  31.         P2=0xef;//11101111
  32.         delay(1);
  33.         P2=0xff;

  34.         P0=tab[min/10];
  35.         P2=0xf7;//11110111
  36.         delay(1);
  37.         P2=0xff;

  38.         P0=(tab[min%10])|0x80;
  39.         P2=0xfb;//11111011
  40.         delay(1);
  41.         P2=0xff;

  42.         P0=tab[sec/10];
  43.         P2=0xfd;//11111101
  44.         delay(1);
  45.         P2=0xff;

  46.         P0=tab[sec%10];
  47.         P2=0xfe;//11111110
  48.         delay(1);
  49.         P2=0xff;
  50. }

  51. void keyscan()
  52. {
  53.         if(key0==0)
  54.         {
  55.                 delay(5);
  56.                 if(key0==0)
  57.                 {
  58.                         LED=~LED;
  59.                         zhi=~zhi;
  60.                         if((hour>=12)&&(zhi==0))
  61.                         {       
  62.                                 hour=hour-12;
  63.                         }
  64.                         if((zhi==1)&&(wan==1))
  65.                         {
  66.                                 hour=hour+12;
  67.                         }                                          
  68.                 }
  69.                 while(!key0) display();
  70.         }
  71.         if(key1==0)
  72.         {
  73.                 delay(5);
  74.                 if((key1==0)&&(zhi==0))
  75.                 {
  76.                         hour++;
  77.                         if(hour==12)
  78.                         {
  79.                                 hour=0;
  80.                                 wan=~wan;
  81.                         }
  82.                 }
  83.                 if((key1==0)&&(zhi==1))
  84.                 {
  85.                         hour++;
  86.                         if(hour==24)
  87.                         hour=0;
  88.                 }
  89.                 while(!key1) display();
  90.         }
  91.         if(key2==0)
  92.         {
  93.                 delay(5);
  94.                 if(key2==0)
  95.                 {
  96.                         min++;
  97.                         if(min==60)
  98.                         min=0;
  99.                 }
  100.                 while(!key2) display();
  101.         }
  102.         if(key3==0)
  103.         {
  104.                 delay(5);
  105.                 if(key3==0)
  106.                 {sec=0;}
  107.                 while(!key3) display();
  108.         }
  109. }

  110. void init()
  111. {
  112.         sec=0;
  113.         min=30;
  114.         hour=12;
  115.         LED=1;
  116.         zhi=1;
  117.         wan=1;
  118.         TMOD=0x01;
  119.         TH0=(65536-50000)/256;
  120.         TL0=(65536-50000)%256;
  121.         EA=1;
  122.         ET0=1;
  123.         TR0=1;
  124. }

  125. void shizhi()
  126. {
  127.         if(hour>=12)
  128.         wan=1;
  129.         if((hour<12)&&(zhi==1))
  130.         wan=0;
  131. }

  132. void main()//主函数
  133. {
  134.         init();
  135.         while(1)
  136.         {
  137.                 display();
  138.                 keyscan();
  139.                 shizhi();
  140.         }
  141. }
  142. void time0() interrupt 1
  143. {
  144.         TH0=(65536-50000)/256;
  145.         TL0=(65536-50000)%256;
  146.         num++;
  147.         if(num==20)
  148.         {
  149.                 num=0;
  150.                 sec++;
  151.                 if(sec==60)
  152.                 {
  153.                         sec=0;
  154.                         min++;
  155.                         if(min==60)
  156.                         {
  157.                                 min=0;
  158.                                 hour++;
  159.                                 if((hour==12)&&(zhi==0))
  160.                                 {
  161.                                         wan=~wan;
  162.                                         hour=0;
  163.                                 }
  164.                                 if((hour==24)&&(zhi==1))
  165.                                 {
  166.                                         hour=0;       
  167.                                 }
  168.                         }
  169.                 }
  170.         }
  171. }
复制代码

所有资料51hei提供下载:
六位数码管时钟.zip (68.79 KB, 下载次数: 13)


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

使用道具 举报

沙发
ID:386381 发表于 2019-9-14 23:14 来自手机 | 只看该作者
应该定时器用8位自动重装模定在0.2ms然后++5000次这样走时更准确
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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