找回密码
 立即注册

QQ登录

只需一步,快速开始

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

小白求问!单片机电子时钟程序没有循环,经过第一次按键之后按键就失灵了

[复制链接]
跳转到指定楼层
楼主
ID:560108 发表于 2019-6-13 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现该代码之后发现没有循环,经过第一次按键之后按键就失灵了

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<absacc.h>
  4. sbitkgnxz=P3^5; //功能选择键,按一次设定时间,按两次设定闹钟时间,按三次又显示时间表  
  5. sbit kmin=P3^6;//调整分
  6. sbitkhour=P3^7;//调整时
  7. sbit bear=P1^0;//蜂鸣器控制口
  8. unsigned charsecshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按键的计数
  9.               secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定义存储时间和闹钟时分秒的个位和十位
  10. unsigned intnum=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定义时间和闹钟的时分秒
  11. unsigned char codetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口
  12. voidkeyscan();//键盘扫描函数
  13. voiddisplay();//时钟显示函数
  14. voiddisplay1();//闹钟显示函数
  15. voidclock();//闹钟函数即蜂鸣器函数
  16. /***延时函数****/
  17. void delay(unsigned char z)
  18. {unsigned char x,y;
  19. for(x=z;x>0;x--)
  20.   for(y=255;y>0;y--);
  21. }
  22. /***中断函数****/
  23. void time0() interrupt 1
  24. {num++;
  25. TH0=(65536-50000)/256;
  26. TL0=(65536-50000)%256;
  27. if(num==20)
  28.   {num=0;
  29.    sec++;
  30.    if(sec==60)
  31.     {sec=0;
  32.      min++;
  33.      if(min==60)
  34.        {min=0;
  35.         hour++;
  36.         if(hour==24)
  37.           {hour=0;
  38.            }
  39.         }
  40.      }
  41. display(); }
  42. }
  43. /******时钟显示函数******/
  44. void display()
  45. {
  46. secge=sec%10;
  47. secshi=sec/10;
  48. minge=min%10;
  49. minshi=min/10;
  50. hourge=hour%10;
  51. hourshi=hour/10;
  52. P2=0xfe;
  53. P0=table[secge];
  54. delay(5);
  55. P2=0xfd;
  56. P0=table[secshi];
  57. delay(5);
  58. P2=0xfb;
  59. P0=0x40;
  60. delay(5);
  61. P2=0xf7;
  62. P0=table[minge];
  63. delay(5);
  64. P2=0xef;
  65. P0=table[minshi];
  66. delay(5);
  67. P2=0xdf;
  68. P0=0x40;
  69. delay(5);
  70. P2=0xbf;
  71. P0=table[hourge];
  72. delay(5);
  73. P2=0x7f;
  74. P0=table[hourshi];
  75. delay(5);
  76. }
  77. /*****闹钟显示函数****/
  78. void display1()
  79. {
  80. secge1=sec1%10;
  81. secshi1=sec1/10;
  82. minge1=min1%10;
  83. minshi1=min1/10;
  84. hourge1=hour1%10;
  85. hourshi1=hour1/10;
  86. P2=0xfe;
  87. P0=table[secge1];
  88. delay(10);
  89. P2=0xfd;
  90. P0=table[secshi1];
  91. delay(15);
  92. P2=0xfb;
  93. P0=0x40;
  94. delay(15);
  95. P2=0xf7;
  96. P0=table[minge1];
  97. delay(15);
  98. P2=0xef;
  99. P0=table[minshi1];
  100. delay(15);
  101. P2=0xdf;
  102. P0=0x40;
  103. delay(15);
  104. P2=0xbf;
  105. P0=table[hourge1];
  106. delay(15);
  107. P2=0x7f;
  108. P0=table[hourshi1];
  109. delay(15);
  110. }
  111. /*****键盘扫描*********/
  112. void keyscan()
  113. {if(kgnxz==0)     //功能选择键是否按下
  114.    {  delay(10);//延时消抖            
  115.          if(kgnxz==0)//再次判断键是否按下           
  116.            {flag++;}       //计数,功能选择键按键次数加一      
  117.            while(!kgnxz);} //释放键  
  118.   if(flag==1)//功能选择键
  119.    {
  120. if(kmin==0)
  121.    {delay(10);
  122.     if(kmin==0)
  123.       {min++;
  124.        if(min>=60)
  125.        min=0;
  126.        }
  127. while(kmin==0)
  128. display();
  129.     }
  130. if(khour==0)
  131.    {delay(10);
  132.     if(khour==0)
  133.       {hour++;
  134.        if(hour==24)
  135.        hour=0;
  136.        }
  137. while(khour==0)
  138. display();
  139.   }
  140. }
  141. if(flag==2)//闹钟调整

  142.            if(kmin==0)
  143.         {delay(5);
  144.           if(kmin==0)
  145.             {min1++;
  146.             if(min1==60)
  147.                min1=0;}
  148.           while(!kmin)
  149.                      {display1();}
  150.                    }
  151.       if(khour==0)
  152.         {delay(5);
  153.            if(khour==0)
  154.             {hour1++;
  155.            if(hour1==24)
  156.               hour1=0;}
  157.             while(!khour)
  158.             {display1();}

  159.                            } }
  160. /*****蜂鸣器*********/
  161. void clock()
  162.   {    unsigned int i;
  163.       for(i=1000;i>0;i--)
  164.        {bear=1;
  165.                   P1=0xfe;
  166.                   delay(10);
  167.                   bear=0;
  168.                   P1=0xff;
  169.                   delay(10);}}
  170. /*****主函数*********/
  171. main()
  172. {TMOD=0x01;
  173. TH0=(65536-50000)/256;
  174. TL0=(65536-50000)%256;
  175. EA=1;ET0=1;TR0=1;
  176. while(1)
  177. {      
  178. keyscan();display();
  179. if(flag==1) {keyscan(); display();}
  180. if(flag==2) {keyscan(); display1();}
  181. if(flag==3) {display();}
  182. if((hour==hour1)&&(min==min1)&&(sec==sec1))
  183.   {clock();}//闹钟设定时间与时钟时间相等,调用蜂鸣器函数
  184. }
  185. }
复制代码



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

使用道具 举报

来自 5#
ID:517466 发表于 2019-6-15 00:17 | 只看该作者
你的显示处理是有问题的。问题点在于显示完一个数码管之后,笔段数据保持原状,点亮下一位数码管,结果数据会被串过去显示,虽然时间很短。在下一个数码管点亮之前,P0输出的笔段全部熄灭。然后点亮下一个数码管,输出笔段数据。另外在调整定是时间过程中,由于中断中调用display()的原因,也会导致显示混乱。所以中断处理中要么去除显示调用,要么根据flag有区别地调用display()或者display1().后面附上我做的修改,含proteus仿真文件和51的keil c工程.程序里使用的共阴数码管,所有数据做了和0xFF的异或后输出。

时钟.zip

71.35 KB, 下载次数: 11

回复

使用道具 举报

沙发
ID:123289 发表于 2019-6-14 08:46 | 只看该作者
画出框图
回复

使用道具 举报

板凳
ID:332444 发表于 2019-6-14 11:36 | 只看该作者
设一个变量置于中断中当调整按钮按下则标记并开始计时规定在一定时间范围后复原调整计数
回复

使用道具 举报

地板
ID:332444 发表于 2019-6-14 11:39 | 只看该作者
或另给一个按钮用于控制开始调整和结束调整
回复

使用道具 举报

6#
ID:560108 发表于 2019-6-18 17:42 | 只看该作者
suncat0504 发表于 2019-6-15 00:17
你的显示处理是有问题的。问题点在于显示完一个数码管之后,笔段数据保持原状,点亮下一位数码管,结果数据 ...

你好,谢谢你的代码,我已经拿去试验了,但是发现你的代码会造成数码管显示不了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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