单片机/MCU论坛
直播中

871611

12年用户 51经验值
私信 关注
[问答]

中断,电子时钟,定时器的问题

刚学完定时器,编写了一个电子时钟的程序,想用中断控制时钟的分或秒+1,但是一触发中断,数码管就会停止显示以前的数,为什么呢,然后加的数也不是一,怎么给中断像独立按键一样的那种“消抖”

回帖(17)

lstcspring

2012-11-13 22:59:30
{:soso_e132:}不知道你是个什么情况,无图无程序
举报

侯工

2012-11-13 22:59:37
不懂帮顶
举报

871611

2012-11-13 23:56:52
引用: lstcspring 发表于 2012-11-13 22:59
不知道你是个什么情况,无图无程序

#include
#define ui unsigned int
#define uc unsigned char
unsigned char code duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
unsigned char code wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
***it fmq=P3^6;
***it K2=P3^3;
uc shi=12,fen=0,miao=0,m=0,e ;
delay(ui a)
{
uc z;
while(a--)
for(z=0;z<11;z++)  {;}
}
void delay1ms(ui i)
{
while(i--)
   {
    uc j;
for(j=0;j<115;j++) {;}
}
}

void display()
{
P2=wei[0];
P0=duan[shi/10];
delay1ms(3);
P2=wei[1];
P0=duan[shi%10];
delay1ms(3);
P2=wei[2];
P0=0xbf;
delay1ms(3);
P2=wei[3];
P0=duan[fen/10];
delay1ms(3);
P2=wei[4];
P0=duan[fen%10];
delay1ms(3);
P2=wei[5];
P0=0xbf;
delay1ms(3);
P2=wei[6];
P0=duan[miao/10];
delay1ms(3);
P2=wei[7];
P0=duan[miao%10];
delay1ms(3);
}

main()
{
EA=1;
EX0=1;
ET0=1;
EX1=1;
ET1=1;
TMOD=0x01;
TH1=(65536-55536)/256;
TL1=(65536-55536)%256;
TF1=0;
TR1=1;
while(1)
  {
display();
   }
}
void q()interrupt 0
{
TR1=~TR1;
}
void qaq() interrupt 2
{
if(miao<30)
      {
   miao=0;
   }
if(miao>=30)
      {
       for(e=0;e<100;e++)
     {
  fmq=0;
  delay(1);
  fmq=1;
  delay(1);
      }
   miao=0;
   fen=fen+1;
   {
   
   if(fen==60)
     {

  fen=0;
  shi=shi+1;
  if(shi>23)
  {
  shi=fen=miao=0;
  }
  }
   }
}
}
void qq() interrupt 3
{
TF1=0;
m++;
if(m==120)
  {
  m=0;
  miao=miao+1;
  }
   if(miao==60)
      {
       for(e=0;e<100;e++)
     {
  fmq=0;
  delay(1);
  fmq=1;
  delay(1);
      }
   miao=0;
   fen=fen+1;
   {
   
   if(fen==60)
     {
   for(e=0;e<200;e++)
     {
  fmq=0;
  delay(4);
  fmq=1;
  delay(1);
      }
  fen=0;
  shi=shi+1;
  if(shi>23)
  {
  shi=fen=miao=0;
  }
  }
   }
   }
TH1=(65536-55536)/256;
    TL1=(65536-55536)%256;
  }




延时不会调,都是瞎凑的数
举报

张三

2012-11-14 09:42:20
怎么一个小小的计时器,用那么多中断,你还知道中断的优先级么?我怀疑你自己都搞乱了,先把程序简化吧。
举报

朱海生

2012-11-14 09:52:25
动态扫描在主程序中,你的中断处理时间太长,所以看起来就是显示停止了。
举报

1653384077.075000

2012-11-14 10:02:04
楼上正解:
1、你把程序写的太复杂了,尤其是中断
2、中断思路比较乱,可以简化
3、定时器有自动装载的功能么(不好意思,不太熟悉51),即使没有,也可以在中断中修改一下就ok
4、定时器中断不需要 去抖动 处理
  另外,你写程序最好加上适当的注释。。。拙见
举报

871611

2012-11-14 12:39:55
引用: lovezjf234 发表于 2012-11-14 09:42
怎么一个小小的计时器,用那么多中断,你还知道中断的优先级么?我怀疑你自己都搞乱了,先把程序简化吧。 ...

就是把能写的都写进去了啊,2个外部中断,1个定时器,中断控制定时器的开关和miao加1的么
举报

871611

2012-11-14 12:41:33
引用: 3htech 发表于 2012-11-14 09:52
动态扫描在主程序中,你的中断处理时间太长,所以看起来就是显示停止了。 ...

那要把动态扫描的程序在中断里也要写一遍?
举报

871611

2012-11-14 12:44:31
引用: yatoo 发表于 2012-11-14 10:02
楼上正解:
1、你把程序写的太复杂了,尤其是中断
2、中断思路比较乱,可以简化

我就是想不明白怎么可以在触发中断时候数码管也能正常显示
举报

855243

2012-11-14 13:02:40
举报

姜小文

2012-11-14 16:49:42
按键扫描是有大学问的
举报

1653384077.075000

2012-11-14 17:05:27
引用: a515972470 发表于 2012-11-14 12:44
我就是想不明白怎么可以在触发中断时候数码管也能正常显示

我们看到的其实 数码管的 余晖, 只不过单片机速度快,不停的点亮数码管,所以我们看到数码管就好像一直亮着的,你中断中用到了许多延时,这个就会造成,单片机点亮时间间隔过大。。。估计会有看起来不连续的感觉(即是你说的,停止显示)。。。你说不加1,估计问题也是出在这儿,建议精简你的中断响应函数,中断耽搁的时间越短愈好。
举报

871611

2012-11-14 17:44:02
引用: yatoo 发表于 2012-11-14 17:05
我们看到的其实 数码管的 余晖, 只不过单片机速度快,不停的点亮数码管,所以我们看到数码管就好像一直 ...

哦,谢谢,那你的意思是说,精简的程序,中断就可以不打断数码管了么
举报

1653384077.075000

2012-11-14 20:01:12
本帖最后由 yatoo 于 2012-11-14 20:16 编辑
引用: a515972470 发表于 2012-11-14 17:44
哦,谢谢,那你的意思是说,精简的程序,中断就可以不打断数码管了么

假设 定义了全局变量unsigned char S电子发烧友t, MinCnt, HourCnt,且均初始化为0, 其他部分正确,中断程序可以参照以下,刚刚写了下,没有实测。。。。。。

void Time_IRQHandler(void) interrupt 3
{
     //定时器秒中断
    S电子发烧友t++;
    if(S电子发烧友t == 60)
    {
        S电子发烧友t = 0;
        MinCnt++;
        if(MinCnt == 60)
        {
           MinCnt = 0;
           HourCnt++;
           if (HourCnt == 24)
           {
               HourCnt = 0;
           }
        }
    }
    //定时器载入初值
    TH1=(65536-55536)/256;
    TL1=(65536-55536)%256;
}

编辑器有问题,S电子发烧友t ,不是本意,你自己改一下

好久没有接触51了,不太熟悉,仅供参考..

举报

一台塔吊

2012-11-15 08:59:02
https://bbs.elecfans.com/forum.php?mod=viewthread&tid=289442

我觉得写的很好。你看看吧。在中断中扫描按键,无延时。
举报

谭桂旭

2012-11-15 11:37:23
学习
举报

871611

2012-11-15 15:32:44
引用: yatoo 发表于 2012-11-14 20:01
假设 定义了全局变量unsigned char S电子发烧友t, MinCnt, HourCnt,且均初始化为0, 其他部分正确,中断 ...

嗯嗯,好的,谢谢啦
举报

更多回帖

发帖
×
20
完善资料,
赚取积分