找回密码
 立即注册

QQ登录

只需一步,快速开始

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

秒表计时器 在key1第一次按下,显示器会停,二次按下,为何显示管会延时1-2...

[复制链接]
跳转到指定楼层
楼主
ID:65930 发表于 2014-10-2 12:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    void display(uchar bai,uchar shi,uchar ge);
    void delay(uint z);
    void init();
    sbit du=P2^6;
    sbit we=P2^7;
    sbit key=P3^4;
    sbit key1=P3^5;
    sbit key3=P3^7;
    uchar code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
    0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 , 0x00};
    uchar t,a,bai,shi,ge,flag;
    uint temp;
    void main()               
    {  init();
       while(1)
       {  
            if(a==2)
               { a=0;
                     if(key==1)
                         { delay(2);
                             if(key==1)
                                    {
                                        temp++;
                                        if(temp==999)
                                       temp=0;
                                     bai=temp/100;
                                       shi=temp/10%10;
                                 ge=temp%10;
          
                                      }
                                  }
                          }
      display(bai,shi,ge);
         if (flag==0)
      {while(key1==0)
              {      
               TR0=0;
               flag=1;
                 display(bai,shi,ge);
               }
      }
    if(flag==1)
      {    while(key1==0)
             {TR0=1;
             flag=0;
             }
      }
      if(key3==0)
      {
        temp=0;
        bai=temp/100;
         shi=temp/10%10;
         ge=temp%10;
        display(bai,shi,ge);
        }
       }
    }
    void delay (uint z)
    {uint i,j;
    for(i=z;i>0;i--)
    for(j=110;j>0;j--);
    }
    void display(uchar bai,uchar shi,uchar ge)
    {   du=1;
    P0=table[bai];
    du=0;
    P0=0xff;
    we=1;
    P0=0xfe;
    we=0;
    delay(1);
    du=1;
    P0=table[shi];
    du=0;
    P0=0xff;
    we=1;
    P0=0xfd;
    we=0;
    delay(1);
    du=1;
    P0=table[ge];
    du=0;
    P0=0xff;
    we=1;
    P0=0xfb;
    we=0;
    delay(1);
    }
    void init()
    {du=0;
    we=0;
    t=0;
    TMOD=0x01;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    EA=1;
    ET0=1;
    TR0=1;  
    flag=0;
    }
    void timer0() interrupt 1
    {TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    a++;
    }





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

使用道具 举报

沙发
ID:65930 发表于 2014-10-2 12:39 | 只看该作者
要求按下key1后,数码管显示停止,再按下key1后,数码管显示继续计数
回复

使用道具 举报

板凳
ID:19715 发表于 2014-10-2 17:44 | 只看该作者
本帖最后由 明白 于 2014-10-2 18:33 编辑

数码管的个位是显示0.01秒,很快!!
定时器中断周期小(5ms),而在取个十百,这三个位值太消耗时间了,
三位数码管显示一遍也需要几个毫秒,
当按下按键之后,定时器是停止了(temp固定了),
但是数码管显示内容仍然是1、2个中断周期之前的数值,
也就是当前(个十百)的三个位值,不是当前temp转换过来的
主程序干嘛要两次调用display();

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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