找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机时钟程序,分钟总是到60,求帮助

[复制链接]
匿名
跳转到指定楼层
楼主
匿名  发表于 2020-6-27 12:18 回帖奖励 |倒序浏览 |阅读模式
50黑币

但是到01之后又是正常显示01 了,秒和小时是正常的
还有整点报时那里也不太清楚怎么修改,新人求解答
代码如下
  1. #include <reg51.h>

  2. sbit key1 = P1^0;
  3. sbit beep = P1^0;
  4. bit flag1s = 0;
  5. bit KeySta = 1;
  6. unsigned char hour = 12;
  7. unsigned char minute =59;
  8. unsigned char second =50;
  9. unsigned char mode = 0;
  10. void FreshTime();
  11. void TimeInit();
  12. void IntInit();
  13. void InitLedBuff();
  14. void keyscan();
  15. void zhengdian();  
  16. unsigned char code LedChar[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//共阴数码管显示字符转换表
  18. unsigned char LedBuff[6] = {0xff,0xff,0xff,0xff,0xff,0xff};//数码管显示缓冲区

  19. void main()
  20. {
  21.   TimeInit();
  22.   IntInit();
  23.   InitLedBuff();
  24.   while(1)//显示内容处理
  25.   {
  26.     if(flag1s&&!mode) //时间显示模式
  27.     {
  28.       flag1s = 0;
  29.       FreshTime();
  30.     }
  31.     else if(mode == 1)  //校准分钟
  32.     {
  33.       LedBuff[0] = 17;
  34.       LedBuff[1] = 17;
  35.       LedBuff[4] = 17;
  36.       LedBuff[5] = 17;//不显示
  37.       LedBuff[2] = minute/10;
  38.       LedBuff[3] = minute%10;
  39.     }
  40.     else if(mode == 2)  //校准小时
  41.     {
  42.       LedBuff[2] = 17;
  43.       LedBuff[3] = 17;
  44.       LedBuff[4] = 17;
  45.       LedBuff[5] = 17;//不显示
  46.       LedBuff[0] = hour/10;
  47.       LedBuff[1] = hour%10;
  48.     }
  49.     else if(mode == 3)  //校准完成重新显示
  50.     {
  51.       InitLedBuff();
  52.       mode = 0;
  53.     }
  54.     keyscan();
  55.   }
  56. }

  57. void InitLedBuff()//初始化时间到显示缓冲区
  58. {
  59.   LedBuff[0] = hour/10;
  60.   LedBuff[1] = hour%10;
  61.   LedBuff[2] = minute/10;
  62.   LedBuff[3] = minute%10;
  63.   LedBuff[4] = second/10;
  64.   LedBuff[5] = second%10;
  65. }
  66. void FreshTime()//刷新时间到显示缓冲区
  67. {
  68.   second++;
  69.   if(second == 60)//进位
  70.   {
  71.     second = 0;
  72.     minute++;
  73.     LedBuff[2] = minute/10;
  74.     LedBuff[3] = minute%10;
  75.     if(minute ==60)//进位

  76.       minute = 00;
  77.       hour++;
  78.       if(hour == 24)
  79.         hour = 0;
  80.       LedBuff[0] = hour/10;
  81.       LedBuff[1] = hour%10;

  82.   }
  83.   LedBuff[4] = second/10;
  84.   LedBuff[5] = second%10;
  85. }

  86. void TimeInit()//定时器初始化
  87. {
  88.   TMOD = 0X11;    //设置定时器为模式1
  89.   TL0 = 0xB0;
  90.   TH0 = 0x3C;     //定时初值 50ms
  91.   TL1 = 0x18;                //
  92.         TH1 = 0xFC;                //定时初值 1ms
  93.   TR0 = 1;    //定时器0开始计时
  94.   TR1 = 1;    //定时器1开始计时
  95.   ET1 = 1;    //使能定时器1
  96.   ET0 = 1;    //使能定时器0
  97.   PT0 = 1;    //提高计时准确性,提高定时器0中断优先级
  98.   EA = 1;     //打开总中断
  99. }
  100. void IntInit()//外部中断初始化
  101. {
  102.   IT0 = 1;     //下降沿触发
  103.   EX0 = 1;    //使能外部中断0
  104. }

  105. void keyscan() //按键扫描及处理
  106. {
  107.   static bit backup = 1;
  108.   if (KeySta != backup)  //当前值与前次值不相等说明此时按键有动作
  109.   {
  110.     if (backup == 0)   //如果前次值为0,则说明当前是弹起动作
  111.     {
  112.       if(mode == 1)
  113.       {
  114.         minute++;
  115.         if(minute==60)
  116.           minute = 0;
  117.       }
  118.       else if(mode == 2)  
  119.       {
  120.         hour++;
  121.         if(hour==24)
  122.           hour = 0;
  123.       }
  124.     }
  125.     backup = KeySta;   //更新备份为当前值,以备进行下次比较
  126.   }
  127. }
  128. void Int0() interrupt 0
  129. {
  130.   mode++;
  131.   if(mode == 4)
  132.   {
  133.     mode = 0;
  134.   }
  135. }
  136. void Ledfresh() //数码管显示刷新
  137. {
  138.   static unsigned char i = 0;
  139.   switch(i)
  140.   {
  141.     case 0 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  142.     case 1 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  143.     case 2 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  144.     case 3 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  145.     case 4 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  146.     case 5 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i=0;break;
  147.   }
  148. }
  149. void Time0() interrupt 1 //12MHz 50ms
  150. {
  151.   static unsigned char n = 0;
  152.   TL0 = 0xB0;
  153.   TH0 = 0x3C;
  154.   n++;
  155.   if(n==20)
  156.   {
  157.     n=0;
  158.     flag1s = 1;//1s标志位
  159.   }
  160. }
  161. void zhengdian()                 //整点报时
  162. {
  163.         if((second==0)&&((minute==0)&&(hour>=0)))
  164.         {
  165.                 beep=1;
  166.                
  167.                 beep=0;
  168.                
  169.         }
  170. }

  171. void Time1() interrupt 3  //12MHz 1ms
  172. {
  173.   static unsigned char keybuff = 0xff;
  174.   TL1 = 0x18;        
  175.         TH1 = 0xFC;        
  176.   Ledfresh();
  177.   keybuff = (keybuff<<1)|key1;
  178.   if (keybuff == 0x00)
  179.   {
  180.       KeySta = 0;
  181.   }
  182.   else if (keybuff == 0xFF)
  183.   {  
  184.       KeySta = 1;
  185.   }
  186.   else
  187.   {}
  188. }
复制代码


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

使用道具 举报

沙发
ID:565961 发表于 2020-6-27 13:39 | 只看该作者
分钟问题已解决,想插入一个整点报时的功能,请问怎么改呀
回复

使用道具 举报

板凳
ID:213173 发表于 2020-6-28 08:55 | 只看该作者
651991190 发表于 2020-6-27 13:39
分钟问题已解决,想插入一个整点报时的功能,请问怎么改呀

void zhengdian() //整点报时响1秒
{
        if(second<1 && minute==0)
                beep=1;
        else        
                beep=0;
}
回复

使用道具 举报

地板
ID:565961 发表于 2020-6-28 13:53 | 只看该作者
wulin 发表于 2020-6-28 08:55
void zhengdian() //整点报时响1秒
{
        if(second

直接加进去就行了吗,是我电路原因还是什么原因,,就是不响呀,我试了很多次了
回复

使用道具 举报

5#
ID:213173 发表于 2020-6-28 15:07 | 只看该作者
651991190 发表于 2020-6-28 13:53
直接加进去就行了吗,是我电路原因还是什么原因,,就是不响呀,我试了很多次了

zhengdian();放在主循环中keyscan();下面。这是有源蜂鸣器的驱动,是高电平有效还是低电平有效取决于你的硬件电路结构。响多长时间调整 if(second<x && minute==0)
回复

使用道具 举报

6#
ID:565961 发表于 2020-6-28 22:28 | 只看该作者
wulin 发表于 2020-6-28 15:07
zhengdian();放在主循环中keyscan();下面。这是有源蜂鸣器的驱动,是高电平有效还是低电平有效取决于你 ...

您说的这个我注意到的,试过还是不响,,哭了
回复

使用道具 举报

7#
ID:213173 发表于 2020-6-29 07:09 | 只看该作者
651991190 发表于 2020-6-28 22:28
您说的这个我注意到的,试过还是不响,,哭了

仿真.zip (141.65 KB, 下载次数: 4)
回复

使用道具 举报

8#
ID:565961 发表于 2020-6-29 12:09 | 只看该作者
wulin 发表于 2020-6-28 15:07
zhengdian();放在主循环中keyscan();下面。这是有源蜂鸣器的驱动,是高电平有效还是低电平有效取决于你 ...

应该是我的电路问题,我调节了蜂鸣器的电压值和电阻阻值就响了,但是还是谢谢您了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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