找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3131|回復(fù): 1
收起左側(cè)

51單片機(jī)超簡單小時(shí)鐘制作 V1.2

[復(fù)制鏈接]
ID:639106 發(fā)表于 2020-5-15 12:14 | 顯示全部樓層 |閱讀模式
這個(gè)時(shí)鐘我之前發(fā)過,今天我把程序升級(jí)成了 V1.2
原帖:http://www.torrancerestoration.com/bbs/dpj-186559-1.html

單片機(jī)源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    數(shù)碼管時(shí)鐘 ZJW48 V1.2正式版
  3. 編寫人:    張晉瑋 
  4. 編寫時(shí)間:  2020年5月14日
  5. 硬件支持:  一定要用型號(hào)為4563BS的數(shù)碼管,否則可能無法正常顯示
  6. 接口說明:  無                                                         
  7. /*********************************************************************************************
  8. 說明:先要把STC12C5630AD的頭文件復(fù)制到Keil/C51/INC里
  9.           (如果有的話就不用)
  10. /*********************************************************************************************/

  11. #include <STC12C5630AD.H>

  12. /**********************************************************************************************/
  13. //-------程序調(diào)試設(shè)置項(xiàng)-------
  14. #define LI                        4         //設(shè)置LED顯示的亮度(值域:1~9)
  15. #define DELAY                10         //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長度(1~20)
  16. /*********************************************************************************************/
  17. sbit        LED_H1        =P2 ^ 0; //設(shè)置LED數(shù)碼管連接的I/O口
  18. sbit        LED_H2        =P3 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
  19. sbit        LED_H3        =P2 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
  20. sbit        LED_H4        =P2 ^ 6; //設(shè)置LED數(shù)碼管連接的I/O口

  21. sbit        LED_L1        =P1 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
  22. sbit        LED_L2        =P1 ^ 0; //設(shè)置LED數(shù)碼管連接的I/O口
  23. sbit        LED_L3        =P1 ^ 3; //設(shè)置LED數(shù)碼管連接的I/O口
  24. sbit        LED_L4        =P1 ^ 5; //設(shè)置LED數(shù)碼管連接的I/O口
  25. sbit        LED_L5        =P1 ^ 6; //設(shè)置LED數(shù)碼管連接的I/O口
  26. sbit        LED_L6        =P1 ^ 1; //設(shè)置LED數(shù)碼管連接的I/O口
  27. sbit        LED_L7        =P1 ^ 2; //設(shè)置LED數(shù)碼管連接的I/O口
  28. sbit        LED_L8        =P1 ^ 4; //設(shè)置LED數(shù)碼管連接的I/O口                                                

  29. sbit        BEEP         =  P2 ^ 4; //揚(yáng)聲器
  30. sbit        KEY1         =  P2 ^ 5; //按鍵1(M鍵)                        
  31. sbit        KEY2         =  P2 ^ 2; //按鍵2(+鍵)
  32. sbit        KEY3         =  P3 ^ 3; //按鍵3(關(guān)蜂鳴器鍵)

  33. #define P3M0SET                0x08 //設(shè)置I/O口工作方式//00001000(左到右,高到低位)
  34. #define P3M1SET                0x80 //設(shè)置I/O口工作方式//10000000
  35. #define P1M0SET                0x00 //設(shè)置I/O口工作方式//00000000
  36. #define P1M1SET                0x00 //設(shè)置I/O口工作方式//00000000
  37. #define P2M0SET                0x00 //設(shè)置I/O口工作方式//00000000
  38. #define P2M1SET                0xc1 //設(shè)置I/O口工作方式//11000001

  39. unsigned char TIME_HH,TIME_MM,TIME_SS=0;
  40. unsigned char TIME_FH,TIME_FM,TIME_RH,TIME_RM,TIME_TH,TIME_TM=0;
  41. unsigned char cou  = 0;    // 軟計(jì)數(shù)器,對(duì)50ms時(shí)基信號(hào)累加到1s
  42. unsigned char PWM;         //顯示亮度
  43. unsigned char MENU=0;                //菜單值
  44. bit r=1;                                    //秒點(diǎn)閃爍標(biāo)志位                                       
  45.                  
  46. unsigned char code disdata[]={
  47. 0x3f,0x06,0x5b,0x4f,0x66,
  48. 0x6d,0x7d,0x07,0x7f,0x6f         //無小數(shù)點(diǎn)數(shù)碼管段碼表(0~9)
  49. };
  50. /*********************************************************************************************/
  51. void delay (unsigned int a){ // 點(diǎn)掃描用的延時(shí)
  52.         unsigned int i;
  53.         while( --a != 0){
  54.                 for(i = 0; i < DELAY; i++);
  55.         }                                      
  56. }
  57. /*********************************************************************************************/
  58. void MCU_YS (unsigned int a){
  59.         unsigned int i;
  60.         while( --a != 0){
  61.                 for(i = 0; i < 600; i++);
  62.         }
  63. }
  64. /*********************************************************************************************/
  65. void dis_off (void){
  66.         P3 = ~P3M1SET; //關(guān)所有顯示
  67.         P1 = ~P1M1SET;
  68.         P2 = ~P2M1SET;
  69.         delay(10-PWM);
  70. }
  71. /*********************************************************************************************/
  72. void displayHH1 (unsigned char d){ //第1列橫向顯示程序
  73.         unsigned char i;
  74.         i = d & 0x01;
  75.         if(i == 0x01){
  76.                 LED_H1 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  77.         i = d & 0x02;
  78.         if(i == 0x02){
  79.                 LED_H1 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  80.         i = d & 0x04;
  81.         if(i == 0x04){
  82.                 LED_H1 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  83.         i = d & 0x08;
  84.         if(i == 0x08){
  85.                 LED_H1 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  86.         i = d & 0x10;
  87.         if(i == 0x10){
  88.                 LED_H1 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  89.         i = d & 0x20;
  90.         if(i == 0x20){
  91.                 LED_H1 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  92.         i = d & 0x40;
  93.         if(i == 0x40){
  94.                 LED_H1 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  95.         i = d & 0x80;
  96.         if(i == 0x80){
  97.                 LED_H1 = 1;LED_L8 = 0;}delay(PWM);dis_off();
  98. }
  99. /*********************************************************************************************/
  100. void displayHH2 (unsigned char d){ //第2列橫向顯示程序
  101.         unsigned char i;
  102.         i = d & 0x01;
  103.         if(i == 0x01){
  104.                 LED_H2 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  105.         i = d & 0x02;
  106.         if(i == 0x02){
  107.                 LED_H2 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  108.         i = d & 0x04;
  109.         if(i == 0x04){
  110.                 LED_H2 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  111.         i = d & 0x08;
  112.         if(i == 0x08){
  113.                 LED_H2 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  114.         i = d & 0x10;
  115.         if(i == 0x10){
  116.                 LED_H2 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  117.         i = d & 0x20;
  118.         if(i == 0x20){
  119.                 LED_H2 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  120.         i = d & 0x40;
  121.         if(i == 0x40){
  122.                 LED_H2 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  123.         i = d & 0x80;
  124.         if(i == 0x80){
  125.                 LED_H2 = 1;LED_L8 = 0;}delay(PWM);dis_off();

  126. }
  127. /*********************************************************************************************/
  128. void displayHH3 (unsigned char d){ //第3列橫向顯示程序
  129.         unsigned char i;
  130.         i = d & 0x01;
  131.         if(i == 0x01){
  132.                 LED_H3 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  133.         i = d & 0x02;
  134.         if(i == 0x02){
  135.                 LED_H3 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  136.         i = d & 0x04;
  137.         if(i == 0x04){
  138.                 LED_H3 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  139.         i = d & 0x08;
  140.         if(i == 0x08){
  141.                 LED_H3 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  142.         i = d & 0x10;
  143.         if(i == 0x10){
  144.                 LED_H3 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  145.         i = d & 0x20;
  146.         if(i == 0x20){
  147.                 LED_H3 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  148.         i = d & 0x40;
  149.         if(i == 0x40){
  150.                 LED_H3 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  151.         i = d & 0x80;
  152.         if(i == 0x80){
  153.                 LED_H3 = 1;LED_L8 = 0;}delay(PWM);dis_off();

  154. }
  155. /*********************************************************************************************/
  156. void displayHH4 (unsigned char d){ //第4列橫向顯示程序
  157.         unsigned char i;
  158.         i = d & 0x01;
  159.         if(i == 0x01){
  160.                 LED_H4 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  161.         i = d & 0x02;
  162.         if(i == 0x02){
  163.                 LED_H4 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  164.         i = d & 0x04;
  165.         if(i == 0x04){
  166.                 LED_H4 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  167.         i = d & 0x08;
  168.         if(i == 0x08){
  169.                 LED_H4 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  170.         i = d & 0x10;
  171.         if(i == 0x10){
  172.                 LED_H4 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  173.         i = d & 0x20;
  174.         if(i == 0x20){
  175.                 LED_H4 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  176.         i = d & 0x40;
  177.         if(i == 0x40){
  178.                 LED_H4 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  179.         i = d & 0x80;
  180.         if(i == 0x80){
  181.                 LED_H4 = 1;LED_L8 = 0;}delay(PWM);dis_off();
  182. }
  183. /*********************************************************************************************/
  184. void diplay_data (unsigned char l,unsigned char d){
  185.           switch (l){                    //顯示的列位置               
  186.                  case 1: displayHH1(d); break; //將顯示數(shù)據(jù)送入                        
  187.                  case 2: displayHH2(d); break; //將顯示數(shù)據(jù)送入                        
  188.                  case 3: displayHH3(d); break; //將顯示數(shù)據(jù)送入                        
  189.                  case 4: displayHH4(d); break; //將顯示數(shù)據(jù)送入                        
  190.           }
  191. }
  192. /**********************************************************************************************/
  193. void ChuLi (void){
  194.          switch (MENU){
  195.                 case 0:
  196.       TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  197.                    if(r){
  198.                          diplay_data (1,disdata[TIME_HH/10]);
  199.                          diplay_data (2,disdata[TIME_HH%10]+0x80);         
  200.                          diplay_data (3,disdata[TIME_MM/10]);
  201.                          diplay_data (4,disdata[TIME_MM%10]);
  202.                    }else{                                                        
  203.                          diplay_data (1,disdata[TIME_HH/10]);
  204.                          diplay_data (2,disdata[TIME_HH%10]);
  205.                          diplay_data (3,disdata[TIME_MM/10]);
  206.                          diplay_data (4,disdata[TIME_MM%10]);
  207.                     }
  208.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  209.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){PWM++;if(PWM>=10){PWM=1;}}}        
  210.                  break;///  MENU為0時(shí)  (正常顯示狀態(tài))

  211.                 case 1:
  212.               BEEP=1;
  213.               TR0 = 0;                //關(guān)閉定時(shí)器0
  214.                          diplay_data (1,disdata[TIME_HH/10]);
  215.                          diplay_data (2,disdata[TIME_HH%10]+0x80);
  216.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  217.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_HH++;if(TIME_HH>=24){TIME_HH=0;}}}
  218.                 break;        ///          MENU為1時(shí)        (小時(shí)調(diào)整)

  219.                 case 2:
  220.               TR0 = 0;                //關(guān)閉定時(shí)器0
  221.               BEEP=1;
  222.                          diplay_data (2,0x80);
  223.                          diplay_data (3,disdata[TIME_MM/10]);
  224.                          diplay_data (4,disdata[TIME_MM%10]);
  225.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  226.                           if(KEY2==0){MCU_YS(85); if(KEY2==0){TIME_MM++;if(TIME_MM>=60){TIME_MM=0;}}}
  227.                  break;        ///          MENU為2時(shí)         (分鐘調(diào)整)
  228.                            
  229.                 case 3:
  230.               BEEP=1;
  231.               TR0 = 0;                //關(guān)閉定時(shí)器0
  232.                          diplay_data (1,disdata[TIME_FH/10]);
  233.                          diplay_data (2,disdata[TIME_FH%10]+0x80);
  234.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  235.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FH++;if(TIME_FH>=24){TIME_FH=0;}}}
  236.                                 break;        ///          MENU為3時(shí)        (鬧鐘1小時(shí)調(diào)整)

  237.                 case 4:
  238.               TR0 = 0;                //關(guān)閉定時(shí)器0
  239.               BEEP=1;
  240.                           diplay_data (2,0x80);
  241.                     diplay_data (3,disdata[TIME_FM/10]);
  242.                           diplay_data (4,disdata[TIME_FM%10]);
  243.                      if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  244.                      if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FM++;if(TIME_FM>=60){TIME_FM=0;}}}
  245.             break;        ///          MENU為4時(shí)         (鬧鐘1分鐘調(diào)整)
  246.                                  
  247.                 case 5:
  248.               BEEP=1;
  249.               TR0 = 0;                //關(guān)閉定時(shí)器0
  250.                          diplay_data (1,disdata[TIME_RH/10]);
  251.                          diplay_data (2,disdata[TIME_RH%10]+0x80);
  252.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  253.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_RH++;if(TIME_RH>=24){TIME_RH=0;}}}
  254.                                 break;        ///          MENU為3時(shí)        (鬧鐘2小時(shí)調(diào)整)

  255.                 case 6:
  256.               TR0 = 0;                //關(guān)閉定時(shí)器0
  257.               BEEP=1;
  258.                           diplay_data (2,0x80);
  259.                     diplay_data (3,disdata[TIME_RM/10]);
  260.                           diplay_data (4,disdata[TIME_RM%10]);
  261.                      if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  262.                      if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_RM++;if(TIME_RM>=60){TIME_RM=0;}}}
  263.             break;        ///          MENU為4時(shí)         (鬧鐘2分鐘調(diào)整)                        
  264.                                  
  265.                 case 7:
  266.               BEEP=1;
  267.               TR0 = 0;                //關(guān)閉定時(shí)器0
  268.                          diplay_data (1,disdata[TIME_TH/10]);
  269.                          diplay_data (2,disdata[TIME_TH%10]+0x80);
  270.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  271.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_TH++;if(TIME_TH>=24){TIME_TH=0;}}}
  272.                                 break;        ///          MENU為3時(shí)        (鬧鐘2小時(shí)調(diào)整)

  273.                 case 8:
  274.               TR0 = 0;                //關(guān)閉定時(shí)器0
  275.               BEEP=1;
  276.                           diplay_data (2,0x80);
  277.                     diplay_data (3,disdata[TIME_TM/10]);
  278.                           diplay_data (4,disdata[TIME_TM%10]);
  279.                      if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU=0;}}
  280.                      if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_TM++;if(TIME_TM>=60){TIME_TM=0;}}}
  281.             break;        ///          MENU為4時(shí)         (鬧鐘2分鐘調(diào)整)                                 
  282.                                  
  283.           }
  284. }
  285. /*********************************************************************************************/
  286. void init (void){ //上電初始化
  287.         P3M0 = P3M0SET;
  288.         P3M1 = P3M1SET;
  289.         P1M0 = P1M0SET;
  290.         P1M1 = P1M1SET;
  291.         P2M0 = P2M0SET;
  292.         P2M1 = P2M1SET;
  293. ////
  294.         KEY1=1;
  295.         KEY2=1;
  296.         BEEP=1;
  297.         dis_off();
  298.         PWM = LI;
  299. ////
  300.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  301.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  302.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  303.   EA = 1;         // 開總中斷   
  304.         TH0 = 0x3C;                //設(shè)置定時(shí)初值
  305.         TL0 = 0xB0;                //設(shè)置定時(shí)初值
  306.   ET0 = 1;        // 定時(shí)/計(jì)數(shù)器0允許中斷   
  307.         TF0 = 0;                //清除TF0標(biāo)志
  308.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)

  309. ////
  310.         //TIME_HH = 10; //初始時(shí)間:10時(shí)55分00秒
  311.         //TIME_MM = 55;
  312.         //TIME_SS = 00;
  313. }
  314. /*********************************************************************************************/
  315. void main (void){ //主程序
  316.         init();                  //初始化
  317.         while (1){
  318.    ChuLi();
  319.                
  320.           if(TIME_FH+TIME_FM!=0){if(TIME_HH==TIME_FH){if(TIME_MM==TIME_FM){
  321.      BEEP=0;if(KEY3==1){TIME_FM=0;TIME_FH=0;}}}}
  322.                  
  323.           if(TIME_RH+TIME_RM!=0){if(TIME_HH==TIME_RH){if(TIME_MM==TIME_RM){
  324.      BEEP=0;if(KEY3==1){TIME_RM=0;TIME_RH=0;}}}}
  325.                  
  326.           if(TIME_TH+TIME_TM!=0){if(TIME_HH==TIME_TH){if(TIME_MM==TIME_TM){
  327.      BEEP=0;if(KEY3==1){TIME_TM=0;TIME_TH=0;}}}}

  328.     }         //while
  329. }                 //main
  330. /**********************************************************************************************/        
  331. void tiem0(void) interrupt 1{      // T/C0中斷服務(wù)程序(產(chǎn)生50ms時(shí)基信號(hào))   
  332.     cou++;                         // 軟計(jì)數(shù)器加1   
  333.     if(cou >= 20){                 // 計(jì)數(shù)值到100(1s)   
  334.       cou = 0;                     // 軟計(jì)數(shù)器清零   
  335.       TIME_SS++;                   // 秒計(jì)數(shù)器加1(進(jìn)位50ms*20=1s)   
  336.       r=~r;                                               // 秒點(diǎn)閃爍
  337.         if(TIME_SS >= 60){         // 秒計(jì)數(shù)值到60   
  338.           TIME_SS = 0;             // 秒計(jì)數(shù)器清零   
  339.           TIME_MM++;               // 分計(jì)數(shù)器加1(進(jìn)位60s=1m)  
  340.             if(TIME_MM >= 60){     // 分計(jì)數(shù)到60   
  341.               TIME_MM = 0;         // 分計(jì)數(shù)器清零   
  342.               TIME_HH++;           // 時(shí)計(jì)數(shù)器加1(進(jìn)位60m=1h)   
  343.                 if(TIME_HH >= 24){ // 時(shí)計(jì)數(shù)到23   
  344.                   TIME_HH = 0;     // 時(shí)計(jì)數(shù)器清零
  345.                                         }  
  346.             }   
  347.         }  
  348.         }
  349.         TH0 = 0x3C;                //設(shè)置定時(shí)初值      
  350.         TL0 = 0xB0;                //設(shè)置定時(shí)初值
  351. }
  352. /**********************************************************************************************/        
復(fù)制代碼

全部資料51hei下載地址:
Clock_ZJW48 V1.2.7z (392.72 KB, 下載次數(shù): 25)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:639106 發(fā)表于 2020-5-16 08:47 | 顯示全部樓層
51hei圖片_202005031108543.jpg 51hei圖片_202005031118281.jpg 51hei圖片_20200503111828.jpg

這是用單片機(jī)直接驅(qū)動(dòng)數(shù)碼管的
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表