找回密码
 立即注册

QQ登录

只需一步,快速开始

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

天祥单片机钟表(可定时)源码

[复制链接]
ID:253493 发表于 2018-3-17 15:56 | 显示全部楼层 |阅读模式
钟表(可定时)仿真电路图详见:http://www.51hei.com/bbs/dpj-39687-1.html

单片机源程序如下:
  1. /******************************************************************
  2.                                 “天祥电子”          倾情奉献
  3.                                            按键功能简介
  4.           S16 矫正时间                S17 继续计时         S18 设置定时
  5.           S19 取消定时                S6--S15   分别为数字键0--9
  6. ********************************************************************
  7. 该例程为数码管显示可调且可定时钟表,用到TX-1C开发板中矩阵键盘的上三排与第四排前两个按键。

  8. 若要更改时钟初始值(即时钟校准),可先按下矩阵键盘中的S16键(第三排第三列),此时时钟会暂停。
  9. 然后按S6---S15中的键修改矫正当前值,S6--S15分别先后对应数字0到9。
  10. 矫正完后,按下S17(第三排最后一个),时钟可继续工作。
  11. 若要设置定时时间,可先按下S18(第四排第一个),然后按数字键S6--S15设置定时时间(设置顺序是由高位到低位的顺序),
  12. 设置完定时后,按下S17可恢复到正常计时状态
  13. 定时时间到,蜂鸣器会持续响一分钟报时。
  14. 若要取消定时,或者蜂鸣器响时想对其关闭,可以按下S19功能键。
  15. 注意晶振需为11.0592M。
  16. 若为其他数值晶振,请合理改变TH0与TL0参数值,否则计时会有很大误差 。
  17. ***********************************************************************************************************************/
  18. #include<reg51.h>

  19. #define uchar unsigned char

  20. sbit dula=P2^6;
  21. sbit wela=P2^7;
  22. sbit beep=P2^3;
  23. unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
  24. uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,change,yidingshi;
  25. uchar baoshi,baoshijieshu;
  26. unsigned int pp;
  27. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  28.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  29. void delay(unsigned char i)
  30. {
  31.   for(j=i;j>0;j--)
  32.     for(k=125;k>0;k--);
  33. }
  34. void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
  35. {
  36.    dula=0;
  37.    P0=table[shi2];
  38.    dula=1;
  39.    dula=0;
  40.    
  41.    wela=0;
  42.    P0=0xfe;
  43.    wela=1;
  44.    wela=0;
  45.    delay(5);
  46.    
  47.    P0=table[shi1]|0x80;
  48.    dula=1;
  49.    dula=0;
  50.    
  51.    P0=0xfd;
  52.    wela=1;
  53.    wela=0;
  54.    delay(5);

  55.    P0=table[fen2];
  56.    dula=1;
  57.    dula=0;
  58.    
  59.    P0=0xfb;
  60.    wela=1;
  61.    wela=0;
  62.    delay(5);
  63.    
  64.    P0=table[fen1]|0x80;
  65.    dula=1;
  66.    dula=0;
  67.    
  68.    P0=0xf7;
  69.    wela=1;
  70.    wela=0;
  71.    delay(5);
  72.    
  73.    P0=table[miao2];
  74.    dula=1;
  75.    dula=0;
  76.    
  77.    P0=0xef;
  78.    wela=1;
  79.    wela=0;
  80.    delay(5);
  81.    
  82.    P0=table[miao1];
  83.    dula=1;
  84.    dula=0;
  85.    
  86.    P0=0xdf;
  87.    wela=1;
  88.    wela=0;
  89.    delay(5);
  90. }

  91. void keyscan0()
  92. {
  93.     P3=0xfb;
  94.     temp=P3;
  95.     temp=temp&0xf0;
  96.     if(temp!=0xf0)
  97.     {
  98.       delay(10);
  99.       if(temp!=0xf0)
  100.       {
  101.         temp=P3;
  102.         switch(temp)
  103.         {
  104.           case 0xbb:
  105.                ok=0;
  106.                            change=1;
  107.                break;

  108.           case 0x7b:
  109.                ok=1;
  110.                            change=0;
  111.                            dingshi=0;
  112.                break;
  113.          }        

  114.       }
  115.       }
  116.           P3=0xf7;
  117.     temp=P3;
  118.     temp=temp&0xf0;
  119.     if(temp!=0xf0)
  120.     {
  121.       delay(10);
  122.       if(temp!=0xf0)
  123.       {
  124.         temp=P3;
  125.         switch(temp)
  126.         {
  127.           case 0xe7:
  128.                ok=0;
  129.                            dingshi=1;
  130.                break;
  131.                   case 0xd7:
  132.                yidingshi=0;         //取消定时
  133.                break;
  134.          }

  135.                  }
  136.                  }        
  137. }


  138. void keyscan()
  139. {
  140.   {        
  141.     P3=0xfe;
  142.     temp=P3;
  143.     temp=temp&0xf0;
  144.     if(temp!=0xf0)
  145.     {
  146.       delay(10);
  147.       if(temp!=0xf0)
  148.       {        
  149.         temp=P3;
  150.         switch(temp)
  151.         {
  152.           case 0xee:
  153.                key=0;
  154.                            wei++;
  155.                break;

  156.           case 0xde:
  157.                key=1;
  158.                            wei++;
  159.                break;

  160.           case 0xbe:
  161.                key=2;
  162.                            wei++;
  163.                break;

  164.           case 0x7e:
  165.                key=3;
  166.                            wei++;
  167.                break;
  168.          }
  169.          while(temp!=0xf0)
  170.         {
  171.            temp=P3;
  172.            temp=temp&0xf0;
  173.            beep=0;
  174.          }
  175.          beep=1;
  176.       }
  177.     }
  178.     P3=0xfd;
  179.     temp=P3;
  180.     temp=temp&0xf0;
  181.     if(temp!=0xf0)
  182.     {
  183.       delay(10);
  184.       if(temp!=0xf0)
  185.       {
  186.         temp=P3;
  187.         switch(temp)
  188.         {
  189.           case 0xed:
  190.                key=4;
  191.                            wei++;
  192.                break;

  193.           case 0xdd:
  194.                key=5;
  195.                            wei++;
  196.                break;

  197.           case 0xbd:
  198.                key=6;
  199.                            wei++;
  200.                break;

  201.           case 0x7d:
  202.                key=7;
  203.                            wei++;
  204.                break;
  205.          }
  206.          while(temp!=0xf0)
  207.          {
  208.            temp=P3;
  209.            temp=temp&0xf0;
  210.            beep=0;
  211.          }
  212.          beep=1;
  213.       }
  214.       }
  215.     P3=0xfb;
  216.     temp=P3;
  217.     temp=temp&0xf0;
  218.     if(temp!=0xf0)
  219.     {
  220.       delay(10);
  221.       if(temp!=0xf0)
  222.       {
  223.         temp=P3;
  224.         switch(temp)
  225.         {
  226.           case 0xeb:
  227.                key=8;
  228.                            wei++;
  229.                break;

  230.           case 0xdb:
  231.                key=9;
  232.                            wei++;
  233.                break;
  234.          }
  235.         while(temp!=0xf0)
  236.          {
  237.            temp=P3;
  238.            temp=temp&0xf0;
  239.            beep=0;
  240.          }
  241.          beep=1;
  242.       }
  243.       }
  244. }
  245. }

  246. void main()
  247. {
  248.         TMOD=0x01;

  249.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  250.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  251.         ET0=1;
  252.         EA=1;
  253.         
  254.         while(1)
  255.         {        keyscan0();
  256.                
  257.                 if(ok==1)
  258.                 {        TR0=1;
  259.                         wei=0;
  260.                
  261.                 if(pp==20)
  262.                 {        pp=0;
  263.                         m++;
  264.                         if(m==60)
  265.                         {
  266.                                 m=0;
  267.                                 f++;
  268.                                 if(f==60)
  269.                                 {
  270.                                         f=0;
  271.                                         s++;
  272.                                         if(s==24)  //为24h一个循环,若要12h,只需在此改为12即可。
  273.                                         {
  274.                                                 s=0;
  275.                                         }
  276.                                 }
  277.                         }
  278.                 }
  279.                
  280.                 a0=s%10;
  281.                 a1=s/10;
  282.                 b0=f%10;
  283.                 b1=f/10;
  284.                 c0=m%10;
  285.                 c1=m/10;
  286.                 display(a1,a0,b1,b0,c1,c0);
  287.         }
  288.         else
  289.         {
  290.         if(change==1)
  291.         {        TR0=0;
  292.                 keyscan();
  293.                 if(key!=10)
  294.                 {
  295.                
  296.                 switch(wei)
  297.                 {
  298.                         case 1: if(key<3)                //小时最高位为2
  299.                                         a1=key;
  300.                                         else
  301.                                         wei--;
  302.                                         break;
  303.                         case 2: if(a1==1|a1==0)
  304.                                         a0=key;
  305.                                         else
  306.                                         if(key<5)
  307.                                         a0=key;                   //当小时最高位为2时,低位最高为4
  308.                                         break;
  309.                         case 3: if(key<6)                //分钟最高位为5
  310.                                         b1=key;
  311.                                         else
  312.                                         wei--;
  313.                                         break;
  314.                         case 4: b0=key; break;
  315.                         case 5: if(key<6)                //秒最高位为5
  316.                                         c1=key;
  317.                                         else
  318.                                         wei--;
  319.                                         break;
  320.                         case 6: c0=key; break;
  321.                 }
  322.                 key=10;
  323.                 }
  324.                         m=c1*10+c0;
  325.                         f=b1*10+b0;
  326.                         s=a1*10+a0;
  327.                 display(a1,a0,b1,b0,c1,c0);
  328.         }
  329.         if(dingshi==1)
  330.         {
  331.                 TR0=0;
  332.                 display(shi20,shi10,fen20,fen10,miao20,miao10);        
  333.                 keyscan();
  334.                 if(key!=10)
  335.                 {
  336.                 switch(wei)
  337.                 {
  338.                         case 1: if(key<3)                //小时最高位为2
  339.                                         shi20=key;
  340.                                         else
  341. ……………………

  342. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
13、钟表(可定时).rar (21.62 KB, 下载次数: 17)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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