找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3010|回复: 3
收起左侧

单片机小时钟制作

[复制链接]
ID:91350 发表于 2015-10-1 00:34 | 显示全部楼层 |阅读模式
       采用四位一体数码管俩个,限流电阻4.7k欧,主控为STC89c52单片机。以下程序作为参考。实物图可以去相册里观看。               
    呵呵,在编写这个程序时遇到了一些问题,拿出来与大家共勉。
    刚开始我就把位定义的接口弄错,单片机怎么都不工作,看来看去终于发现刚开始就错了;之后发现我的时间走得比标准时钟快好多,可能我的芯片晶振更快吧,但怎么想真么不合理,那个后来我只好计算一下,只好把时钟改了;再之后我发现有时调节时和分时,秒针要等很久(大约一分钟)才工作,后来经过排查发现,当你调节时,如果正好等于time==16,那么time将继续增加,直至走到下一个16,。
本程序应用了定时器中断。
  1. #include<reg52.h>

  2. #define DIG P0

  3. sbit LSA=P2^2;
  4. sbit LSB=P2^3;
  5. sbit LSC=P2^4;

  6. sbit k0=P3^1;
  7. sbit k1=P3^0;

  8. void timerconfiguration();
  9. void digdisplay();
  10. void clock();
  11. void keydown();

  12. unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  13. unsigned char state[10];
  14. unsigned char time;
  15. unsigned char a;
  16. unsigned char b;
  17. unsigned char d;
  18. unsigned char c;
  19. unsigned char e;

  20. void main()
  21. {
  22.     char k;
  23.     for(k=7;k>0;k--)
  24.         state[k]=num[0];
  25.     state[2]=0x40;
  26.     state[5]=0x40;
  27.     time=0;
  28.     a=0;
  29.     b=0;
  30.     c=0;
  31.     d=0;
  32.     e=0;

  33.     timerconfiguration();

  34.     while(1)
  35.     {
  36.         digdisplay();
  37.         keydown();
  38.         clock();
  39.     }
  40. }

  41. void timerconfiguration(void)
  42. {
  43.     TMOD=0X01;
  44.     TH0=0X3C;
  45.     TL0=0XB0;
  46.     EA=1;
  47.     ET0=1;
  48.     TR0=1;
  49. }

  50. void digdisplay(void)
  51. {
  52.     unsigned char i;
  53.     unsigned char j;
  54.     i=0;
  55.     while(i<8)
  56.     {  
  57.         switch(i)
  58.     {
  59.             case (0): LSA=0; LSB=0; LSC=0; break;
  60.             case (1): LSA=1; LSB=0; LSC=0; break;
  61.             case (2): LSA=0; LSB=1; LSC=0; break;
  62.             case (3): LSA=1; LSB=1; LSC=0; break;
  63.             case (4): LSA=0; LSB=0; LSC=1; break;
  64.             case (5): LSA=1; LSB=0; LSC=1; break;
  65.             case (6): LSA=0; LSB=1; LSC=1; break;
  66.             case (7): LSA=1; LSB=1; LSC=1; break;
  67.     }
  68.         DIG=state[i];
  69.         i++;
  70.         j=10;
  71.         while(j--);
  72.         DIG=0x00;
  73.     }
  74. }

  75. void timer() interrupt 1
  76. {
  77.     time++;
  78. }

  79. void keydown(void)
  80. {
  81.     unsigned char q;              
  82.     unsigned char w;
  83.     unsigned char p;
  84.     unsigned char number;
  85.    
  86.     if((k0==0) || (k1==0))
  87.     {
  88.         for(q=38; q>0; q--)
  89.                 for(w=100; w>0; w--);
  90.         if(k0==0)
  91.     {
  92.                 if(state[3]!=num[9])
  93.         {
  94.             c++;
  95.                     state[3]=num[c];
  96.         }
  97.         else
  98.         {
  99.             c=0;
  100.                     state[3]=num[c];
  101.                     if(state[4]!=num[5])
  102.         {
  103.             d++;
  104.                         state[4]=num[d];
  105.         }
  106.             else
  107.         {
  108.             d=0;
  109.                         state[4]=num[d];
  110.                         if(state[6]!=num[9])
  111.         {
  112.             e++;
  113.                         state[6]=num[e];
  114.         }
  115.             else
  116.         {
  117.             e=0;
  118.                         state[6]=num[e];
  119.                         state[7]=num[1];
  120.         }
  121.                         if((state[7]==num[1]) && (state[6]==num[3]))
  122.         {
  123.                                 for(number=7; number>0; number--)
  124.                                 state[number]=num[0];
  125.                         state[2]=0x40;
  126.                         state[5]=0x40;
  127.             d=0;
  128.                 e=0;
  129.         }
  130.       
  131.         }
  132.     }
  133.     }
  134.         if(k1==0)
  135.     {
  136.                 if(state[6]!=num[9])
  137.         {
  138.             e++;
  139.                         state[6]=num[e];
  140.         }
  141.             else
  142.         {
  143.             e=0;
  144.                         state[6]=num[e];
  145.                         state[7]=num[1];
  146.         }
  147.                         if((state[7]==num[1]) && (state[6]==num[3]))
  148.         {
  149.                             for(number=7; number>0; number--)
  150.                                 state[number]=num[0];
  151.                         state[2]=0x40;
  152.                         state[5]=0x40;
  153.                 e=0;
  154.         }
  155.       
  156.     }

  157.         p=50;
  158.        while((p>0) && ((k0==0) ||(k1==0)))
  159.        {
  160.             p--;
  161.             for(q=38; q>0; q--)
  162.                 for(w=100; w>0; w--);
  163.        }
  164.    
  165. }}

  166. void clock(void)
  167. {
  168.     unsigned char number;
  169.     if(time>=16)
  170.     {
  171.         time=0;
  172.         if(state[0]!=num[9])
  173.     {
  174.         a++;
  175.             state[0]=num[a];
  176.     }
  177.         else
  178.     {
  179.         a=0;
  180.             state[0]=num[a];
  181.             if(state[1]!=num[5])
  182.     {
  183.         b++;
  184.                 state[1]=num[b];
  185.     }
  186.         else
  187.     {
  188.         b=0;
  189.                 state[1]=num[b];
  190.                 if(state[3]!=num[9])
  191.         {
  192.             c++;
  193.                     state[3]=num[c];
  194.         }
  195.         else
  196.         {
  197.             c=0;
  198.                     state[3]=num[c];
  199.                     if(state[4]!=num[5])
  200.         {
  201.             d++;
  202.                         state[4]=num[d];
  203.         }
  204.             else
  205.         {
  206.             d=0;
  207.                         state[4]=num[d];
  208.                         if(state[6]!=num[9])
  209.         {
  210.             e++;
  211.                         state[6]=num[e];
  212.         }
  213.             else
  214.         {
  215.             e=0;
  216.                         state[6]=num[e];
  217.                             state[7]=num[1];   
  218.         }
  219.                         if((state[7]==num[1]) && (state[6]==num[3]))
  220.         {
  221.                             for(number=7; number>0; number--)
  222.                                 state[number]=num[0];
  223.                         state[2]=0x40;
  224.                         state[5]=0x40;
  225.                 e=0;
  226.         }
  227.       
  228.         }
  229.         }
  230.     }
  231.     }
  232.     }
  233. }                                                                                                   
复制代码


回复

使用道具 举报

ID:68416 发表于 2015-10-4 17:51 | 显示全部楼层
刚好我也想做一个,多谢
回复

使用道具 举报

ID:88707 发表于 2015-10-5 15:05 | 显示全部楼层
最近在看这方面的程序呢
回复

使用道具 举报

ID:94340 发表于 2015-11-1 19:48 | 显示全部楼层
竟然没有实物图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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