单片机做的秒表,开始停止按键经常不管用,为什么??

2019-07-15 23:29发布

#include<reg52.h>           //100秒的秒表,每10毫秒计数一次,共四位显示,
#define uchar unsigned char
#define uint  unsigned int
unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码
unsigned char tab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  //秒后带小数点的段码
uint x;
sbit key=P3^2;           //开始停止按键
void delay(uint i)         // 1ms延时
{
  uchar j;
  while(i--)
  {
   for(j=0;j<120;j++);
  }
}

void display(uint x) //显示子程序
{
           P2=0xef;                  //十位秒显示
        P0=smg[x/1000];
        delay(3);
        P2=0xff;                  //关闭数码管
        P0=0xff;
        delay(3);
        P2=0xdf;                   //个位秒显示,带小数点
        P0=tab[x/100%10];
        delay(3);
        P2=0xff;                        //关闭数码管
        P0=0xff;
        delay(3);
        P2=0xbf;                        //小数点后一位显示
        P0=smg[x/10%10];
        delay(3);
        P2=0xff;
        P0=0xff;
        delay(3);
        P2=0x7f;                //小数点后第二位显示
        P0=smg[x%10];
        delay(3);
        P2=0xff;
        P0=0xff;
        delay(3);

}


  void main()
  {        x=0;
        EA=1;                  //开总中断
        EX0=1;                  //开外部中断0
        IT0=1;                  //负跳变触发
   TMOD=0x01;           //定时器工作方式1;
   TR0=0;                         //启动定时器
   TF0=0;                  //溢出标志位清0
   TH0=(65536-10000)/256;         //定时器0高8位赋值          
   TL0=(65536-10000)%256;         //定时器0低8位赋值
   while(1)
   {  while(TF0==1)                          //当溢出时 ,标志位变1
          {        TF0=0;                                  //标志位清0
            x++;                                   //计数
            TH0=(65536-9000)/256;
        TL0=(65536-9000)%256;
          }
            display(x);                            //显示函数
         if(x>10000)                           //超过10s后,归0
         {x=0;}
         
   }
  }
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
                    TR0=~TR0;                                        //定时器启动位取反
         
}

。。。。。。。。。。。。。。。。。。。。。。。。。
开始停止按键经常不管用,是不是该消抖呢,但该怎么消呢?求大神指点



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
冰葑世纪
1楼-- · 2019-07-15 23:29
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
if(key==0)                           //按键消抖
        {
                delay(20);
                if(key==0)
                {
                    TR0=~TR0;                                        //定时器启动位取反
         
}
}
dongyumin
2楼-- · 2019-07-16 01:13
我建议你个思路。
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
                    TR0=~TR0;                                        //定时器启动位取反
         
}
从你中断服务函数看,控制定时器的开启和关闭,可能造成原因,一次按下连续两次或多次进入中断0服务函数,造成开启或关闭。所以,你应该在中断服务函数里面加上这么些语句:while(!EXTI0); EXTI0在前面定义为sbit EXTI0=P3^2;进入中断时关闭EX0,出中断前开启EX0用来保证一次触发只有一次中断。
1小2辉
3楼-- · 2019-07-16 04:23
 精彩回答 2  元偷偷看……
swq736993598
4楼-- · 2019-07-16 05:40
看看
liu1032042013
5楼-- · 2019-07-16 05:53
谢谢各位指点啊,我试试
liu1032042013
6楼-- · 2019-07-16 07:27
冰葑世纪 发表于 2013-7-26 10:52
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
if(key==0)                           //按键消抖

试了,不行,按下按键后,只有一个数码管显示0,其他数码管都灭了

一周热门 更多>