单片机的数字时钟

孙帅
2023-12-01
Code:
  1. #include <reg52.h>  
  2. #include <absacc.h>  
  3. #define unit unsigned int  
  4. #define uchar unsigned char  
  5.   
  6. /*定义字型字位口*/  
  7. #define DIGPORT  XBYTE [0x8000]  
  8. #define WORDPORT  XBYTE [0x4000]  
  9.   
  10. /*定义P1口各管脚*/  
  11. sbit K0=P1^0;  
  12. sbit K1=P1^1;  
  13. sbit K2=P1^2;  
  14. sbit BEEP=P1^3;  
  15. sbit L0=P1^4;  
  16. sbit L1=P1^5;  
  17. sbit L2=P1^6;  
  18. sbit L3=P1^7;  
  19.   
  20. uchar data BUFFER[2]={0,0};         /*显示缓冲区(依次为低位,高位)*/  
  21. uchar data CLOCK[4]={0,0,0,0};      /*存放时钟时间(依次为百分秒,秒,分和时位)*/  
  22. uchar data SECOND[2]={0,0};     /*存放秒表时间(依次为百分秒,秒)*/  
  23. uchar data REVERSE[4]={0,0,0,0};    /*存放倒计时时间(依次为百分秒,秒,分和时位)*/  
  24.   
  25. /*定义运行状态*/  
  26. uchar data STATE=0;  
  27. /*STATE=0,秒表*/  
  28. /*STATE=1,倒计时分调整*/  
  29. /*STATE=2,倒计时小时调整*/  
  30. /*STATE=3,倒计时运行*/  
  31. /*STATE=4 or 7,时钟运行*/  
  32. /*STATE=5,时钟分调整*/  
  33. /*STATE=6,时钟时调整*/  
  34.   
  35. bit bdata SND=0;                    /*秒表START*/  
  36. bit bdata RST=0;                    /*秒表RESET*/  
  37. bit bdata STP=0;                    /*倒计时STOP*/  
  38.   
  39. /*数码管显示编码"0"-"9","A","-"*/  
  40. uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};  
  41.   
  42. void display(void)  
  43. {     
  44.     uchar i;                    /*显示缓冲区首址*/  
  45.     uchar delay;                    /*显示延时*/  
  46.     uchar disp;                     /*显示内容*/  
  47.     uchar digit;                    /*定义数码管显示位*/  
  48.     digit=0x08;  
  49.     for (i=0;i<2;i++)               /*秒表,显示百分秒和秒*/  
  50.     {  
  51.         if (BUFFER[i]>100) disp=BUFFER[i]%10+10;  
  52.         else disp=BUFFER[i]%10;       
  53.           
  54.         DIGPORT=digit;  
  55.         WORDPORT=TABLE[disp];  
  56.           
  57.         for (delay=0;delay<=200;delay++);  
  58.         digit=digit>>1;  
  59.         disp=BUFFER[i]/10;  
  60.           
  61.         DIGPORT=digit;  
  62.         WORDPORT=TABLE[disp];  
  63.           
  64.         for (delay=0;delay<=200;delay++);  
  65.         digit=digit>>1;  
  66.     }  
  67. }  
  68.   
  69.   
  70. void timer0(void)  interrupt 1 using 1  
  71. {  
  72.     /*重置定时初值*/  
  73.     TH0=-5000/256;  
  74.     TL0=-5000%256;  
  75.       
  76.     /*时钟处理*/  
  77.     CLOCK[0]=CLOCK[0]+1;  
  78.     if ((CLOCK[0]==50) && (STATE>=4))  
  79.         {  
  80.         L0=!L0;  
  81.         }  
  82.     if (CLOCK[0]==100)  
  83.         {     
  84.         if (STATE>=4) L0=!L0;  
  85.         CLOCK[0]=0;  
  86.         CLOCK[1]=CLOCK[1]+1;  
  87.           
  88.         if (CLOCK[1]==60)   
  89.         {  
  90.             CLOCK[1]=0;  
  91.             CLOCK[2]=CLOCK[2]+1;  
  92.             if (CLOCK[2]==60)  
  93.             {  
  94.                 CLOCK[2]=0;  
  95.                 CLOCK[3]=CLOCK[3]+1;  
  96.                 if (CLOCK[3]==24)  
  97.                 {     
  98.                 CLOCK[3]=0;   
  99.                 }  
  100.             }  
  101.         }  
  102.     }     
  103. }  
  104.   
  105. void timer2(void) interrupt 5 using 3  
  106. {  
  107.     TF2=0;  
  108.     TH2=-5000/256;   
  109.     TL2=-5000%256;  
  110.     /*秒表处理*/  
  111.     if (STATE==0)  
  112.     {  
  113.         SECOND[0]=SECOND[0]+1;  
  114.         if (SECOND[0]==50)  
  115.         {     
  116.         L1=!L1;  
  117.         }  
  118.         if (SECOND[0]==100)  
  119.         {     
  120.             L1=!L1;  
  121.             SECOND[0]=0;  
  122.             SECOND[1]=SECOND[1]+1;  
  123.             if (SECOND[1]==100)   
  124.             {  
  125.                 SECOND[1]=0;   
  126.             }  
  127.         }         
  128.     }  
  129.       
  130.     /*倒计时处理*/  
  131.     if (STATE==3)  
  132.     {  
  133.         REVERSE[0]=REVERSE[0]+1;  
  134.         if (REVERSE[0]==50)  
  135.         {     
  136.         L2=!L2;  
  137.         }  
  138.           
  139.     if (REVERSE[0]==100)  
  140.     {     
  141.             L2=!L2;  
  142.             REVERSE[0]=0;  
  143.             REVERSE[1]=REVERSE[1]+1;  
  144.             if (REVERSE[1]==60)   
  145.             {  
  146.             REVERSE[1]=00;  
  147.             REVERSE[2]=REVERSE[2]-1;  
  148.                   
  149.     if ((REVERSE[2]==0) && (REVERSE[3]==0))   
  150.     {  
  151.                     TR2=0;  
  152.                     STP=1;  
  153.                     BEEP=0;  
  154.                 }  
  155.     else if (REVERSE[2]==0xff)  
  156.                 {     
  157.                 REVERSE[2]=59;  
  158.                 REVERSE[3]=REVERSE[3]-1;   
  159.                 }  
  160.             }  
  161.         }         
  162.     }  
  163. }  
  164.   
  165.   
  166. void intsvr1(void)  interrupt 2 using 2  
  167. {  
  168.     if (STATE==5)  
  169.     {     
  170.         CLOCK[2]=CLOCK[2]+1;  
  171.         if (CLOCK[2]==60) CLOCK[2]=0;   
  172.     }  
  173.     if (STATE==6)  
  174.     {     
  175.     CLOCK[3]=CLOCK[3]+1;  
  176.     if (CLOCK[3]==24) CLOCK[3]=0;   
  177.     }  
  178. }  
  179.   
  180. void timer1(void)  interrupt 3 using 3  
  181. {  
  182.     if (STATE==0)  
  183.     {  
  184.         if (RST)  
  185.         {     
  186.             SECOND[0]=0;  
  187.             SECOND[1]=0;  
  188.             L1=1;  
  189.             RST=0;    
  190.         }  
  191.           
  192.     else   
  193.         {  
  194.             if (SND) TR2=1;  
  195.     else    
  196.         {     
  197.             L1=1;  
  198.             TR2=0;  
  199.             RST=1;  
  200.             }  
  201.             SND=!SND;     
  202.         }  
  203.     }  
  204.       
  205.     else if (STATE==1)  
  206.         {  
  207.         REVERSE[2]=REVERSE[2]+1;  
  208.         if (REVERSE[2]==60) REVERSE[2]=0;   
  209.         }  
  210.       
  211. else if (STATE==2)  
  212.     {  
  213.         REVERSE[3]=REVERSE[3]+1;  
  214.         if (REVERSE[3]==24) REVERSE[3]=0;     
  215.     }  
  216.       
  217. else   
  218.     {  
  219.         if (STP)   
  220.         {     
  221.             BEEP=1;  
  222.             L2=1;  
  223.             STP=0;    
  224.         }  
  225.         else TR2=0;   
  226.     }  
  227. }  
  228.   
  229.   
  230. void main(void)  
  231. {  
  232.     uchar stabak;               /*上一次程序运行的状态*/  
  233.     P1=0x0f;  
  234.     EA=1; IT1=1; ET0=1;  
  235.       
  236.     TMOD=0x61;              /*T1方式2计数,T0方式1计时*/  
  237.     TH0=-5000/256; TL0=-5000%256;  
  238.     TH1=0xff; TL1=0xff;  
  239.     T2CON=0; TH2=-5000/256; TL2=-5000%256;  
  240.       
  241.     K0=1; K1=1; K2=1;  
  242.     STATE=P1&0x07;  
  243.     stabak=STATE;  
  244.           
  245.     for (;;)  
  246.     {     
  247.     switch (STATE)  
  248.         {  
  249.         case 0:                 /*STATE=0,秒表*/  
  250.             {  
  251.                 EX1=0; ET1=1; ET2=1; TR1=1;  SND=1;  
  252.                 L1=1; L0=0; L2=0;  
  253.                 SECOND[0]=0;  
  254.                 SECOND[1]=0;  
  255.             } break;  
  256.               
  257.         case 1:                 /*STATE=1,倒计时分调整*/  
  258.             {  
  259.                 EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;  
  260.                 L2=1; L0=0; L1=0;  
  261.                 REVERSE[0]=0;  
  262.                 REVERSE[1]=0;  
  263.             } break;  
  264.               
  265.         case 2:                 /*STATE=2,倒计时小时调整*/  
  266.             {  
  267.                 EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;  
  268.                 L2=1; L0=0; L1=0;  
  269.                 REVERSE[0]=0;  
  270.                 REVERSE[1]=0;  
  271.             } break;  
  272.               
  273.         case 3:                 /*STATE=3,倒计时运行*/  
  274.             {  
  275.                 EX1=0; ET1=1; ET2=1; TR1=1;   
  276.                 if ((REVERSE[2]==0)&&(REVERSE[3]==0)) L2=1;  
  277.                 else TR2=1;  
  278.                 L0=0; L1=0;  
  279.             } break;  
  280.               
  281.         case 5:                 /*STATE=5,时钟分调整*/  
  282.             {  
  283.                 IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;   
  284.                 L0=1; L1=0; L2=0;  
  285.             } break;  
  286.               
  287.         case 6:/*STATE=6,时钟时调整*/  
  288.             {  
  289.                 IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;   
  290.                 L0=1; L1=0; L2=0;  
  291.             } break;  
  292.               
  293.         default:                    /*STATE=4 or 7,时钟运行*/  
  294.             {  
  295.                 EX1=0; ET1=0; ET2=1; TR0=1;  
  296.                 L1=0; L2=0;  
  297.             }  
  298.         }  
  299.           
  300.     while (STATE==stabak)   
  301.         {  
  302.             switch (STATE)  
  303.                 {  
  304.                 case 0:             /*STATE=0,秒表*/  
  305.                 {  
  306.                     BUFFER[0]=SECOND[0];  
  307.                     BUFFER[1]=SECOND[1];  
  308.                 } break;  
  309.                   
  310.                 case 1:             /*STATE=1,倒计时分调整*/  
  311.                 {  
  312.                     BUFFER[0]=REVERSE[2];  
  313.                     BUFFER[1]=101;/*A-*/  
  314.                 } break;  
  315.                   
  316.                 case 2:             /*STATE=2,倒计时小时调整*/  
  317.                 {  
  318.                     BUFFER[0]=110;/*-A*/  
  319.                     BUFFER[1]=REVERSE[3];  
  320.                 } break;  
  321.                   
  322.                 case 3:             /*STATE=3,倒计时运行*/  
  323.                 {                     
  324.                     BUFFER[0]=REVERSE[2];  
  325.                     BUFFER[1]=REVERSE[3];  
  326.                 } break;  
  327.                   
  328.                 case 5:             /*STATE=5,时钟分调整*/  
  329.                 {  
  330.                     BUFFER[0]=CLOCK[2];  
  331.                     BUFFER[1]=101;/*A-*/  
  332.                 } break;  
  333.                   
  334.                 case 6:             /*STATE=6,时钟时调整*/  
  335.                 {  
  336.                     BUFFER[0]=110;/*-A*/  
  337.                     BUFFER[1]=CLOCK[3];  
  338.                 } break;  
  339.                   
  340.                 default:                /*STATE=4 or 7,时钟运行*/  
  341.                 {  
  342.                     BUFFER[0]=CLOCK[2];  
  343.                     BUFFER[1]=CLOCK[3];               
  344.                 }  
  345.             }  
  346.               
  347.             display();  
  348.             K0=1; K1=1; K2=1;  
  349.             STATE=P1&0x07;            
  350.         }  
  351.         stabak=STATE;  
  352.     }     
  353. }  

 

 

 类似资料: