找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1682|回复: 9
收起左侧

我想问一下怎么添加 代码让我现在的这个程序可以电子时钟和日历自动切换间隔五秒

[复制链接]
ID:942830 发表于 2021-6-22 22:57 | 显示全部楼层 |阅读模式

电路仿真图

电路仿真图

  1. #include<reg52.h>                    //52单片机头文件
  2. #include"intrins.h"                    //循环移位函数头文件
  3. #define uint unsigned int  // 宏定义
  4. #define uchar unsigned char
  5. #define NOT_Break  25      //任意赋值避开条件
  6. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF,0xff}; //共阳极数码管编码0-9和“—”
  7. uchar val[8]={2,3,10,5,9,10,5,5};  
  8. uchar flag=0;
  9. sbit key0 = P2^0;                   //清零
  10. sbit key1 = P2^1;                   //时间---年月日转换
  11.                                                  //
  12. sbit BEEP = P3^5;                   //蜂鸣器


  13. void delay(uint z)         //1毫秒
  14. {
  15.         uint x,y;
  16.     for(x=z;x>0;x--)
  17.       for(y=110;y>0;y--);   
  18. }

  19. void time0init()           //  定时器0初始化函数
  20. {
  21.         TMOD=0x01;                                        //设置定时器0为工作方式1(M1M0为01)
  22.         TH0=(65536-2000)/256;                //装初值12M晶振定时2ms数为2000
  23.         TL0=(65536-2000)%256;
  24.         EA=1;                                                //开总中断
  25.         ET0=1;                                                //开定时器0中断
  26.         TR0=1;                                                //启动定时器0
  27. }

  28. uint num=0,keytime=0,time;
  29.         uchar wei=0X01,duan=0;        //时间更新  1s,20ms扫描一次按键, 控制修改项闪烁
  30. void time0() interrupt 1
  31. {

  32.         TH0=(65536-2000)/256;                //装初值12M晶振定时2ms数为2000
  33.         TL0=(65536-2000)%256;
  34.         keytime++;                                        //20ms扫描一次按键
  35.         time++;                                                //控制修改项闪烁
  36.         num++;                                        //时间更新  1s
  37.      P1=wei;                        // 选择要点亮的数码管是哪一个
  38.         P0=table[val[duan]];   // 给改数码管送显示数据
  39.     wei=_crol_(wei,1);     // 移位,为点亮下一个数码管做准备
  40.         duan++;                                 
  41.         if(duan>7)        duan=0;         

  42. }  


  43. uchar key()
  44. {                           
  45.   static  uchar kzt=0;         //推动循环,每次执行一次case
  46.   uchar sb=NOT_Break;         //任意赋值避开条件
  47.   switch(kzt)                         //按顺序依次执行
  48.   {
  49. //------------case 0:------------//
  50.          case 0:                         //第一步
  51.          P3=0xff;                         //P3做读入状态时,应该要先写1的,才能正确读入数据         
  52.                          //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平
  53.          if(P3!=0xff)                 //如果有按键按下
  54.          {
  55.                  kzt=1;                         //向下执行第二步
  56.                  return NOT_Break;                 //返回一个无关的值,用来跳出此次循环        
  57.                 }
  58.          break;                                 //如果没有按键按下,直接跳出
  59. //------------case 1:------------//
  60.         case 1:                                 //第二步
  61.         P3=0xff;                         //P3做读入状态时,应该要先写1的,才能正确读入数据         
  62.                          //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平
  63.         if(P3!=0xff)                 //有按键按下
  64.         {
  65.                 switch(P3)
  66.                 {
  67.                  case 0xfe:                 //第一个按键按下
  68.                  sb=0;
  69.                  break;                         //直接跳出
  70.                  case 0xfd:                 //第二个按键按下
  71.                  sb=1;
  72.                  break;                         //直接跳出
  73.                  case 0xfb:                 //第三个按键按下
  74.                  sb=2;
  75.                  break;                          //直接跳出         
  76.                  case 0xf7:             //第四个按键按下
  77.                  sb=3;
  78.                  break;                         //直接跳出                                                                                                                                                   
  79.                 }
  80.         kzt=2;                                 //如果无按键按下  向下执行第三步
  81.         return sb;                         //返回sb的值
  82.          }
  83.          else                                 //如果无按键按下  回到第一步
  84.          {
  85.           kzt=0;
  86.           return NOT_Break;         //返回一个无关的值,用来跳出此次循环        
  87.           }
  88.         break;
  89. //------------case 2:------------//
  90.         case 2:                                 //第三步
  91.         P3=0xff;                         //P3做读入状态时,应该要先写1的,才能正确读入数据         
  92.                          //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平
  93.         if(P3==0xff)                 //如果没有按键按下
  94.         {
  95.          kzt=0;                                 //如果无按键按下  回到第一步
  96.          return NOT_Break;
  97.          }                        
  98.          break;                                 //如果有按键按下  直接跳出
  99.                 }                        
  100.         return NOT_Break;        
  101. }

  102. void main()
  103. {  
  104.    char shi=23,fen=59,miao=55,qh=0;          //初始化时分秒   状态标志位(0:正常,1:改变秒钟,2:改变分钟,3:改变时钟)
  105.    char year=21,month=06,day=22;
  106.    char flag=0;                                                  //标志位---年月日&&时分秒
  107.    char keycode=NOT_Break;                          //键值
  108.    P0=0xff;
  109.    P1=0xff;
  110.    P2=0xff;
  111.    P3=0xff;
  112.    delay(10);                                                  //保证上面三条指令顺利完成
  113.    time0init();                                                  //定时器0初始化函数
  114.    while(1)        
  115.         {         
  116.             if(key0==0)                                      //清零按键按下
  117.                 {
  118.                   shi=0;fen=0;miao=0;                  //时分秒清零
  119.                   qh=0;                                                  //开始显示
  120.                   }
  121.             if(key1==0)                                      //年月日&&时分秒按键按下
  122.                 {
  123.                   while(!key1);                                  //等待放开按键
  124.                   if(flag==0) {flag=1;}                  //年月日&&时分秒
  125.                   else  flag=0;  
  126.                   qh=0;                                                  //开始显示
  127.                   }        
  128.         
  129.             if(keytime>9)                                  //2ms*10=20ms
  130.                 {
  131.                   keytime=0;                                  //计数清零
  132.                   keycode=key();                           //检测是否有按键按下                 
  133.                 }
  134. //////////////////////////////---时间更新---//////////////////////////////               
  135.                  if((num>=500)&&(qh==0))         //时间更新         2ms*500=1s
  136.                  {
  137.                  
  138.                         num=0;                                         //计数清零
  139.                         miao++;                                         //秒数加1
  140.                         if(miao>59)                                 //如果miao等于60
  141.                         {
  142.                                 miao=0;                                 //miao赋值为0
  143.                                 fen++;                                 //分钟加1
  144.                                 if(fen>59)                         //如果fen等于60
  145.                                 {
  146.                                         fen=0;                         //fen赋值为0
  147.                                         shi++;                         //小时加1
  148.                                         if(shi>23) shi=0;//如果shi等于24  shi赋值为0
  149.                                 }
  150.                         }
  151.                  }
  152.                  
  153.                  
  154. ///////////////////////////////////////////////////////////////////////////               

  155. //////////////////////////////---按键检测---///////////////////////////////

  156. ///////////////////////////---第一个按键按下---///////////////////////////////
  157. if(flag==0)
  158. {
  159.           if(keycode==0)                 //第一个按键按下        选择
  160.           {
  161.                 qh++;                                 //状态标志位(0:正常,1:改变秒钟,2:改变分钟,3:改变时钟)
  162.                 if(qh>3) qh=1;             //如果qh等于4,qh赋值为1                 
  163.                 keycode=NOT_Break;         //任意赋值避开条件
  164.                 }
  165. ///////////////////////////---第二个按键按下---///////////////////////////////
  166.           if(keycode==1)                  //第二个按键按下          加
  167.        {
  168.                 if(qh==1)
  169.         {
  170.                    miao++;                                         
  171.            if(miao>59) {miao=0;fen++;}//如果miao等于60 miao赋值为0
  172.                                  
  173.                     }
  174.         if(qh==2)
  175.         {
  176.                fen++;                                
  177.           if(fen>59) {fen=0;shi++;}   //如果fen等于60 fen赋值为0
  178.                           
  179.             }
  180.        if(qh==3)
  181.         {
  182.              shi++;                                       
  183.          if(shi>23){shi=0;day++;}          //如果shi等于24 shi赋值为0                          
  184.               }
  185.            keycode=NOT_Break;          //任意赋值避开条件
  186.           }
  187. ///////////////////////////---第三个按键按下---///////////////////////////////
  188.         if(keycode==2)                           //第三个按键按下          减
  189.        {
  190.                 if(qh==1)
  191.         {
  192.                    miao--;                                         
  193.            if(miao<0)  {miao=59;fen--;}//如果miao等于-1 miao赋值为59                          
  194.                     }
  195.         if(qh==2)
  196.         {
  197.               fen--;                                
  198.           if(fen<0) {fen=59;shi--;}          //如果fen等于-1 fen赋值为59                 
  199.             }
  200.        if(qh==3)
  201.         {
  202.               shi--;                                       
  203.          if(shi<0) {shi=23;day--;}          //如果shi等于-1 shi赋值为23                          
  204.               }
  205.            keycode=NOT_Break;          //任意赋值避开条件
  206.           }        
  207. ///////////////////////////---第四个按键按下---///////////////////////////////         
  208.            if(keycode==3)                  //第四个按键按下           确定
  209.            {
  210.                  qh=0;                 
  211.                  keycode=NOT_Break;          //任意赋值避开条件
  212.                 }
  213.                 }
  214.         else if(flag==1)
  215.         {
  216.             if(keycode==0)                 //第一个按键按下        选择
  217.           {
  218.                 qh++;                                 //状态标志位(0:正常,1:改变秒钟,2:改变分钟,3:改变时钟)
  219.                 if(qh>3) qh=1;             //如果qh等于4,qh赋值为1                 
  220.                 keycode=NOT_Break;         //任意赋值避开条件
  221.                 }
  222. ///---第二个按键按下:调加---///
  223.           if(keycode==1)                  
  224.        {
  225.                 if(qh==1)
  226.         {
  227.                    day++;
  228.                    if(day==29&&month==2&&(year%4!=0)){ day=1;month++;} //不是闰年
  229.                     if(day==30&&month==2&&year%100==0&&year%400!=0){day=1;month++;}         
  230.                     if(day==30&&month==2&&((year%100==0&&year%400==0)||(year%100!=0&&year%4==0))){day=1;month++;}
  231.                           if(day==31&&(month==4||month==6||month==9||month==11))   { day=1;month++;}               
  232.                     if(day==33&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)){ day=1;  month++;}
  233.         
  234.                    }                  
  235.                     
  236.         if(qh==2)
  237.         {
  238.                month++;                                
  239.           if(month>12) {month=1;year++;}  //如果月等于13 分赋值为1                 
  240.             }
  241.        if(qh==3)
  242.         {
  243.              year++;                                       
  244.          if(year>99) year=1;          //如果年等于100 时赋值为1                          
  245.               }
  246.            keycode=NOT_Break;          //任意赋值避开条件
  247.           }
  248. ///---第三个按键按下:调减---///
  249.         if(keycode==2)                                    
  250.        {
  251.                 if(qh==1)
  252.         {
  253.                    day--;
  254.                                                            
  255.            if(day==0&&month==3&&(year%4!=0))
  256.                    {day=28;        month--;}
  257.                    if(day==0&&month==3&&year%100==0&&year%400!=0)
  258.                   {day=28;        month--;}
  259.                    if(day==0&&month==3&&((year%100==0&&year%400==0)||(year%100!=0&&year%4==0)))
  260.                     {day=29;        month--;}
  261.                          if(day==0&&(month==4||month==6||month==9||month==11))
  262.                    {day=30;        month--;}
  263.                    if(day==0&&(month==1||month==2||month==5||month==7||month==8||month==10||month==12))
  264.                   {day=31;        month--;}
  265.                                             
  266.                     }
  267.         if(qh==2)
  268.         {
  269.               month--;                                
  270.           if(month<1) {month=12;year--;}          //如果月等于0 分赋值为12                 
  271.             }
  272.        if(qh==3)
  273.         {
  274.               year--;                                       
  275.          if(year<1) year=99;          //如果年等于0 时赋值为12                          
  276.               }
  277.            keycode=NOT_Break;          //任意赋值避开条件
  278.           }        
  279. ///---第四个按键按下---///         
  280.            if(keycode==3)                  //第四个按键按下           确定
  281.            {
  282.                  qh=0;                 
  283.                  keycode=NOT_Break;          //任意赋值避开条件
  284.                 }
  285.          }
  286.                   
  287. ///////////////////////////////////////////////////////////////////////////
  288.                
  289. ///////////////////////////---显示函数---///////////////////////////////   
  290.          switch(qh)                            //按键按下后立即显示
  291.          {        
  292.          //正常显示                 
  293.                         case 0:        
  294.                 if(flag==1)                 
  295.                 {                  
  296.                 val[0]=2;                 //年份21开头定死
  297.                 val[1]=0;
  298.                 val[2]=year/10;         //年份十位显示
  299.                 val[3]=year%10;  //年份个位显示
  300.                 val[4]=month/10; //月份十位显示
  301.                 val[5]=month%10; //月份个位显示
  302.                 val[6]=day/10;   //天数十位显示
  303.                 val[7]=day%10;   //天数个位显示
  304.                  }
  305.         /**********显示时分秒***********/
  306.                  else if(flag==0)
  307.                  {
  308.                 val[0]=shi/10;         //显示时间 时分秒
  309.                 val[1]=shi%10;
  310.                 val[2]=10;
  311.                 val[3]=fen/10;
  312.                 val[4]=fen%10;
  313.         /**********整点报时,蜂鸣器响 **********/
  314.                 if(fen==0)
  315.                  {
  316.                  BEEP=0;
  317.                  delay(200);
  318.                  BEEP=1;
  319.                  }
  320.                  val[5]=10;
  321.                  val[6]=miao/10;
  322.                  val[7]=miao%10;
  323.                 }
  324.          //秒钟修改后显示  其中秒钟部分在闪烁
  325.                 case 1:
  326.                 if(flag==0)
  327.                 {
  328.                 if(time<250)             //2ms*250=0.5s
  329.                 {                        
  330.             val[0]=shi/10;
  331.                 val[1]=shi%10;
  332.                 val[3]=fen/10;
  333.                 val[4]=fen%10;               
  334.                 val[6]=miao/10;
  335.                 val[7]=miao%10;                                   
  336.                  }
  337.                 else if(time<500)         //2ms*500=1s               
  338.                 {
  339.                      val[0]=shi/10;
  340.                         val[1]=shi%10;
  341.                         val[3]=fen/10;
  342.                         val[4]=fen%10;               
  343.                         val[6]=11;
  344.                         val[7]=11;                        
  345.                  }
  346.                 else if(time>500)         //2ms*500=1s
  347.                 {
  348.                         time=0;
  349.                  }                                                                        
  350.                    }
  351.                    else if(flag==1)
  352.                    {
  353.                              if(time<250)             //2ms*250=0.5s
  354.                 {                        
  355.             val[2]=year/10;
  356.                 val[3]=year%10;
  357.                 val[4]=month/10;
  358.                 val[5]=month%10;               
  359.                 val[6]=day/10;
  360.                 val[7]=day%10;                                   
  361.                  }
  362.                 else if(time<500)         //2ms*500=1s               
  363.                 {
  364.                      val[2]=year/10;
  365.                         val[3]=year%10;
  366.                         val[4]=month/10;
  367.                         val[5]=month%10;               
  368.                         val[6]=11;
  369.                         val[7]=11;                        
  370.                  }
  371.                 else if(time>500)         //2ms*500=1s
  372.                 {
  373.                         time=0;
  374.                  }                        
  375.                    }
  376.                
  377.                 case 2:
  378.                 if(flag==0)
  379.                 {
  380.                 if(time<250)
  381.                  {
  382.             val[0]=shi/10;
  383.                 val[1]=shi%10;
  384.                 val[3]=fen/10;
  385.                 val[4]=fen%10;               
  386.                 val[6]=miao/10;
  387.                 val[7]=miao%10;                        
  388.                  }
  389.                 else if(time<500)
  390.                  {
  391.             val[0]=shi/10;
  392.                 val[1]=shi%10;
  393.                 val[3]=11;
  394.                 val[4]=11;               
  395.                 val[6]=miao/10;
  396.                 val[7]=miao%10;                                            
  397.                  }
  398.                 else if(time>500)
  399.                  {
  400.                         time=0;
  401.                  }
  402.         }
  403.         else if(flag==1)
  404.         {               
  405.                 if(time<250)             //2ms*250=0.5s
  406.                 {                        
  407.             val[2]=year/10;                 //年的十位部分
  408.                 val[3]=year%10;             //年的个位部分
  409.                 val[4]=month/10;             //月的十位部分
  410.                 val[5]=month%10;                 //月的个位部分
  411.                 val[6]=day/10;             //天的十位部分
  412.                 val[7]=day%10;                 //天的个位部分
  413.                  }
  414.                 else if(time<500)         //2ms*500=1s        /数在闪烁        
  415.                 {
  416.                      val[2]=year/10;
  417.                         val[3]=year%10;        
  418.                         val[4]=11;
  419.                         val[5]=11;
  420.                         val[6]=day/10;
  421.                         val[7]=day%10;               
  422.                  }
  423.                  else if(time>500)         //2ms*500=1s
  424.                 {
  425.                         time=0;
  426.                  }
  427.                  }//if(flag==1)的else的括号

  428.          //时钟修改后显示  其中时钟部分在闪烁
  429.                  case 3:
  430.                  if(flag==0)
  431.                  {
  432.                  if(time<250)
  433.                         {
  434.                 val[0]=shi/10;
  435.                 val[1]=shi%10;
  436.                 val[3]=fen/10;
  437.                 val[4]=fen%10;               
  438.                 val[6]=miao/10;
  439.                 val[7]=miao%10;                                
  440.                         }
  441.                 else if(time<500)
  442.                  {
  443.                 val[0]=11;
  444.                 val[1]=11;
  445.                 val[3]=fen/10;
  446.                 val[4]=fen%10;               
  447.                 val[6]=miao/10;
  448.                 val[7]=miao%10;                                          
  449.                  }
  450.                 else if(time>500)
  451.                  {
  452.                  time=0;
  453.                  }
  454.                  }
  455.         else if(flag==1)
  456.         {               
  457.                 if(time<250)             //2ms*250=0.5s
  458.                 {                        
  459.             val[2]=year/10;                 //年的十位部分
  460.                 val[3]=year%10;             //年的个位部分
  461.                 val[4]=month/10;             //月的十位部分
  462.                 val[5]=month%10;                 //月的个位部分
  463.                 val[6]=day/10;             //天的十位部分
  464.                 val[7]=day%10;                 //天的个位部分
  465.                  }
  466.                 else if(time<500)         //2ms*500=1s        /天数在闪烁        
  467.                 {
  468.                      val[2]=11;
  469.                         val[3]=11;        
  470.                         val[4]=month/10;
  471.                         val[5]=month%10;
  472.                         val[6]=day/10;
  473.                         val[7]=day%10;               
  474.                  }
  475.                  else if(time>500)         //2ms*500=1s
  476.                 {
  477.                         time=0;
  478.                  }
  479.                  break;
  480.                  }
  481.                 }
  482.                  }
  483.          }
复制代码
回复

使用道具 举报

ID:584814 发表于 2021-6-23 08:56 | 显示全部楼层
只添加新代码,不修改旧代码,没可能实现。
你可以先将流程图修改一下,然后照着改动的部分修改代码就可以。
如果这个本就某一个宝来的,可以直接找售后。
PS:主函数要精练才更容易读,相关各部分可以写成相应功能的函数进行调用。
回复

使用道具 举报

ID:123289 发表于 2021-6-23 10:32 | 显示全部楼层
以为“代码”能搞定一切,本身说是个误区!
如同,想画一根竹子,胸中有竹才行。
你要构思一下:
1、如何显示日历;把它做成一个函数A。
2、如何显示时间;把它做成一个函数B。
3、如何搞定一个5秒的定时,每次定时到来时将F求反一下。F=1就调A,F=0就调B。
这样做你认为行不行。
至于如此添加到你的程序中,也很容易:
1、将上述功能程序添加到你原来程序的任意位置都可以。
2、记住:删除你原来的程序。
回复

使用道具 举报

ID:332444 发表于 2021-6-23 13:32 | 显示全部楼层
录像43_转.gif
无标题.png
回复

使用道具 举报

ID:824490 发表于 2021-6-23 14:02 | 显示全部楼层
while(1)//大循环
{
。。
if (miao%10<5) LED_display_clock();//前5秒显示时钟
else LED_display_date();//后5秒显示日期
。。
}

就这么简单。自己去磊代码去。。
回复

使用道具 举报

ID:332444 发表于 2021-6-23 17:14 | 显示全部楼层
4个按键:启停,选择(1年2月3天4时5分6秒7归零调节)
回复

使用道具 举报

ID:941485 发表于 2021-6-23 18:28 | 显示全部楼层
在二者之间加个延迟代码
回复

使用道具 举报

ID:332444 发表于 2021-6-24 09:15 | 显示全部楼层
4个按键:
1切换与确定
2调节功能选择1年2月3天4时5分6秒7归零8恢复
3数值+
4数值-
1.gif
回复

使用道具 举报

ID:332444 发表于 2021-6-24 09:16 | 显示全部楼层
整个程序也就144行左右,看起来多清爽.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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