找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝桥杯单片机组 第八届省赛-基于单片机的电子钟程序设计

[复制链接]
跳转到指定楼层
楼主
ID:384168 发表于 2019-3-25 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
没有使用DS1302模块,用定时器完全实现了题目要求,发出来让没有思路的同学们参考一下。本人水平有限,如果有不足之处多多指正。

单片机源程序如下:
  1. #include "intrins.h"
  2. #include "STC15F2K60S2.h"
  3. #include "key.h"
  4. #include "onewire.h"

  5. sbit S7 = P3^0;
  6. sbit S6 = P3^1;
  7. sbit S5 = P3^2;
  8. sbit S4 = P3^3;

  9. unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf};
  10. unsigned char distime = 0;
  11. unsigned char num0[] = {0,0,17,0,0,17,0,0};                //显示时钟
  12. unsigned char num1[] = {0,0,17,0,0,17,0,0};                //显示闹钟设置时间
  13. unsigned char num2[] = {16,16,16,16,16,0,0,12};                //显示温度
  14. int shizhong = 0;                                                                                                //用于时钟的正确运行



  15. unsigned char time_shi = 0 , time_fen = 0 , time_miao = 0;                //时钟参数
  16. unsigned char time_set_mode = 0;                                                        //时钟设置模式,0为不设置,1为设置时,2为设置分,3为设置秒


  17. unsigned char alarm_shi = 0 , alarm_fen = 0 , alarm_miao = 0;                //闹钟参数
  18. unsigned char alarm_set_mode = 0;                                                        //闹钟设置模式,对应同上

  19. int alarm_count = 0 ;
  20. bit alarm_start = 0 , alarm_enough = 0;

  21. unsigned char temper = 0;


  22. unsigned char DS_mode = 0;                                                                                //数码管显示模式,0为时钟,1为闹钟,2为温度

  23. bit flash_start = 0 ;

  24. bit flash0 = 1 , flash1 = 1;


  25. bit LED_mode = 0;
  26. unsigned int LED_count = 0;
  27. void LED_flash()
  28. {
  29.         if(LED_mode)
  30.         {
  31.                 P2 = (P2 & 0x1f) | 0x80;
  32.                 P0 = 0xfe;
  33.                 P2 &= 0x1f;
  34.                 P0 = 0xff;
  35.         }
  36.         else
  37.         {
  38.                 P2 = (P2 & 0x1f) | 0x80;
  39.                 P0 = 0xff;
  40.                 P2 &= 0x1f;
  41.                 P0 = 0xff;
  42.         }
  43.        
  44.         if(++LED_count==1000)
  45.                 LED_mode = ~(LED_mode);
  46. }


  47. void display()
  48. {
  49.         P2 |= 0xc0;
  50.         P0 = 1<<distime;
  51.         P2 &= ~(0xc0);
  52.         P0 = 0xff;
  53.        
  54.         switch(DS_mode)
  55.         {
  56.                 case 0:
  57.                                                 if(flash0)
  58.                                                 {
  59.                                                         P2 |= 0xe0;
  60.                                                         P0 = table[num0[distime]];
  61.                                                         P2 &= ~(0xe0);
  62.                                                         P0 = 0x00;
  63.                                                 }
  64.                                                 else
  65.                                                 {
  66.                                                         if((distime==(3*(time_set_mode-1)))||(distime==(3*(time_set_mode-1)+1)))
  67.                                                         {
  68.                                                                 P2 |= 0xe0;
  69.                                                                 P0 = 0xff;
  70.                                                                 P2 &= ~(0xe0);
  71.                                                                 P0 = 0x00;
  72.                                                         }
  73.                                                         else
  74.                                                         {
  75.                                                                 P2 |= 0xe0;
  76.                                                                 P0 = table[num0[distime]];
  77.                                                                 P2 &= ~(0xe0);
  78.                                                                 P0 = 0x00;
  79.                                                         }
  80.                                                 }
  81.                                                 break;
  82.                 case 1:
  83.                                                 if(flash1)
  84.                                                 {
  85.                                                         P2 |= 0xe0;
  86.                                                         P0 = table[num1[distime]];
  87.                                                         P2 &= ~(0xe0);
  88.                                                         P0 = 0x00;
  89.                                                 }
  90.                                                 else
  91.                                                 {
  92.                                                         if((distime==(3*(alarm_set_mode-1)))||(distime==(3*(alarm_set_mode-1)+1)))
  93.                                                         {
  94.                                                                 P2 |= 0xe0;
  95.                                                                 P0 = 0xff;
  96.                                                                 P2 &= ~(0xe0);
  97.                                                                 P0 = 0x00;
  98.                                                         }
  99.                                                         else
  100.                                                         {
  101.                                                                 P2 |= 0xe0;
  102.                                                                 P0 = table[num1[distime]];
  103.                                                                 P2 &= ~(0xe0);
  104.                                                                 P0 = 0x00;
  105.                                                         }
  106.                                                 }
  107.                                                 break;
  108.                 case 2:
  109.                                                 P2 |= 0xe0;
  110.                                                 P0 = table[num2[distime]];
  111.                                                 P2 &= ~(0xe0);
  112.                                                 P0 = 0x00;
  113.                                                 break;
  114.         }
  115.        
  116.         if(++distime==8)        distime = 0;
  117. }

  118.        
  119. void Timer0Init()        //2ms
  120. {
  121.         AUXR |= 0x80;                //?????1T??
  122.         TMOD &= 0xF0;                //???????
  123.         TL0 = 0x40;                //??????
  124.         TH0 = 0xA2;                //??????
  125.         TF0 = 0;                //??TF0??
  126.         TR0 = 1;                //???0????
  127.        
  128.         EA = 1;
  129.         ET0 = 1;
  130. }


  131. void timer0() interrupt 1
  132. {
  133.        
  134.        

  135. //====================================================================================       

  136.         if(alarm_start)                                                                                //L1闪烁(闹钟)控制
  137.         {
  138.                 if(++alarm_count==2500)                        //5s
  139.                 {
  140.                         alarm_count = 0;
  141.                         alarm_start = 0;
  142.                         alarm_enough = 1;
  143.                 }
  144.         }
  145.        
  146.        
  147. //====================================================================================       

  148.         if(++shizhong==500)                                                        //时钟正常计时控制,1s
  149.         {
  150.                 if(time_miao==59)
  151.                 {
  152.                         time_miao = 0;
  153.                         if(time_fen==59)
  154.                         {
  155.                                 time_fen = 0;
  156.                                 if(time_shi==23)
  157.                                 {
  158.                                         time_shi = 0;
  159.                                 }
  160.                                 else
  161.                                         time_shi++;
  162.                         }
  163.                         else
  164.                                 time_fen++;
  165.                 }
  166.                 else
  167.                         time_miao++;

  168.                 shizhong = 0;
  169.                
  170.                
  171.                
  172.                 if(flash_start)
  173.                 {
  174.                         if(DS_mode==0)
  175.                                 flash0 = ~(flash0);
  176.                         else
  177.                                 flash0 = 1;
  178.                        
  179.                        
  180.                         if(DS_mode==1)
  181.                                 flash1 = ~(flash1);
  182.                         else
  183.                                 flash1 = 1;
  184.                        
  185.                 }
  186.                
  187.                
  188.         }


  189. //====================================================================================       

  190.         display();
  191. }




  192. void main()
  193. {
  194.         P2 = (P2 & 0x1f) | 0xa0;
  195.         P0 = 0;
  196.         P2 &= 0x1f;
  197.         P0 = 0xff;
  198.        
  199.         P2 = (P2 & 0x1f) | 0x80;
  200.         P0 = 0xff;
  201.         P2 &= 0x1f;
  202.         P0 = 0x00;
  203.        
  204.         time_shi = 23;
  205.         time_fen = 59;
  206.         time_miao = 50;
  207.        
  208.         alarm_shi = 0;
  209.         alarm_fen = 0;
  210.         alarm_miao = 0;
  211.        
  212.         Timer0Init();
  213.        
  214. //////////////////////初始化


  215. //=========================================================================================
  216.         while(1)
  217.         {

  218.                 num0[0] = time_shi/10;
  219.                 num0[1] = time_shi%10;
  220.                 num0[3] = time_fen/10;
  221.                 num0[4] = time_fen%10;
  222.                 num0[6] = time_miao/10;
  223.                 num0[7] = time_miao%10;
  224.                
  225.                 num1[0] = alarm_shi/10;
  226.                 num1[1] = alarm_shi%10;
  227.                 num1[3] = alarm_fen/10;
  228.                 num1[4] = alarm_fen%10;
  229.                 num1[6] = alarm_miao/10;
  230.                 num1[7] = alarm_miao%10;
  231.        

  232.        
  233. //=========================================================================================
  234.                 if(S7==0)                                                                                                                        //时钟设定
  235.                 {
  236.                         Delay10ms();
  237.                         if(S7==0)
  238.                         {
  239.                                 DS_mode = 0;

  240.                                 alarm_set_mode = 0;
  241.                                 switch(time_set_mode)
  242.                                 {
  243.                                         case 0:
  244.                                                                         time_set_mode = 1;
  245.                                                                         break;
  246.                                         case 1:
  247.                                                                         time_set_mode = 2;
  248.                                                                         break;
  249.                                         case 2:
  250.                                                                         time_set_mode = 3;
  251.                                                                         break;
  252.                                         case 3:
  253.                                                                         time_set_mode = 0;
  254.                                                                         break;
  255.                                         default:
  256.                                                                         break;
  257.                                 }
  258.                                
  259.                                 while(S7==0);
  260.                         }
  261.                 }
  262.        
  263. //=========================================================================================
  264.        
  265.                 if(S6==0)                                                                                                        //闹钟设定
  266.                 {
  267.                         Delay10ms();
  268.                         if(S6==0)
  269.                         {
  270.                                 DS_mode = 1;

  271.                                 time_set_mode = 0;
  272.                                 switch(alarm_set_mode)
  273.                                 {
  274.                                         case 0:
  275.                                                                         alarm_set_mode = 1;
  276.                                                                         break;
  277.                                         case 1:
  278.                                                                         alarm_set_mode = 2;
  279.                                                                         break;
  280.                                         case 2:
  281.                                                                         alarm_set_mode = 3;
  282.                                                                         break;
  283.                                         case 3:
  284.                                                                         alarm_set_mode = 0;
  285.                                                                         DS_mode = 0;
  286.                                                                         break;
  287.                                         default:
  288.                                                                         break;
  289.                                 }
  290.                                
  291.                                 while(S6==0);
  292.                         }
  293.                 }
  294.        
  295. //=========================================================================================

  296.                 if(S5==0)                                                                                                                                                                //加
  297.                 {
  298.                         Delay10ms();
  299.                         if(S5==0)
  300.                         {
  301.                                 if(time_set_mode!=0&&alarm_set_mode==0)
  302.                                 {
  303.                                         switch(time_set_mode)
  304.                                         {
  305.                                                 case 1:
  306.                                                                                 if(time_shi==23)
  307.                                                                                         time_shi = 0;
  308.                                                                                 else
  309.                                                                                         time_shi++;
  310.                                                                                 break;
  311.                                                 case 2:
  312.                                                                                 if(time_fen==59)
  313.                                                                                         time_fen = 0;
  314.                                                                                 else
  315.                                                                                         time_fen++;
  316.                                                                                 break;
  317.                                                 case 3:
  318.                                                                                 if(time_miao==59)
  319.                                                                                         time_miao = 0;
  320.                                                                                 else
  321.                                                                                         time_miao++;
  322.                                                                                 break;
  323.                                                 default:
  324.                                                                                 break;
  325.                                         }
  326.                                 }
  327.                                
  328.                                 if(time_set_mode==0&&alarm_set_mode!=0)
  329.                                 {
  330.                                         switch(alarm_set_mode)
  331.                                         {
  332.                                                 case 1:
  333.                                                                                 if(alarm_shi==23)
  334.                                                                                         alarm_shi = 0;
  335.                                                                                 else
  336.                                                                                         alarm_shi++;
  337.                                                                                 break;
  338.                                                 case 2:
  339.                                                                                 if(alarm_fen==59)
  340.                                                                                         alarm_fen = 0;
  341.                                                                                 else
  342.                                                                                         alarm_fen++;
  343.                                                                                 break;
  344.                                                 case 3:
  345.                                                                                 if(alarm_miao==59)
  346.                                                                                         alarm_miao = 0;
  347.                                                                                 else
  348.                                                                                         alarm_miao++;
  349.                                                                                 break;
  350.                                                 default:
  351.                                                                                 break;
  352.                                         }
  353.                                 }

  354.                                 while(S5==0);
  355.                         }
  356.                 }

  357.        
  358. //=========================================================================================

  359.                 if(S4==0)                                                                                                                                                                        //减;显示温度
  360.                 {
  361.                         Delay10ms();
  362.                         if(S4==0)
  363.                         {
  364.                                 if(time_set_mode!=0&&alarm_set_mode==0)
  365.                                 {
  366.                                         switch(time_set_mode)
  367.                                         {
  368.                                                 case 1:
  369.                                                                                 if(time_shi==0)
  370.                                                                                         time_shi = 23;
  371.                                                                                 else
  372.                                                                                         time_shi--;
  373.                                                                                 break;
  374.                                                 case 2:
  375.                                                                                 if(time_fen==0)
  376.                                                                                         time_fen = 59;
  377.                                                                                 else
  378.                                                                                         time_fen--;
  379.                                                                                 break;
  380.                                                 case 3:
  381.                                                                                 if(time_miao==0)
  382.                                                                                         time_miao = 59;
  383.                                                                                 else
  384.                                                                                         time_miao--;
  385.                                                                                 break;
  386.                                                 default:
  387.                                                                                 break;
  388.                                         }
  389.                                 }
  390.                                
  391.                                 if(time_set_mode==0&&alarm_set_mode!=0)
  392.                                 {
  393.                                         switch(alarm_set_mode)
  394.                                         {
  395.                                                 case 1:
  396.                                                                                 if(alarm_shi==0)
  397.                                                                                         alarm_shi = 23;
  398.                                                                                 else
  399.                                                                                         alarm_shi--;
  400.                                                                                 break;
  401.                                                 case 2:
  402.                                                                                 if(alarm_fen==0)
  403.                                                                                         alarm_fen = 59;
  404.                                                                                 else
  405.                                                                                         alarm_fen--;
  406.                                                                                 break;
  407.                                                 case 3:
  408.                                                                                 if(alarm_miao==0)
  409.                                                                                         alarm_miao = 59;
  410.                                                                                 else
  411.                                                                                         alarm_miao--;
  412.                                                                                 break;
  413.                                                 default:
  414.                                                                                 break;
  415.                                         }
  416.                                 }
  417.                                
  418.                                 if(time_set_mode==0&&alarm_set_mode==0)
  419.                                 {
  420.                                         temper = temper_read();
  421.                                         num2[5] = temper/10;
  422.                                         num2[6] = temper%10;
  423.                                        
  424.                                         DS_mode = 2;
  425.                                 }
  426.                                
  427.                                 while(S4==0);
  428.                                
  429.                                 DS_mode = 0;
  430.                         }
  431. ……………………

  432. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子钟(自)2018.zip (53.58 KB, 下载次数: 30)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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