矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 14325|回复: 8

用89C2051制作的电子钟源程序

[复制链接]
     
发表于 2007-5-4 10:15:34 | 显示全部楼层 |阅读模式
本帖最后由 翌阳 于 2017-10-16 20:58 编辑

电子钟是数年前做的,硬件图没有留下文档,拆机重绘工程量太大了,不过从程序上应该可以分析出来大致的硬件图。主要的差别就是LED显示代码。其它的基本上都差不多。晶体记得好象是11.XXX的那个。走时精度很高的。




  1. #include <stdio.h>
  2. #include <reg51.h>
  3. #define TIMCNT 3126
  4. #define lowbit(c) (c%10)
  5. #define hibit(c) (c/10)
  6. //#include <sio.c>
  7. code char *version="-=<<Clock V1.2  Written by He Liang 2001.5.4>>=-\n";
  8. //                            0    1   2    3    4     5   6   7     8     9   10  11  12
  9. code unsigned char asctb[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x2,  0,0x30,0};
  10. //                            0  1  2  3  4  5  6  7  8  9  10 11 12
  11. code unsigned char daypm[]={0xff,31,28,31,30,31,30,31,31,30,31,30,31,0xff};
  12. data unsigned char mode=0,year=0,month=1,day=1,hour=0,min=0,sec=0,week=0,setup=0xff;
  13. data unsigned char ddlycnt=0;
  14. data unsigned int timcnt=TIMCNT,delaycnt;
  15. idata unsigned char dbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  16. bit modi=0,flash,date=0;
  17. void inittimer0(void)
  18. {
  19.     TMOD&=0xf0;
  20.     TMOD+=0x02;
  21.     TH0=0;
  22.     TL0=0;
  23.     TR0=1;
  24.     ET0=1;
  25.     EA=1;
  26. }
  27. void timer0(void) interrupt 1
  28. {
  29.     static unsigned char k=1;
  30.     static unsigned char dc=0;
  31.     k<<=1;
  32.     dc++;
  33.     if(k==0){k=1;dc=0;}
  34.     P1=0;
  35.     T1=1;
  36.     T1=0;
  37.     P1=~dbuf[dc];
  38.     RD=1;
  39.     RD=0;
  40.     P1=k;
  41.     T1=1;
  42.     T1=0;
  43.     if(delaycnt!=0)delaycnt--;
  44.     timcnt--;
  45.     if(timcnt==0)
  46.     {
  47.         if(!modi)sec++;
  48.         if(sec>59)sec=0;
  49.         timcnt=TIMCNT;
  50.     }
  51. }
  52. void display()
  53. {
  54.     unsigned char c;
  55.     switch(mode)
  56.     {
  57.         case 0:
  58.             date=0;
  59.             break;
  60.         case 1:
  61.             if(setup==0xff){ddlycnt++;if(ddlycnt>5){ddlycnt=0;mode=0;}}
  62.             date=1;
  63.             break;
  64.         case 2:
  65.             if(setup==0xff)
  66.             {
  67.                 if(delaycnt==0)
  68.                 {
  69.                     date=!date;
  70.                     if(date)delaycnt=TIMCNT*2;else delaycnt=TIMCNT*5;
  71.                 }
  72.             }
  73.             else
  74.                 date=0;
  75.             break;
  76.     }
  77.     if(date)
  78.     {
  79.             dbuf[0]=asctb[hibit(year)];
  80.             dbuf[1]=asctb[lowbit(year)];
  81.             dbuf[2]=asctb[12];
  82.             dbuf[3]=asctb[hibit(month)];
  83.             dbuf[4]=asctb[lowbit(month)];
  84.             dbuf[5]=asctb[12];
  85.             dbuf[6]=asctb[hibit(day)];
  86.             dbuf[7]=asctb[lowbit(day)];
  87.     }else
  88.     {
  89.             c=hibit(hour);if(c==0)c=11;
  90.             dbuf[0]=asctb[c];
  91.             dbuf[1]=asctb[lowbit(hour)];
  92.             dbuf[2]=asctb[10];
  93.             dbuf[3]=asctb[hibit(min)];
  94.             dbuf[4]=asctb[lowbit(min)];
  95.             dbuf[5]=asctb[10];
  96.             dbuf[6]=asctb[hibit(sec)];
  97.             dbuf[7]=asctb[lowbit(sec)];
  98.     }
  99.     if(setup<3&&!flash)
  100.     {
  101.         c=setup+setup+setup;
  102.         dbuf[c]=0;
  103.         dbuf[c+1]=0;
  104.     }
  105.     if(setup!=3||flash)dbuf[week]|=1;
  106. }

  107. void caltim()
  108. {
  109.     static data unsigned char se=0;
  110.     if(sec!=se)
  111.     {
  112.         se=sec;
  113.         if(sec==0)
  114.         {
  115.             min++;
  116.             if(min>59)
  117.             {
  118.                 hour++;min=0;
  119.                 if(hour>23)
  120.                 {       
  121.                     hour=0;week++;if(week>6)week=0;
  122.                     day++;
  123.                     if(day>daypm[month]+((year&3)==0?1:0))
  124.                     {
  125.                         month++;day=1;
  126.                         if(month>12)
  127.                         {
  128.                             year++;month=1;
  129.                             if(year>99)year=0;
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         flash=1;
  136.         display();
  137.     }
  138.     if(setup!=0xff&&delaycnt==0)
  139.     {
  140.         delaycnt=750;
  141.         flash=!flash;
  142.         display();
  143.     }
  144. }
  145. char _getkey(void)
  146. {
  147.     static unsigned char cnt=254,lastkey=0,repcnt=10,lstk=0;
  148.     unsigned char k;
  149.     INT0=1;INT1=1;
  150.     k=P3;
  151.     k=(~(k>>2))&3;
  152.     if(k!=lstk){lstk=k;cnt=254;}
  153.     if(cnt>0){cnt--;return 0;}
  154.     cnt=254;
  155.     if(k==lastkey)
  156.     {
  157.         repcnt--;
  158.         if(repcnt==0){repcnt=2;return k;}
  159.         else return 0;
  160.     }else
  161.     {
  162.         lastkey=k;
  163.         repcnt=6;
  164.         return k;
  165.     }


  166. }
  167. main()
  168. {
  169.     unsigned char key;
  170.     inittimer0();
  171. //    initsio();
  172.     while(1)
  173.     {
  174.         PCON|=1;
  175.         caltim();
  176.         key=_getkey();
  177.         if(key!=0)
  178.         {
  179.             ddlycnt=0;
  180.             switch(key)
  181.             {
  182.                 case 1:
  183.                     setup++;
  184.                     if(setup>3)setup=0xff;
  185.                     if(setup!=2)modi=0;
  186.                     delaycnt=0;
  187.                     break;
  188.                 case 2:
  189.                     if(mode!=1)
  190.                     {
  191.                         switch(setup)
  192.                         {
  193.                             case 0:
  194.                                 hour++;
  195.                                 if(hour>23)hour=0;
  196.                                 break;
  197.                             case 1:
  198.                                 min++;
  199.                                 if(min>59)min=0;
  200.                                 break;
  201.                             case 2:
  202.                                 modi=1;
  203.                                 sec++;
  204.                                 if(sec>59)sec=0;
  205.                                 timcnt=TIMCNT;
  206.                                 break;
  207.                             case 3:
  208.                                 week++;
  209.                                 if(week>6)week=0;
  210.                                 break;
  211.                             case 0xff:
  212.                                 mode++;
  213.                                 if(mode>2)mode=0;
  214.                                 break;
  215.                         }
  216.                     }else
  217.                     {
  218.                         switch(setup)
  219.                         {
  220.                             case 0:
  221.                                 year++;
  222.                                 if(year>99)year=0;
  223.                                 break;
  224.                             case 1:
  225.                                 month++;
  226.                                 if(month>12)month=1;
  227.                                 break;
  228.                             case 2:
  229.                                 day++;
  230.                                 if(day>daypm[month]+((year&3)==0?1:0))day=1;
  231.                                 break;
  232.                             case 3:
  233.                                 week++;
  234.                                 if(week>6)week=0;
  235.                                 break;
  236.                             case 0xff:
  237.                                 mode++;
  238.                                 if(mode>2)mode=0;
  239.                                 break;
  240.                         }
  241.                         
  242.                     }
  243.                     delaycnt=2400;
  244.                     flash=1;
  245.                     break;
  246.                     
  247.             }
  248.             display();

  249.         }
  250.     }

  251. }

复制代码


[ 本帖最后由 翌阳 于 2007-5-4 10:19 编辑 ]

寄存个图片在此处:
1tradio.gif
发表于 2007-5-4 12:39:21 | 显示全部楼层
谢谢翌阳..

我也顺便发一个2051的.有硬件连接图和hex文件..

我不会把hex变文档形式..可惜不能用来学习程序了..

led表电路图+HEX文件.rar

27.93 KB, 下载次数: 22

     
发表于 2007-5-5 20:29:59 | 显示全部楼层
11.0592M晶振,凑波特率的。
     
发表于 2014-8-5 15:18:26 | 显示全部楼层
请教版主代码用什么软件转换成二进制码,直接用编程器写入单片机?
回复 支持 反对

使用道具 举报

     
发表于 2014-8-6 21:00:50 | 显示全部楼层
huanglipo 发表于 2014-8-5 15:18
请教版主代码用什么软件转换成二进制码,直接用编程器写入单片机?

stcisp stc-isp-15xx-v6.24 (1).zip (328.4 KB, 下载次数: 323)
回复 支持 反对

使用道具 举报

     
发表于 2014-8-6 23:26:27 | 显示全部楼层
谢谢版主的回复下载了学习学习。
回复 支持 反对

使用道具 举报

发表于 2014-8-7 13:03:35 来自手机 | 显示全部楼层
huanglipo 发表于 2014-8-5 15:18
请教版主代码用什么软件转换成二进制码,直接用编程器写入单片机?

用软件编程后就转了,烧写器必须的,你先搜下教程,网上很多。
回复 支持 反对

使用道具 举报

     
发表于 2014-8-8 14:29:58 | 显示全部楼层
2051 发表于 2014-8-7 13:03
用软件编程后就转了,烧写器必须的,你先搜下教程,网上很多。

谢谢回复。
回复 支持 反对

使用道具 举报

     
发表于 2016-10-30 21:54:59 | 显示全部楼层
先收藏,有空也做个看看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-4 09:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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