久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3091|回復: 1
打印 上一主題 下一主題
收起左側

51單片機超簡單小時鐘制作 V1.2

[復制鏈接]
跳轉到指定樓層
樓主
這個時鐘我之前發過,今天我把程序升級成了 V1.2
原帖:http://www.zg4o1577.cn/bbs/dpj-186559-1.html

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

  11. #include <STC12C5630AD.H>

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

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

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

  33. #define P3M0SET                0x08 //設置I/O口工作方式//00001000(左到右,高到低位)
  34. #define P3M1SET                0x80 //設置I/O口工作方式//10000000
  35. #define P1M0SET                0x00 //設置I/O口工作方式//00000000
  36. #define P1M1SET                0x00 //設置I/O口工作方式//00000000
  37. #define P2M0SET                0x00 //設置I/O口工作方式//00000000
  38. #define P2M1SET                0xc1 //設置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;    // 軟計數器,對50ms時基信號累加到1s
  42. unsigned char PWM;         //顯示亮度
  43. unsigned char MENU=0;                //菜單值
  44. bit r=1;                                    //秒點閃爍標志位                                       
  45.                  
  46. unsigned char code disdata[]={
  47. 0x3f,0x06,0x5b,0x4f,0x66,
  48. 0x6d,0x7d,0x07,0x7f,0x6f         //無小數點數碼管段碼表(0~9)
  49. };
  50. /*********************************************************************************************/
  51. void delay (unsigned int a){ // 點掃描用的延時
  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; //關所有顯示
  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; //將顯示數據送入                        
  187.                  case 2: displayHH2(d); break; //將顯示數據送入                        
  188.                  case 3: displayHH3(d); break; //將顯示數據送入                        
  189.                  case 4: displayHH4(d); break; //將顯示數據送入                        
  190.           }
  191. }
  192. /**********************************************************************************************/
  193. void ChuLi (void){
  194.          switch (MENU){
  195.                 case 0:
  196.       TR0 = 1;                //定時器0開始計時
  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時  (正常顯示狀態)

  211.                 case 1:
  212.               BEEP=1;
  213.               TR0 = 0;                //關閉定時器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時        (小時調整)

  219.                 case 2:
  220.               TR0 = 0;                //關閉定時器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時         (分鐘調整)
  228.                            
  229.                 case 3:
  230.               BEEP=1;
  231.               TR0 = 0;                //關閉定時器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時        (鬧鐘1小時調整)

  237.                 case 4:
  238.               TR0 = 0;                //關閉定時器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時         (鬧鐘1分鐘調整)
  246.                                  
  247.                 case 5:
  248.               BEEP=1;
  249.               TR0 = 0;                //關閉定時器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時        (鬧鐘2小時調整)

  255.                 case 6:
  256.               TR0 = 0;                //關閉定時器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時         (鬧鐘2分鐘調整)                        
  264.                                  
  265.                 case 7:
  266.               BEEP=1;
  267.               TR0 = 0;                //關閉定時器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時        (鬧鐘2小時調整)

  273.                 case 8:
  274.               TR0 = 0;                //關閉定時器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時         (鬧鐘2分鐘調整)                                 
  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;                //定時器時鐘12T模式
  301.         TMOD &= 0xF0;                //設置定時器模式
  302.         TMOD |= 0x01;                //設置定時器模式
  303.   EA = 1;         // 開總中斷   
  304.         TH0 = 0x3C;                //設置定時初值
  305.         TL0 = 0xB0;                //設置定時初值
  306.   ET0 = 1;        // 定時/計數器0允許中斷   
  307.         TF0 = 0;                //清除TF0標志
  308.         TR0 = 1;                //定時器0開始計時

  309. ////
  310.         //TIME_HH = 10; //初始時間:10時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中斷服務程序(產生50ms時基信號)   
  332.     cou++;                         // 軟計數器加1   
  333.     if(cou >= 20){                 // 計數值到100(1s)   
  334.       cou = 0;                     // 軟計數器清零   
  335.       TIME_SS++;                   // 秒計數器加1(進位50ms*20=1s)   
  336.       r=~r;                                               // 秒點閃爍
  337.         if(TIME_SS >= 60){         // 秒計數值到60   
  338.           TIME_SS = 0;             // 秒計數器清零   
  339.           TIME_MM++;               // 分計數器加1(進位60s=1m)  
  340.             if(TIME_MM >= 60){     // 分計數到60   
  341.               TIME_MM = 0;         // 分計數器清零   
  342.               TIME_HH++;           // 時計數器加1(進位60m=1h)   
  343.                 if(TIME_HH >= 24){ // 時計數到23   
  344.                   TIME_HH = 0;     // 時計數器清零
  345.                                         }  
  346.             }   
  347.         }  
  348.         }
  349.         TH0 = 0x3C;                //設置定時初值      
  350.         TL0 = 0xB0;                //設置定時初值
  351. }
  352. /**********************************************************************************************/        
復制代碼

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:639106 發表于 2020-5-16 08:47 | 只看該作者


這是用單片機直接驅動數碼管的
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九色视频网站 | 日本三级电影在线看 | 国产精品国产精品国产专区不卡 | 中文字幕不卡在线观看 | 精品一区二区三区在线观看 | 激情欧美一区二区三区中文字幕 | 欧美影院久久 | 国产一区二区不卡 | 中文字幕国产视频 | 在线不卡一区 | 综合国产| 97国产成人| 日本不卡一区二区三区 | 国产不卡在线观看 | 超碰97人人人人人蜜桃 | 九九久久精品视频 | 中文在线一区二区 | 一区二区三区在线看 | 日韩视频1 | 久久91 | 精品国产第一区二区三区 | 成人激情视频免费在线观看 | 天堂视频中文在线 | 99色综合 | 成人高清视频在线观看 | 亚洲成人免费视频在线观看 | 日韩网站免费观看 | 亚洲一区精品在线 | 观看av| 欧美日韩在线精品 | 羞羞视频在线观看网站 | 欧美日韩一区二区三区不卡视频 | 国产精品国产a级 | 日韩欧美一级精品久久 | 91精品国产色综合久久不卡98 | 欧美日韩一区二区在线观看 | 一区视频在线免费观看 | 欧美6一10sex性hd | 日韩国产在线 | 超碰超碰 | 国产成人免费视频 |