找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3107|回复: 6
收起左侧

一个小学生都会做的单片机时钟。带源程序

[复制链接]
ID:639106 发表于 2020-5-3 11:36 | 显示全部楼层 |阅读模式
    自己做的小时钟--没用时钟芯片。。。           注: 时钟精度取决于晶振精度(这是用单片机产生时钟的)   功能详见资料和源程序。。。。                                                       本人是新手,请别介意
长按P2.5的按键,进入下一项调整;
在正常显示状态下,短按2.2的按键进行亮度调整;
在调时状态下,短按2.2的按键进行加1调整;
在闹钟鸣响状态下,轻触单片机的3.3进行关闭闹钟;程序下载:http://www.51hei.com/bbs/dpj-186560-1.html
51hei图片_20200503111828.jpg
单片机源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    数码管时钟 ZJW48
  3. 编写人:    张晋玮 
  4. 编写时间:  2020年5月2日
  5. 硬件支持:  一定要用型号为4563BS的数码管,否则可能无法正常显示
  6. 接口说明:  无                                                         
  7. /*********************************************************************************************
  8. 说明:先要把STC12C5608AD的头文件复制到Keil/C51/INC里
  9.           (如果有的话就不用)
  10. /*********************************************************************************************/

  11. #include <STC12C5630AD.H>

  12. /**********************************************************************************************/
  13. //-------程序调试设置项-------
  14. #define LI                        5         //设置LED显示的亮度(值域:1~9)
  15. #define DELAY                9         //设置每一个点显示的时间长度(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_FH,TIME_FM,TIME_HH,TIME_MM,TIME_SS=0;
  40. unsigned char cou  = 0;    // 软计数器,对50ms时基信号累加到1s
  41. unsigned char PWM;         //显示亮度
  42. unsigned char MENU=0;                //菜单值
  43. bit r=1;                                    //秒点闪烁标志位                                                         

  44. unsigned char code disdata[]={
  45. 0x3f,0x06,0x5b,0x4f,0x66,
  46. 0x6d,0x7d,0x07,0x7f,0x6f         //无小数点数码管段码表(0~9)
  47. };
  48. /*********************************************************************************************/
  49. void delay (unsigned int a){ // 用于点扫描的延时
  50.         unsigned int i;
  51.         while( --a != 0){
  52.                 for(i = 0; i < DELAY; i++);
  53.         }                                      
  54. }
  55. /*********************************************************************************************/
  56. void MCU_YS (unsigned int a){
  57.         unsigned int i;
  58.         while( --a != 0){
  59.                 for(i = 0; i < 600; i++);
  60.         }
  61. }
  62. /*********************************************************************************************/
  63. void dis_off (void){
  64.         P3 = ~P3M1SET; //关所有显示
  65.         P1 = ~P1M1SET;
  66.         P2 = ~P2M1SET;
  67.         delay(10-PWM);
  68. }
  69. /*********************************************************************************************/
  70. void displayHH1 (unsigned char d){ //第1列横向显示程序
  71.         unsigned char i;
  72.         i = d & 0x01;
  73.         if(i == 0x01){
  74.                 LED_H1 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  75.         i = d & 0x02;
  76.         if(i == 0x02){
  77.                 LED_H1 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  78.         i = d & 0x04;
  79.         if(i == 0x04){
  80.                 LED_H1 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  81.         i = d & 0x08;
  82.         if(i == 0x08){
  83.                 LED_H1 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  84.         i = d & 0x10;
  85.         if(i == 0x10){
  86.                 LED_H1 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  87.         i = d & 0x20;
  88.         if(i == 0x20){
  89.                 LED_H1 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  90.         i = d & 0x40;
  91.         if(i == 0x40){
  92.                 LED_H1 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  93.         i = d & 0x80;
  94.         if(i == 0x80){
  95.                 LED_H1 = 1;LED_L8 = 0;}delay(PWM);dis_off();
  96. }
  97. /*********************************************************************************************/
  98. void displayHH2 (unsigned char d){ //第2列横向显示程序
  99.         unsigned char i;
  100.         i = d & 0x01;
  101.         if(i == 0x01){
  102.                 LED_H2 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  103.         i = d & 0x02;
  104.         if(i == 0x02){
  105.                 LED_H2 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  106.         i = d & 0x04;
  107.         if(i == 0x04){
  108.                 LED_H2 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  109.         i = d & 0x08;
  110.         if(i == 0x08){
  111.                 LED_H2 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  112.         i = d & 0x10;
  113.         if(i == 0x10){
  114.                 LED_H2 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  115.         i = d & 0x20;
  116.         if(i == 0x20){
  117.                 LED_H2 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  118.         i = d & 0x40;
  119.         if(i == 0x40){
  120.                 LED_H2 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  121.         i = d & 0x80;
  122.         if(i == 0x80){
  123.                 LED_H2 = 1;LED_L8 = 0;}delay(PWM);dis_off();

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

  152. }
  153. /*********************************************************************************************/
  154. void displayHH4 (unsigned char d){ //第4列横向显示程序
  155.         unsigned char i;
  156.         i = d & 0x01;
  157.         if(i == 0x01){
  158.                 LED_H4 = 1;LED_L1 = 0;}delay(PWM);dis_off();
  159.         i = d & 0x02;
  160.         if(i == 0x02){
  161.                 LED_H4 = 1;LED_L2 = 0;}delay(PWM);dis_off();
  162.         i = d & 0x04;
  163.         if(i == 0x04){
  164.                 LED_H4 = 1;LED_L3 = 0;}delay(PWM);dis_off();
  165.         i = d & 0x08;
  166.         if(i == 0x08){
  167.                 LED_H4 = 1;LED_L4 = 0;}delay(PWM);dis_off();
  168.         i = d & 0x10;
  169.         if(i == 0x10){
  170.                 LED_H4 = 1;LED_L5 = 0;}delay(PWM);dis_off();
  171.         i = d & 0x20;
  172.         if(i == 0x20){
  173.                 LED_H4 = 1;LED_L6 = 0;}delay(PWM);dis_off();
  174.         i = d & 0x40;
  175.         if(i == 0x40){
  176.                 LED_H4 = 1;LED_L7 = 0;}delay(PWM);dis_off();
  177.         i = d & 0x80;
  178.         if(i == 0x80){
  179.                 LED_H4 = 1;LED_L8 = 0;}delay(PWM);dis_off();
  180. }
  181. /*********************************************************************************************/
  182. void diplay_data (unsigned char l,unsigned char d){
  183.           switch (l){                      //显示的列位置               
  184.                  case 1: displayHH1(d); break; //将显示数据送入                        
  185.                  case 2: displayHH2(d); break; //将显示数据送入                        
  186.                  case 3: displayHH3(d); break; //将显示数据送入                        
  187.                  case 4: displayHH4(d); break; //将显示数据送入                        
  188.           }
  189. }
  190. /*********************************************************************************************/
  191. void init (void){ //上电初始化
  192.         P3M0 = P3M0SET;
  193.         P3M1 = P3M1SET;
  194.         P1M0 = P1M0SET;
  195.         P1M1 = P1M1SET;
  196.         P2M0 = P2M0SET;
  197.         P2M1 = P2M1SET;
  198. ////
  199.         BEEP=1;
  200.         dis_off();
  201.         PWM = LI;
  202. ////
  203.         AUXR &= 0x7F;                //定时器时钟12T模式
  204.         TMOD &= 0xF0;                //设置定时器模式
  205.         TMOD |= 0x01;                //设置定时器模式
  206.   EA = 1;         // 开总中断   
  207.         TH0 = 0x3C;                //设置定时初值
  208.         TL0 = 0xB0;                //设置定时初值
  209.   ET0 = 1;        // 定时/计数器0允许中断   
  210.         TF0 = 0;                //清除TF0标志
  211.         TR0 = 1;                //定时器0开始计时

  212. ////
  213.         //TIME_HH = 19; //初始时间:19时13分40秒
  214.         //TIME_MM = 13;
  215.         //TIME_SS = 40;
  216. }
  217. /*********************************************************************************************/
  218. void main (void){ //主程序
  219.         init();                  //初始化
  220.         while (1){
  221.           switch (MENU){
  222.                 case 0:
  223.       TR0 = 1;                //定时器0开始计时
  224.                    if(r){
  225.                          diplay_data (1,disdata[TIME_HH/10]);
  226.                          diplay_data (2,disdata[TIME_HH%10]+0x80);         
  227.                          diplay_data (3,disdata[TIME_MM/10]);
  228.                          diplay_data (4,disdata[TIME_MM%10]);
  229.                    }else{                                                        
  230.                          diplay_data (1,disdata[TIME_HH/10]);
  231.                          diplay_data (2,disdata[TIME_HH%10]);
  232.                          diplay_data (3,disdata[TIME_MM/10]);
  233.                          diplay_data (4,disdata[TIME_MM%10]);
  234.                     }
  235.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  236.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){PWM++;if(PWM>=10){PWM=1;}}}        
  237.                  break;///  MENU为0时  (正常显示状态)

  238.                 case 1:
  239.               BEEP=1;
  240.               TR0 = 0;                //关闭定时器0
  241.                          diplay_data (1,disdata[TIME_HH/10]);
  242.                          diplay_data (2,disdata[TIME_HH%10]+0x80);
  243.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  244.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_HH++;if(TIME_HH>=24){TIME_HH=0;}}}
  245.                 break;        ///          MENU为1时        (小时调整)

  246.                 case 2:
  247.               TR0 = 0;                //关闭定时器0
  248.               BEEP=1;
  249.                          diplay_data (2,0x80);
  250.                          diplay_data (3,disdata[TIME_MM/10]);
  251.                          diplay_data (4,disdata[TIME_MM%10]);
  252.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  253.                           if(KEY2==0){MCU_YS(85); if(KEY2==0){TIME_MM++;if(TIME_MM>=60){TIME_MM=0;}}}
  254.                  break;        ///          MENU为2时         (分钟调整)
  255.                            
  256.                 case 3:
  257.               BEEP=1;
  258.               TR0 = 0;                //关闭定时器0
  259.                          diplay_data (1,disdata[TIME_FH/10]);
  260.                          diplay_data (2,disdata[TIME_FH%10]+0x80);
  261.                     if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
  262.                     if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FH++;if(TIME_FH>=24){TIME_FH=0;}}}
  263.                                 break;        ///          MENU为3时        (闹钟小时调整)

  264.                 case 4:
  265.               TR0 = 0;                //关闭定时器0
  266.               BEEP=1;
  267.                           diplay_data (2,0x80);
  268.                     diplay_data (3,disdata[TIME_FM/10]);
  269.                           diplay_data (4,disdata[TIME_FM%10]);
  270.                      if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU=0;}}
  271.                      if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FM++;if(TIME_FM>=60){TIME_FM=0;}}}
  272.             break;        ///          MENU为4时         (闹钟分钟调整)
  273.           }

  274.                    if(TIME_FH+TIME_FM!=0){if(TIME_HH==TIME_FH){if(TIME_MM==TIME_FM){BEEP=0;if(KEY3==1){TIME_FM=0;TIME_FH=0;}}}}

  275.     }         //while
  276. }                 //main
  277. /**********************************************************************************************/        
  278. void tiem0(void) interrupt 1{      // T/C0中断服务程序(产生50ms时基信号)   
  279.     cou++;                         // 软计数器加1   
  280.     if(cou >= 20){                 // 计数值到100(1s)   
  281.       cou = 0;                     // 软计数器清零   
  282.       TIME_SS++;                   // 秒计数器加1(进位50ms*20=1s)   
  283.       r=~r;                                               // 秒点闪烁
  284.         if(TIME_SS >= 60){         // 秒计数值到60   
  285.           TIME_SS = 0;             // 秒计数器清零   
  286.           TIME_MM++;               // 分计数器加1(进位60s=1m)  
  287.             if(TIME_MM >= 60){     // 分计数到60   
  288.               TIME_MM = 0;         // 分计数器清零   
  289.               TIME_HH++;           // 时计数器加1(进位60m=1h)   
  290.                 if(TIME_HH >= 24){ // 时计数到23   
  291.                   TIME_HH = 0;     // 时计数器清零
  292.                                         }  
  293.             }   
  294.         }  
  295.         }
  296.         TH0 = 0x3C;                //设置定时初值      
  297.         TL0 = 0xB0;                //设置定时初值
  298. }
  299. /**********************************************************************************************/        
复制代码



评分

参与人数 1黑币 +5 收起 理由
Sky丶蓝天 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:480510 发表于 2020-5-4 09:49 | 显示全部楼层
想看正面
回复

使用道具 举报

ID:241769 发表于 2020-5-4 12:43 来自手机 | 显示全部楼层
怎么搞的那么麻烦。。。
回复

使用道具 举报

ID:729886 发表于 2020-5-4 14:03 | 显示全部楼层
正面的亮相看看
回复

使用道具 举报

ID:720981 发表于 2020-5-4 17:23 | 显示全部楼层
应该发一下正面照片,看一下器件
回复

使用道具 举报

ID:639106 发表于 2020-5-5 09:03 来自手机 | 显示全部楼层
忘拍了
IMG_20200503_110124.jpg
1588640551807..jpg
回复

使用道具 举报

ID:767459 发表于 2020-9-11 13:12 | 显示全部楼层
谢谢楼主的分享,下载来学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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