找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2186|回复: 0
收起左侧

51单片机可调数码管显示电子钟没用DS1302

[复制链接]
ID:119067 发表于 2016-5-7 15:26 | 显示全部楼层 |阅读模式
//P0口段选,P2口位选,P1.2LED指示灯,P1.3蜂鸣器
按键不足
误差:24小时差20s

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar  unsigned char
  4. #define uint unsigned int
  5. sbit KEY1=P3^0;
  6. sbit KEY2=P3^1;
  7. sbit KEY3=P3^2;
  8. sbit KEY4=P3^3;
  9. sbit LED=P1^2;
  10. sbit BEEP=P1^3;
  11. uchar code  tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  12. uchar   StrTab[8];
  13. uchar  minute=30,hour=14,second;
  14. //yanshi
  15.   void delay(unsigned int cnt)
  16.   {         while(--cnt);
  17.   }

  18.   //chaizi
  19.   void Displaypro(void)
  20.   {
  21.   StrTab[0]=tab[hour/10];
  22.   StrTab[1]=tab[hour%10];
  23.   StrTab[2]=0XBF;
  24.   StrTab[3]=tab[minute/10];
  25.   StrTab[4]=tab[minute%10];
  26.   StrTab[6]=0XBF;
  27.   StrTab[5]=tab[second/10];
  28.   StrTab[7]=tab[second%10];
  29.   }
  30.   //zhuhanshu
  31.   void main()
  32.   {

  33.   TMOD|=0x01;
  34.   TH0=0xd8;
  35.   TL0=0xf0;
  36.   ET0=1;
  37.   TR0=1;
  38.   TMOD|=0x10;
  39.   TH1=0xf8;
  40.   TL1=0xf0;
  41.   ET1=1;
  42.   TR1=1;
  43.   EA=1;
  44.   
  45.   Displaypro();
  46. //按键部分可以这样写
  47. /*while(1)
  48. {          
  49.         static uchar P3=0xff;                  
  50.         if(P3&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
  51.         {
  52.                 delay(1000);
  53.                 //xiaodou
  54.             P3=0x00;
  55.                 if(KEY1==0)
  56.                 {delay(1000);hour++;
  57.                 if(hour==24)hour=0;Displaypro(); }
  58.                  else if(KEY4==0){ delay(1000);second--;
  59.                 if(second==0)second=59;Displaypro(); }
  60.                   else if(KEY2==0){delay(1000);minute++ ;
  61.                 if(minute==59)minute=0;Displaypro(); }
  62.             else if(KEY3==0){ delay(1000);minute--;
  63.                 if(minute==0)minute=59;Displaypro(); }
  64.         }
  65.         else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)P3=0xff;              
  66.         }*/

  67.   while(1)
  68. {

  69. if(minute==14)
  70.        {if(hour==2)
  71.                {P1=0x00; }         
  72.                    }
  73.   if(!KEY1)
  74.    {
  75.             delay(10000);
  76.          if(!KEY1)
  77.          { delay(20000);delay(20000);
  78.           hour++;
  79.           if(hour==24)hour=0;
  80.           delay(20000);delay(20000);
  81.           Displaypro();
  82.          
  83.          }
  84.    }
  85.    if(!KEY2)
  86.     {
  87.             delay(20000);
  88.          if(!KEY2)
  89.          { delay(20000);delay(20000);
  90.           hour--;
  91.           if(hour==0)hour=23;
  92.           delay(20000);delay(20000);
  93.           Displaypro();
  94.          
  95.          }
  96.          }
  97.         if(!KEY3)
  98.     {
  99.             delay(20000);
  100.          if(!KEY3)
  101.          {delay(20000);delay(20000);
  102.           minute++;
  103.           if(minute==59)minute=0;
  104.           delay(20000);delay(20000);
  105.           Displaypro();
  106.          
  107.          }
  108.          }
  109.         if(!KEY4)
  110.     {
  111.             delay(20000);
  112.          if(!KEY4)
  113.          {delay(20000);delay(20000);
  114.           minute--;
  115.           if(minute==0)minute=59;
  116.           delay(20000);delay(20000);
  117.           Displaypro();
  118.          
  119.          }
  120.          }
  121.         }
  122.        
  123.         }
  124.        
  125. //T1
  126. void time1_isr(void) interrupt 3 using 0
  127. {
  128. static unsigned char num;
  129. TH1=0xF8;
  130. TL1=0xf0;
  131. P2=0XFF;
  132. {switch (num)
  133. {
  134.   case 0:P2=0XFE;P0=~StrTab[num];break;
  135.   case 1:P2=0XFD;P0=~StrTab[num];break;
  136.   case 2:P2=0XFB;P0=~StrTab[num];break;
  137.   case 3:P2=0XF7;P0=~StrTab[num];break;
  138.   case 4:P2=0XEF;P0=~StrTab[num];break;
  139.   case 5:P2=0XBf;P0=~StrTab[num];break;
  140.   case 6:P2=0XDf;P0=~StrTab[num];break;
  141.   case 7:P2=0X7F;P0=~StrTab[num];break;
  142.   default:break;
  143. }

  144.   }
  145.   num++;
  146. if(num==8)
  147. num=0;
  148. }       
  149.        
  150.         //T0
  151.         void tim(void) interrupt 1 using 1
  152.         {
  153.          static unsigned char count;
  154.          TH0=0xd8;
  155.          TL0=0xf0;
  156.      count++;
  157.          switch (count)
  158.          {
  159.         case 0:
  160.         case 20:
  161.         case 40:
  162.         case 60:
  163.         case 80:Displaypro(); break;
  164.         case 50:LED=!LED; break;
  165.         default:break;            
  166.          }
  167.        
  168.         if (count==92)//将100改为92可以缩小至最小误差
  169.         {
  170.          count=0;
  171.          second++;
  172.          if(second==60)
  173.          {
  174.           second=0;
  175.           minute++;
  176.          if(minute==60)
  177.         {
  178.          minute=0;
  179.          hour++;
  180.          if(hour==24)          
  181. {
  182.      hour=0;

  183.          }
  184.          }
  185.          }
  186.         }
  187.         }

复制代码


可调数码管显示电子钟没用DS1302.docx

13.08 KB, 下载次数: 7, 下载积分: 黑币 -5

没用DS1302

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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