找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1501|回复: 3
收起左侧

求大神指点迷津,单片机万年历时在时钟与年月日转化出问题了

[复制链接]
ID:825447 发表于 2020-10-3 19:48 | 显示全部楼层 |阅读模式
     我在做万年历时在时钟与年月日转化出问题了;;
     我基本想法是令key2控制由时钟转化为年月日;然后年月日用for语句执行100次后重新返回时钟程序,理想状态下应该是时钟一直在执行,中断返回后时钟继续走,但现在出现的问题是转化为年月日返回后有时可以时钟正常运行,有时需停顿几秒才能继续运行。   
    求大神指点!!!
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  5.                                                                                 0x66,0x6d,0x7d,0x07,
  6.                                                                                 0x7f,0x6f};
  7. void delay(uint);
  8. sbit key1=P2^7;
  9. sbit key2=P2^6;
  10. sbit key5=P2^3;
  11. sbit key4=P2^4;
  12. uchar num=0,shi=0,fen=0,miao=0,nian=20,yue=10,ri=3;
  13. void wmiao()
  14. {
  15.         P0=0x7f;
  16.         P1=table[miao%10];        //个位
  17.         delay(1);
  18.         P0=0xbf;
  19.         P1=table[miao/10];        //十位
  20.         delay(1);
  21.         P0=0xff;                                                //消影
  22.         delay(1);
  23. }
  24. //void display(uchar shu)
  25. //{
  26. //        
  27. //        
  28. //        P0=0x7f;
  29. //        P1=table[shu%10];        //个位
  30. //        delay(1);
  31. //        P0=0xbf;
  32. //        P1=table[shu/10];        //十位
  33. //        delay(1);
  34. //        P0=0xff;                                                //消影
  35. //        delay(1);
  36. //}
  37. void wfen()
  38. {
  39.         P0=0xef;
  40.         P1=table[fen%10];                //分个位
  41.         delay(1);
  42.         P0=0xf7;
  43.         P1=table[fen/10];                //分十位
  44.         delay(1);
  45.         P0=0xff;                                                //消影
  46.         delay(1);
  47. }
  48. void wshi()
  49. {
  50.         P0=0xfd;
  51.         P1=table[shi%10];                //时个位
  52.         delay(1);
  53.         P0=0xfe;                                       
  54.         P1=table[shi/10];        //时十位
  55.         delay(1);
  56.         P0=0xff;                                        //消影                                       
  57.         delay(1);
  58. }
  59. void gang()                                                //杠
  60. {
  61.         P0=0xdb;
  62.         P1=0x40;
  63.         delay(1);
  64. }
  65. void wnyr()
  66. {
  67.         P0=0xfe;                                        //年
  68.         P1=table[nian/10];
  69.         delay(1);
  70.         P0=0xfd;
  71.         P1=table[nian%10];
  72.         delay(1);
  73.         P0=0xfb;
  74.         P1=table[nian/10];
  75.         delay(1);
  76.         P0=0xf7;
  77.         P1=table[nian%10];
  78.         delay(1);
  79.         P0=0xef;                                        //月
  80.         P1=table[yue/10];
  81.         delay(1);
  82.         P0=0xdf;
  83.         P1=table[yue%10];
  84.         delay(1);
  85.         P0=0xbf;                                //日
  86.         P1=table[ri/10];
  87.         delay(1);
  88.         P0=0x7f;
  89.         P1=table[ri%10];
  90.         delay(1);
  91. }
  92. void init()                                                //启动定时器并赋值
  93. {
  94.         TMOD=0x01;
  95.         TH0=(65536-45872)/256;
  96.         TL0=(65536-45872)%256;
  97. //        TH1=(65536-45872)/256;
  98. //  TL1=(65536-45872)%256;
  99.         EA=1;
  100.         ET0=1;
  101. //        ET1=1;
  102.         TR0=1;
  103. //        TR1=1;
  104. }
  105. void keyscan()                //扫描键盘
  106. {
  107.         uchar m;
  108.         if(key1==0)
  109.         {
  110.                 delay(10);                //去抖
  111.           if(key1==0)
  112.                 {
  113.                         while(!key1);        //等待按键释放
  114.                         TR1=~TR1;
  115.                 }
  116.         }
  117.         if(key2==0)                                                        //切换时钟与年月日
  118.         {
  119.                 delay(10);                //去抖
  120.                 if(key2==0)
  121.                 {
  122.                         for(m=0;m<100;m++)
  123.                         wnyr();
  124.                 }
  125.         }
  126.         if(key5==0)                        //分加1
  127.         {
  128.                 delay(10);                //去抖
  129.                 if(key5==0)
  130.                 {
  131.                         fen++;
  132.                         delay(200);
  133.                         if(fen>=60)        //分满60进1
  134.                         {
  135.                                 fen=0;
  136.                                 shi++;
  137.                                 if(shi>=24)
  138.                                 {
  139.                                         shi=fen=miao=0;
  140.                                 }
  141.                         }
  142.                 }
  143.         }
  144.         if(key4==0)                //时加1
  145.         {
  146.                 delay(10);        //去抖
  147.                 if(key4==0)
  148.                 {
  149.                         shi++;
  150.                         delay(200);
  151.                         if(shi>=24)
  152.                         {
  153.                                 shi=fen=miao=0;
  154.                         }
  155.                 }
  156.         }
  157. }
  158. void main()
  159. {
  160.         init();
  161.         while(1)
  162.         {
  163.                 keyscan();
  164.                 //display(num);
  165.                   wmiao();
  166.                         wfen();
  167.                         wshi();
  168.                         gang();
  169.                         if(num==20)                //1秒到
  170.                 {
  171.                         num=0;
  172.                         miao++;
  173.                         if(miao==60)                        //秒60进1
  174.                         {
  175.                                 miao=0;
  176.                                 fen++;
  177.                                 if(fen>=60)                                //分60进1
  178.                                 {
  179.                                         fen=0;
  180.                                         shi++;
  181.                                         if(shi>=24)
  182.                                         {
  183.                                                 shi=fen=miao=0;
  184.                                                 ri++;
  185.                                                 if(yue!=2)                //月份
  186.                                                 {
  187.                                                         switch(yue)
  188.                                                         {
  189.                                                                 case 1:if(ri==32)
  190.                                                                                         ri=1;
  191.                                                                                         break;
  192.                                                                 case 3:if(ri==31)
  193.                                                                                         ri=1;
  194.                                                                                         break;
  195.                                                                 case 4:if(ri==31)
  196.                                                                                         ri=1;;
  197.                                                                                         break;
  198.                                                                 case 5:if(ri==32)
  199.                                                                                         ri=1;
  200.                                                                                         break;
  201.                                                                 case 6:if(ri==31)
  202.                                                                                         ri=1;
  203.                                                                                         break;
  204.                                                                 case 7:if(ri==32)
  205.                                                                                         ri=1;
  206.                                                                                         break;
  207.                                                                 case 8:if(ri==32)
  208.                                                                                         ri=1;
  209.                                                                                         break;
  210.                                                                 case 9:if(ri==31)
  211.                                                                                         ri=1;
  212.                                                                                         break;
  213.                                                                 case 10:if(ri==32)
  214.                                                                                         ri=1;
  215.                                                                                         break;
  216.                                                                 case 11:if(ri==31)
  217.                                                                                         ri=1;
  218.                                                                                         break;
  219.                                                                 case 12:if(ri==32)
  220.                                                                                         ri=1;
  221.                                                                                         break;
  222.                                                         }
  223.                                                 }
  224.                                                 else                                                                                //二月
  225.                                                 {
  226.                                                         if((nian%4==0)&&(nian%400==0))                //闰年
  227.                                                         {
  228.                                                                 if(ri>=30)
  229.                                                                 ri=1;
  230.                                                         }
  231.                                                         else
  232.                                                         {
  233.                                                                 if(ri>=29)
  234.                                                                 ri=1;
  235.                                                         }
  236.                                                 }
  237.                                                 if(ri==1)
  238.                                                 {
  239.                                                         yue++;
  240.                                                         if(yue==13)
  241.                                                         {
  242.                                                                 yue=0;
  243.                                                                 nian++;
  244.                                                         }
  245.                                                 }
  246.                                         }
  247.                                 }
  248.                         }
  249.                 }

  250.         }
  251. }
  252. //void T1_time() interrupt 3
  253. //{
  254. //        TH1=(65536-45872)/256;
  255. //  TL1=(65536-45872)%256;
  256. //        num++;
  257. //}
  258. void T0_time() interrupt 1
  259. {
  260. //        uchar n;
  261.         TH0=(65536-45872)/256;
  262.   TL0=(65536-45872)%256;
  263.         num++;
  264. //        if(key2==0)
  265. //        {
  266. ////                delay(10);
  267. ////                if(key2==0)
  268. ////                {
  269. //                        for(n=0;n<100;n++)
  270. //                        wnyr();
  271. ////                }
  272. //        }
  273. }
  274. void delay(uint m)                //延时函数
  275. {
  276.         uint x,y;
  277.         for(x=m;x>0;x--)
  278.                 for(y=110;y>0;y--);
  279. }
复制代码
回复

使用道具 举报

ID:825839 发表于 2020-10-4 21:37 | 显示全部楼层
大佬求解  流水灯设计
回复

使用道具 举报

ID:332444 发表于 2020-10-6 10:08 | 显示全部楼层
可参https://blog.csdn.net/xianfajushi/article/details/104001986 返回月的天数代码是通用的已经有闰年的处理,只要传递年和月的参数即可返回值用于判断,只要大等于就可执行月递增和年递增。
回复

使用道具 举报

ID:332444 发表于 2020-10-6 10:10 | 显示全部楼层
而且不用每天调用,调用一次保存值,判断大等于值后再去调用获取下月的值,即函数只需每月末调用一次即可。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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