DIY单片机学习板
直播中

王钢力

13年用户 85经验值
擅长:模拟技术
私信 关注
[参考资料]

我也来做个电子钟~~~~~~

断断续续,续续断断,总算是将电子钟做好了 ,哦 不该叫电子钟的,太俗气!哈哈  

这周事情太多,进度比较慢,拖到现在才完成。

尽可能的把走时精度调到了最高(不借助于时钟芯片),现在是一天误差在3秒左右,基本达到了设计要求。

做闹钟的时候纠结了很久,板子上有三个按键,在设计时钟和闹钟切换设置的时候有点吃紧,功力还是不够啊,以后要多多努力!

不多说,上图啦

电子钟1 电子钟2

程序代码如下,没有精简,编译大小970字节,想到哪写到哪的,没有优化
  1. #include

  2. typedef unsigned char uint8;
  3. typedef unsigned int uint16;

  4. uint16 count=0;
  5. uint8 sec,min,hour,min2,min1,h2,h1;
  6. uint8 j=0;
  7. uint16 i=0;                          //闹钟设置延时
  8. uint8 alARMflg=0,clock=0,beepclock=0;
  9. uint8 beepmin=0,beephour=7;                  //闹钟初始时间

  10. sfr IPH=0xb7;
  11. ***it beep=P2^0;                          //蜂鸣器
  12. ***it con1=P2^4;                          //数码管位选
  13. ***it con2=P2^3;
  14. ***it con3=P2^2;
  15. ***it con4=P2^1;
  16. ***it key1=P1^0;                          //按键
  17. ***it key2=P1^1;
  18. ***it key3=P1^2;

  19. uint8 code ledcode[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

  20. void delay(uint8 n)   //误差 0us         //1ms
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=n;c>0;c--)
  24.         for(b=142;b>0;b--)
  25.             for(a=2;a>0;a--);
  26. }

  27. void Inittimer1(void)                                                         //计时时钟
  28. {
  29.     TMOD |= 0x10;                 
  30.         TMOD &= 0xdf;
  31.     TH1 = 0xb1;                                //b1                  //20ms  校准后的值,不是算出的初始值
  32.     TL1 = 0xea;                                //ea
  33.     EA = 1;
  34.     ET1 = 1;
  35.     TR1 = 1;
  36. }

  37. void InitTimer0(void)                                                        //显示时钟
  38. {
  39.     TMOD |= 0x01;
  40.         TMOD &= 0xfd;
  41.     TH0 = 0xfc;                  //1ms
  42.     TL0 = 0x18;
  43.     EA = 1;
  44.     ET0 = 1;
  45.     TR0 = 1;
  46. }

  47. void show()                                                                                 //时钟显示
  48. {
  49.         if(j==4) j=0;
  50.         min2=min%10;
  51.         min1=min/10%10;
  52.         h2=hour%10;
  53.         h1=hour/10%10;
  54.         switch(j)
  55.         {
  56.                 case 0:        con1=0;con2=con3=con4=1;P0=ledcode[min2];break;
  57.                 case 1:        con2=0;con1=con3=con4=1;P0=ledcode[min1];break;
  58.                 case 2:        con3=0;con2=con1=con4=1;P0=ledcode[h2];break;
  59.                 case 3:        con4=0;con2=con3=con1=1;P0=ledcode[h1];break;
  60.         }
  61.         j++;
  62.                
  63. }

  64. void showalarm()                                                                 //闹钟显示
  65. {
  66.         if(j==4) j=0;
  67.         min2=beepmin%10;
  68.         min1=beepmin/10%10;
  69.         h2=beephour%10;
  70.         h1=beephour/10%10;
  71.         switch(j)
  72.         {
  73.                 case 0:        con1=0;con2=con3=con4=1;P0=ledcode[min2];break;
  74.                 case 1:        con2=0;con1=con3=con4=1;P0=ledcode[min1];break;
  75.                 case 2:        con3=0;con2=con1=con4=1;P0=ledcode[h2];break;
  76.                 case 3:        con4=0;con2=con3=con1=1;P0=ledcode[h1];break;
  77.         }
  78.         j++;
  79.                
  80. }

  81. void alarm()                                                  //闹钟
  82. {
  83.         uint8 i;
  84.           for (i = 0; i < 5; i++)
  85.           {
  86.             beep = !beep;
  87.                 delay(50);
  88.           }
  89.           beep = 1; //关闭蜂鸣器
  90.           delay(100);
  91. }

  92. void main(void)
  93. {
  94.         PT1=1;
  95.         IPH=0x08;                         //timer1中断优先级最高,提高走时精度
  96.         AUXR=0x01;                        //减小电磁干扰
  97.     InitTimer1();
  98.         InitTimer0();
  99.         while(1)
  100.         {
  101.                 if((key1==0)&&(beepclock==0))                                                   //时间设定
  102.                 {
  103.                         delay(20);
  104.                         if(key1==0)
  105.                         {
  106.                                 count=0;
  107.                                 sec=0;
  108.                                 TR0=~TR0;
  109.                                 TR1=~TR1;
  110.                                 if(TR1==1) clock=0;
  111.                                 if(TR1==0) clock=1;
  112.                                 alarm();
  113.                                 while(key1==0);
  114.                         }
  115.                 }
  116.                 if((key2==0)&&(TR1==1)&&(TR0==1))                                //消铃
  117.                 {
  118.                         delay(20);
  119.                         if(key2==0)
  120.                         {
  121.                                 alarmflg=0;
  122.                                 while(key2==0);
  123.                         }
  124.                 }
  125.             if((key3==0)&&(TR1==1)&&(beepclock==0))                                //设定闹钟
  126.                 {
  127.                         delay(20);
  128.                         if(key3==0)
  129.                         {
  130.                                 TR0=0;
  131.                                 beepclock=1;
  132.                                 showalarm();
  133.                                 while(key3==0);
  134.                         }
  135.                 }
  136.                 if(TR0==0)
  137.                 {
  138.                         if(key2==0)
  139.                         {
  140.                                 delay(20);
  141.                                 if(key2==0)
  142.                                 {
  143.                                         if(clock==1)                                 //时钟调整模式
  144.                                         {
  145.                                                 show();       
  146.                                         }
  147.                                         if(beepclock==1)                        //闹钟调整模式
  148.                                         {
  149.                                                 showalarm();
  150.                                         }
  151.                                         while(key2==0);       
  152.                                 }
  153.                         }
  154.                         if(key3==0)
  155.                         {
  156.                                 delay(20);
  157.                                 if(key3==0)
  158.                                 {
  159.                                         if(clock==1)                                         //时钟设置
  160.                                         {
  161.                                                 j--;
  162.                                                 switch(j)
  163.                                                 {
  164.                                                         case 0:min++;break;
  165.                                                         case 1:min+=10;break;
  166.                                                         case 2:hour++;break;
  167.                                                         case 3:hour+=10;break;
  168.                                                 }
  169.                                                 if(min>=60) min=0;
  170.                                                 if(hour>=24) hour=0;
  171.                                                 show();       
  172.                                         }       
  173.                                         if(beepclock==1)
  174.                                         {                                                                //闹钟设置
  175.                                                 j--;
  176.                                                 switch(j)
  177.                                                 {
  178.                                                         case 0:beepmin++;break;
  179.                                                         case 1:beepmin+=10;break;
  180.                                                         case 2:beephour++;break;
  181.                                                         case 3:beephour+=10;break;
  182.                                                 }
  183.                                                 if(beepmin>=60) beepmin=0;
  184.                                                 if(beephour>=24) beephour=0;
  185.                                                 showalarm();       
  186.                                         }
  187.                                        
  188.                                         while(key3==0);
  189.                                 }
  190.                         }
  191.                 }               
  192.                 if((alarmflg==1)&&(TR1==1))
  193.                         {
  194.                                 alarm();
  195.                         }
  196.         }
  197. }

  198. void Timer0Interrupt(void) interrupt 1
  199. {
  200.     TH0 = 0xfc;
  201.     TL0 = 0x18;
  202.     show();
  203. }

  204. void Timer1Interrupt(void) interrupt 3
  205. {
  206.     TH1 = 0xb1;
  207.     TL1 = 0xea;
  208.     count++;
  209.         if(count>=50)                 //1s
  210.         {
  211.                 count=0;
  212.                 sec++;
  213.                 if(sec>=60)
  214.                 {
  215.                         sec=0;
  216.                         min++;
  217.                         if(min>=60)
  218.                         {
  219.                                 min=0;
  220.                                 hour++;
  221.                                 if(hour>=24)
  222.                                 {
  223.                                         hour=0;
  224.                                 }
  225.                         }       
  226.                 }
  227.                 if((hour==beephour)&&(min==beepmin)&&(sec==1))
  228.                 {
  229.                         alarmflg=1;
  230.                 }
  231.         }
  232.         if(beepclock==1)                        //闹钟调整状态延时
  233.         {
  234.                 i++;
  235.                 if(i>=750)    //15s
  236.                 {
  237.                         TR0=1;
  238.                         i=0;
  239.                         beepclock=0;
  240.                 }
  241.         }
  242.        
  243. }

回帖(59)

贾册

2012-10-18 21:14:50
你用的什么软件写的???
旁边显示程序行数 怎么设置的?
举报

王钢力

2012-10-18 21:16:47
引用: 贾宁ing 发表于 2012-10-18 21:14
你用的什么软件写的???
旁边显示程序行数 怎么设置的?

编辑栏里面有

第一排  word图标旁边那个
举报

杨昭

2012-10-18 22:13:51
你这个是C8051F系列的么?
举报

王钢力

2012-10-18 22:23:04
引用: 完全是小白 发表于 2012-10-18 22:13
你这个是C8051F系列的么?

stc89c52
举报

更多回帖

发帖
×
20
完善资料,
赚取积分