找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2667|回复: 4
收起左侧

51单片机数字时钟 为什么减到0后在减就出现乱数 时分秒都是这样的

[复制链接]
ID:638158 发表于 2021-1-2 14:59 | 显示全部楼层 |阅读模式
51hei图片20210102145641.jpg 51hei图片20210102145655.jpg 51hei图片20210102145701.jpg

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit J9A = P2^2;
  6. sbit J9B = P2^3;
  7. sbit J9C = P2^4;
  8. sbit k1 = P1^0;
  9. sbit k2 = P1^1;
  10. sbit k3 = P1^2;
  11. sbit k4 = P1^3;
  12. sbit k5 = P1^4;
  13. sbit k7 = P1^5;

  14. #define GPIO_DIG P0

  15. uchar code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                         //0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88
  16.                                                                                                                            //,0x83,0xc6,0xa1,0x86,0x8e,0xff           共阳

  17. uchar LedBuff[8];
  18. uchar sec = 52;
  19. uchar min = 58;
  20. uchar hour = 23;
  21. uchar flags;



  22.   /*
  23. void delay10ms(uint c)
  24. {
  25.         uchar a,b;
  26.         for( ; c>0; c--)
  27.                 for(b=38; b>0; b--)
  28.                         for(a=130; a>0; a--);
  29. }           */
  30.         




  31. void delay(uint i)                 //delay(200)可以看到数码管不闪
  32. {
  33.         while(i--);
  34. }                                

  35. void DigDisplay()
  36. {
  37.         uint i;
  38.         for(i=0; i<8; i++)
  39.         {
  40.                 switch(i)
  41.                 {
  42.                         case 0:J9A=0; J9B=0; J9C=0; break;
  43.                         case 1:J9A=1; J9B=0; J9C=0; break;
  44.                         case 2:J9A=0; J9B=1; J9C=0; break;
  45.                         case 3:J9A=1; J9B=1; J9C=0; break;
  46.                         case 4:J9A=0; J9B=0; J9C=1; break;
  47.                         case 5:J9A=1; J9B=0; J9C=1; break;
  48.                         case 6:J9A=0; J9B=1; J9C=1; break;
  49.                         case 7:J9A=1; J9B=1; J9C=1; break;
  50.                 }
  51.                 GPIO_DIG = LedBuff[i];
  52.                 delay(100);
  53.                 GPIO_DIG = 0x00;
  54.         }        
  55. }

  56. void DigClock(uchar hour,uchar min,uchar sec)
  57. {
  58.         LedBuff[0] = smgduan[hour/10];
  59.         LedBuff[1] = smgduan[hour%10];

  60.         LedBuff[2] = 0x40;

  61.         LedBuff[3] = smgduan[min/10];
  62.         LedBuff[4] = smgduan[min%10];

  63.         LedBuff[5] = 0x40;

  64.         LedBuff[6] = smgduan[sec/10];
  65.         LedBuff[7] = smgduan[sec%10];
  66. }

  67. void Int0Init()
  68. {
  69.         TMOD |= 0X01;
  70.         TH0 = 0XFC;
  71.         TL0 = 0X18;
  72.         ET0 = 1;
  73.         EA = 1;
  74.         TR0 = 1;
  75. }

  76. void main()
  77. {
  78.         Int0Init();        

  79.         while(1)
  80.         {
  81.                 DigClock( hour, min, sec);
  82.                 DigDisplay();
  83.                
  84.                 if(k1 == 0)
  85.                 {
  86.                         hour=0; min=0; sec=0;
  87.                         
  88.                 }

  89.                 if(k2 == 0)
  90.                 {
  91.                         TR0 = 0;
  92.                 }

  93.                 if(k3 == 0)
  94.                 {
  95.                         TR0 = 1;
  96.                 }

  97.                 if(k4 == 0)
  98.                 {
  99.                         delay(1);
  100.                         if(k4 == 0)
  101.                         {
  102.                                 TR0 = 0;

  103.                                 flags++;
  104.                                 if(flags > 3)
  105.                                 {
  106.                                         flags = 0;
  107.                                         TR0 = 1;
  108.                                 }
  109.                         }
  110.                         while(!k4);
  111.                 }
  112.               switch(flags)
  113.                         {
  114.                                   case 1:if(k5 == 0)
  115.                                                 {
  116.                                                         delay(1);
  117.                                                         if(k5 == 0)
  118.                                                         {
  119.                                                                 hour++;
  120.                                                                 if(hour > 23)
  121.                                                                 {
  122.                                                                         hour = 0;
  123.                                                                 }
  124.                                                             while(!k5);
  125.                                                         }
  126.                                                 }  
  127. //                                                DigClock( hour, min, sec);
  128. //                                                DigDisplay();
  129.                                        
  130.                                                 if(k7 == 0)
  131.                                                 {
  132.                                                         delay(1);
  133.                                                         if(k7 == 0)
  134.                                                         {
  135.                                                                 hour--;
  136.                                                                 if(hour < 0)
  137.                                                                 {
  138.                                                                         hour = 23;
  139.                                                                 }
  140.                                                             while(!k7);
  141.                                                         }
  142.                                                 }
  143.                                                 DigClock( hour, min, sec);

  144.                                                 break;

  145.                                 case 2:if(k5 == 0)
  146.                                                 {
  147.                                                         delay(1);
  148.                                                         if(k5 == 0)
  149.                                                         {
  150.                                                                 min++;
  151.                                                                 if(min > 59)
  152.                                                                 {
  153.                                                                         min = 0;
  154.                                                                 }
  155.                                                             while(!k5);
  156.                                                         }
  157.                                                 }  
  158. //                                                DigClock( hour, min, sec);
  159. //                                                DigDisplay();
  160.                                        
  161.                                                 if(k7 == 0)
  162.                                                 {
  163.                                                         delay(1);
  164.                                                         if(k7 == 0)
  165.                                                         {
  166.                                                                 min--;
  167.                                                                 if(min < 0)
  168.                                                                 {
  169.                                                                         min = 59;
  170.                                                                 }
  171.                                                             while(!k7);
  172.                                                         }
  173.                                                 }
  174.                                                 DigClock( hour, min, sec);

  175.                                                 break;

  176.                                  case 3:if(k5 == 0)
  177.                                                 {
  178.                                                         delay(1);
  179.                                                         if(k5 == 0)
  180.                                                         {
  181.                                                                 sec++;
  182.                                                                 if(sec > 59)
  183.                                                                 {
  184.                                                                         sec = 0;
  185.                                                                 }
  186.                                                             while(!k5);
  187.                                                         }
  188.                                                 }  
  189. //                                                DigClock( hour, min, sec);
  190. //                                                DigDisplay();
  191.                                        
  192.                                                 if(k7 == 0)
  193.                                                 {
  194.                                                         delay(1);
  195.                                                         if(k7 == 0)
  196.                                                         {
  197.                                                                 sec--;
  198.                                                                 if(sec < 0)
  199.                                                                 {
  200.                                                                         sec = 59;
  201.                                                                 }
  202.                                                             while(!k7);
  203.                                                         }
  204.                                                 }
  205.                                                 DigClock( hour, min, sec);

  206.                                                 break;
  207.                         }
  208.         }
  209. }

  210. void Timer0() interrupt 1
  211. {
  212.         uint cnt;

  213.         TH0 = 0XFC;
  214.         TL0 = 0X18;
  215.         cnt++;

  216.         if(cnt ==  1000)
  217.         {
  218.                 cnt = 0;
  219.                 sec++;

  220.                 if(sec > 59)
  221.                 {
  222.                         sec = 0;
  223.                         min++;
  224.                         
  225.                         if(min > 59)
  226.                         {
  227.                                 min = 0;
  228.                                 hour++;

  229.                                 if(hour > 23)
  230.                                 {
  231.                                         hour = 0;
  232.                                 }
  233.                         }
  234.                 }
  235.         }
  236. }
复制代码
回复

使用道具 举报

ID:373388 发表于 2021-1-2 15:39 | 显示全部楼层
计算机单字节无符号数 0-1 = 0xff = 255 ,用255查表可能查出表格之外乱码处了
回复

使用道具 举报

ID:213173 发表于 2021-1-2 16:27 | 显示全部楼层
定义为有符号字符类型
char sec = 52;
char min = 58;
char hour = 23;或写成
sec--;
if(sec >6 0)
sec = 59;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:638158 发表于 2021-1-2 17:18 来自手机 | 显示全部楼层
wulin 发表于 2021-1-2 16:27
定义为有符号字符类型
char sec = 52;
char min = 58;

感谢,刚试了,没问题了!
回复

使用道具 举报

ID:517951 发表于 2021-1-2 18:08 | 显示全部楼层
我在调试过程中也出现过这个问题,要将时分秒设置为char 类型的。
sec--; if(sec <0) sec = 59;
sec++; if(sec >59) sec = 0;
之后就显示正常了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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