找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机钟表程序设计(可矫正时间)

[复制链接]
跳转到指定楼层
楼主
ID:467097 发表于 2019-1-12 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 功能简介:

  2. 该例程为数码管显示可调钟表(无定时功能),用到TX-1C开发板中矩阵键盘的上三排按键。
  3. 若要更改时钟初始值(即时钟校准,因为时钟初始值全为0),可先按下矩阵键盘中的S16键
  4. (第三排第三列),此时时钟会暂停。
  5. 然后按S6---S15中的键修改矫正当前值,S6--S15分别先后对应数字0到9。
  6. 矫正完后,按下S17(第三排最后一个),时钟可继续工作。
  7. 注意晶振需为11.0592M。
  8. 若为其他数值晶振,请合理改变TH0与TL0参数值,否则计时会有很大误差 。

  9. ********************************************************************************/
  10. #include<reg51.h>

  11. #define uchar unsigned char

  12. sbit dula=P2^6;
  13. sbit wela=P2^7;
  14. sbit beep=P2^3;
  15. unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
  16. uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;
  17. unsigned int pp;
  18. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  19.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  20. void delay(unsigned char i)
  21. {
  22.   for(j=i;j>0;j--)
  23.     for(k=125;k>0;k--);
  24. }
  25. void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
  26. {
  27.    dula=0;
  28.    P0=table[shi2];
  29.    dula=1;
  30.    dula=0;
  31.    
  32.    wela=0;
  33.    P0=0xfe;
  34.    wela=1;
  35.    wela=0;
  36.    delay(5);
  37.    
  38.    P0=table[shi1]|0x80;
  39.    dula=1;
  40.    dula=0;
  41.    
  42.    P0=0xfd;
  43.    wela=1;
  44.    wela=0;
  45.    delay(5);

  46.    P0=table[fen2];
  47.    dula=1;
  48.    dula=0;
  49.    
  50.    P0=0xfb;
  51.    wela=1;
  52.    wela=0;
  53.    delay(5);
  54.    
  55.    P0=table[fen1]|0x80;
  56.    dula=1;
  57.    dula=0;
  58.    
  59.    P0=0xf7;
  60.    wela=1;
  61.    wela=0;
  62.    delay(5);
  63.    
  64.    P0=table[miao2];
  65.    dula=1;
  66.    dula=0;
  67.    
  68.    P0=0xef;
  69.    wela=1;
  70.    wela=0;
  71.    delay(5);
  72.    
  73.    P0=table[miao1];
  74.    dula=1;
  75.    dula=0;
  76.    
  77.    P0=0xdf;
  78.    wela=1;
  79.    wela=0;
  80.    delay(5);
  81. }

  82. void keyscan0()
  83. {
  84.     P3=0xfb;
  85.     temp=P3;
  86.     temp=temp&0xf0;
  87.     if(temp!=0xf0)
  88.     {
  89.       delay(10);
  90.       if(temp!=0xf0)
  91.       {
  92.         temp=P3;
  93.         switch(temp)
  94.         {
  95.           case 0xbb:
  96.                ok=0;
  97.                break;

  98.           case 0x7b:
  99.                ok=1;
  100.                break;
  101.          }
  102.       }
  103.       }       
  104. }


  105. void keyscan()
  106. {
  107.   {       
  108.     P3=0xfe;
  109.     temp=P3;
  110.     temp=temp&0xf0;
  111.     if(temp!=0xf0)
  112.     {
  113.       delay(10);
  114.       if(temp!=0xf0)
  115.       {       
  116.         temp=P3;
  117.         switch(temp)
  118.         {
  119.           case 0xee:
  120.                key=0;
  121.                            wei++;
  122.                break;

  123.           case 0xde:
  124.                key=1;
  125.                            wei++;
  126.                break;

  127.           case 0xbe:
  128.                key=2;
  129.                            wei++;
  130.                break;

  131.           case 0x7e:
  132.                key=3;
  133.                            wei++;
  134.                break;
  135.          }
  136.          while(temp!=0xf0)
  137.         {
  138.            temp=P3;
  139.            temp=temp&0xf0;
  140.            beep=0;
  141.          }
  142.          beep=1;
  143.       }
  144.     }
  145.     P3=0xfd;
  146.     temp=P3;
  147.     temp=temp&0xf0;
  148.     if(temp!=0xf0)
  149.     {
  150.       delay(10);
  151.       if(temp!=0xf0)
  152.       {
  153.         temp=P3;
  154.         switch(temp)
  155.         {
  156.           case 0xed:
  157.                key=4;
  158.                            wei++;
  159.                break;

  160.           case 0xdd:
  161.                key=5;
  162.                            wei++;
  163.                break;

  164.           case 0xbd:
  165.                key=6;
  166.                            wei++;
  167.                break;

  168.           case 0x7d:
  169.                key=7;
  170.                            wei++;
  171.                break;
  172.          }
  173.          while(temp!=0xf0)
  174.          {
  175.            temp=P3;
  176.            temp=temp&0xf0;
  177.            beep=0;
  178.          }
  179.          beep=1;
  180.       }
  181.       }
  182.     P3=0xfb;
  183.     temp=P3;
  184.     temp=temp&0xf0;
  185.     if(temp!=0xf0)
  186.     {
  187.       delay(10);
  188.       if(temp!=0xf0)
  189.       {
  190.         temp=P3;
  191.         switch(temp)
  192.         {
  193.           case 0xeb:
  194.                key=8;
  195.                            wei++;
  196.                break;

  197.           case 0xdb:
  198.                key=9;
  199.                            wei++;
  200.                break;
  201.          }
  202.         while(temp!=0xf0)
  203.          {
  204.            temp=P3;
  205.            temp=temp&0xf0;
  206.            beep=0;
  207.          }
  208.          beep=1;
  209.       }
  210.       }
  211. }
  212. }

  213. void main()
  214. {
  215.         TMOD=0x01;

  216.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  217.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  218.         ET0=1;
  219.         EA=1;
  220.        
  221.         while(1)
  222.         {        keyscan0();
  223.                
  224.                 if(ok==1)
  225.                 {        TR0=1;
  226.                         wei=0;
  227.                
  228.                 if(pp==20)
  229.                 {        pp=0;
  230.                         m++;
  231.                         if(m==60)
  232.                         {
  233.                                 m=0;
  234.                                 f++;
  235.                                 if(f==60)
  236.                                 {
  237.                                         f=0;
  238.                                         s++;
  239.                                         if(s==24)  //为24h一个循环,若要12h,只需在此改为12即可。
  240.                                         {
  241.                                                 s=0;
  242.                                         }
  243.                                 }
  244.                         }
  245.                 }
  246.                
  247.                 a0=s%10;
  248.                 a1=s/10;
  249.                 b0=f%10;
  250.                 b1=f/10;
  251.                 c0=m%10;
  252.                 c1=m/10;
  253.                 display(a1,a0,b1,b0,c1,c0);
  254.         }
  255.         else
  256.         {        TR0=0;
  257.                 keyscan();
  258.                 if(key!=10)
  259.                 {
  260.                
  261.                 switch(wei)
  262.                 {
  263.                         case 1: if(key<3)                //小时最高位为2
  264.                                         a1=key;
  265.                                         else
  266.                                         wei--;
  267.                                         break;
  268.                         case 2: if(a1==1|a1==0)
  269.                                         a0=key;
  270.                                         else
  271.                                         if(key<5)
  272.                                         a0=key;                   //当小时最高位为2时,低位最高为4
  273.                                         break;
  274.                         case 3: if(key<7)                //分钟最高位为6
  275.                                         b1=key;
  276.                                         else
  277.                                         wei--;
  278.                                         break;
  279.                         case 4: b0=key; break;
  280.                         case 5: if(key<7)                //秒最高位为6
  281.                                         c1=key;
  282.                                         else
  283.                                         wei--;
  284.                                         break;
  285.                         case 6: c0=key; break;
  286.                 }
  287.                 key=10;
  288.                 }
  289.                         m=c1*10+c0;
  290.                         f=b1*10+b0;
  291.                         s=a1*10+a0;
  292.                 display(a1,a0,b1,b0,c1,c0);
  293.         }       
  294.         }
  295. }

  296. void time0() interrupt 1
  297. {        TH0=(65536-46080)/256;
  298.         TL0=(65536-46080)%256;
  299.         pp++;
  300. }
复制代码

全部资料51hei下载地址:
12、钟表(可矫正时间).zip (22.2 KB, 下载次数: 7)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-1-12 23:43 | 只看该作者
此帖仅作者可见

使用道具 举报

板凳
ID:79094 发表于 2024-3-30 00:35 | 只看该作者
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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