找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超简单小时钟制作 V1.2

[复制链接]
跳转到指定楼层
楼主
这个时钟我之前发过,今天我把程序升级成了 V1.2
原帖:http://www.51hei.com/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 单片机教程网

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