找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多功能数码管秒表(带正、倒计时,及时钟模式)有代码

  [复制链接]
跳转到指定楼层
楼主

基于STC89C52的数码管显示秒表,用矩阵键盘,有走秒,输入时间正计时、倒计时,到时提醒,及切换到时钟模式的功能
键盘位置:7                 8                   9                    开始(正计时)
                 4                 5                   6                    暂停
                 1                 2                   3                    倒计时
                 模式切换     0                   时间校正        清零
很容易理解,所以,这个就直接附代码~~
下载地址:
多功能秒表.doc (6.43 KB, 下载次数: 84)


///////////////////////////////////////////////////头文件和一些定义和初始化在附件里有///////////////////////////////////////////////////
char codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                   0x54};//数码管段码,最后一个为n
char code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码

void Init()//清零
{      
    run=0;
    remind=0;
    num=0;
    time=0;
    miao=0;
    fen=0;
    time0=0.00001;
    beep=1;
    key=16;
    EA=0;
    ET0=0;
    TR0=0;
}      

void delay(unsigned char i)//延时
{
char j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void bee()//蜂鸣器
{
beep=0;        
delay(500);
beep=1;        
}

void keyscan()//按键检测
{
    uchar temp;
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {   
            temp=P3;
            switch(temp)
            {
                case 0xee:
                      key=7;
                     break;
                case0xde:
                      key=8;
                     break;
                case 0xbe:
                      key=9;
                     break;
                case0x7e:
                      key=12;
                     break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
   if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xed:
                      key=4;
                     break;
                case0xdd:
                      key=5;
                     break;
                case0xbd:
                      key=6;
                     break;
                case0x7d:
                      key=13;
                     break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }

        }
    }

    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
   if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xeb:
                      key=1;
                     break;
                case0xdb:
                      key=2;
                     break;
                case0xbb:
                      key=3;
                     break;
                case0x7b:
                      key=14;
                     break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
   if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xe7:
                      key=10;
                     break;
                case0xd7:
                      key=0;
                     break;
                case0xb7:
                      key=11;
                     break;
                case0x77:
                      key=15;
                     break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
}

void stor()
{
   if(key!=16)
    {
       if(key>11)
            switch(key)
            {
                case 12:run=1;break;
                case13:run=0;break;
                case14:run=2;break;
                case15:Init();
            }
        if(key<10)
        {
            if(time0==0.00001)
                time0=0;
            time0=time0*10+key;
            run=3;
        }      
    }
    key=16;//防止循环进入此函数      
}

void T0_time()interrupt 1
{
   TH0=(65536-9216)/256;
    TL0=(65536-9216)%256;
//  num++;
//  if(num==2)
//  {
//      num=0;
        if(run==1)
          time+=0.01;
        else
          time-=0.01;
//  }
}

void display(float t)
{
    intmiao_,time10,a[6],n1;
    time10=t*100;
    miao_=time10%100;
    miao=time10/100%60;
    fen=time10/100/60;

    a[0]=miao_%10;
   a[1]=miao_/10;
   a[2]=miao%10;
   a[3]=miao/10;
    a[4]=fen%10;
    a[5]=fen/10;

        for(n1=0;n1<6;n1++)
        {
           if(n1!=2&&n1!=4)
           {      
                P0=table[a[n1]];
                dula=1;
                dula=0;
               P0=weixuan[n1];
               wela=1;
               wela=0;
               delay(5);
            }
            else
            {                                       //05 4744
                P0=table[a[n1]]+0x80;      
               dula=1;
               dula=0;
               P0=weixuan[n1];
               wela=1;
               wela=0;
               delay(5);
            }
        }      

//  if(remind==0)
//  {
//  for(a5=0;a5<3;a5++)//数码管0-2位依次显示
//     {
//       yu1=shang1%10;//取余
//        shang1=shang1/10;//取商
//           if(a5==1)//循环到个位时显示小数点
//           {      
//              P0=table[yu1]+0x80;
//              dula=1;
//               dula=0;
//               P0=weixuan[a5];
//               wela=1;
//               wela=0;
//                delay(5);
//            }
//          else
//          {
//              P0=table[yu1];      
//               dula=1;
//               dula=0;
//               P0=weixuan[a5];
//               wela=1;
//               wela=0;
//               delay(5);
//          }
//     }
//      for(;a5<5;a5++)//数码管3-4位依次显示
//        {
//          yu2=shang2%10;//取余
//           shang2=shang2/10;//取商
//           if(a5==3)//循环到个位时显示小数点
//           {      
//              P0=table[yu2]+0x80;
//              dula=1;
//               dula=0;
//               P0=weixuan[a5];
//               wela=1;
//               wela=0;
//               delay(5);
//            }
//          else
//          {
//              P0=table[yu2];      
//               dula=1;
//               dula=0;
//                P0=weixuan[a5];
//               wela=1;
//               wela=0;
//               delay(5);
//          }
//        }
//
//  }
//  else
//  {
//              P0=table[13];      
//               dula=1;
//               dula=0;
//                P0=weixuan[0];
//               wela=1;
//               wela=0;
//               delay(5);
//
//              P0=table[16];      
//               dula=1;
//               dula=0;
//               P0=weixuan[1];
//               wela=1;
//                wela=0;
//               delay(5);
//
//              P0=table[14];      
//               dula=1;
//               dula=0;
//               P0=weixuan[2];
//               wela=1;
//               wela=0;
//               delay(5);
//  }
}

void check_display()
{
    if(run==0)
      TR0=0;
    if(run==1&&TR0==0||run==2&&TR0==0)
    {
        TMOD=0x01;
        TH0=(65536-9216)/256;
        TL0=(65536-9216)%256;
        EA=1;
        ET0=1;
        TR0=1;
        if(run==2&&time0!=0.00001)
            time=time0;
    }
    if(time==time0&&run==1&&remind==0)
    {
//      bee();
        run=0;
        remind=1;
    }
    if(time<=0&&run==2&&remind==0)
    {
//      bee();
        run=0;
        remind=1;
    }
    if(run!=3)
        display(time);
    else
        display(time0);
}                                                     

void main()
{
    Init();
    while(1)
    {   
        keyscan();
        stor();
        check_display();
    }
}

评分

参与人数 3黑币 +108 收起 理由
13202036330 + 3
51pp + 5 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:151927 发表于 2016-12-3 17:57 | 只看该作者
可以用作课程设计吗
回复

使用道具 举报

板凳
ID:151893 发表于 2016-12-3 19:21 | 只看该作者
shizhanglei 发表于 2016-12-3 17:57
可以用作课程设计吗

怎么样的课程设计?有什么要求
回复

使用道具 举报

地板
ID:151893 发表于 2016-12-3 19:55 | 只看该作者
shizhanglei 发表于 2016-12-3 17:57
可以用作课程设计吗

你具体什么要求?
回复

使用道具 举报

5#
ID:152009 发表于 2016-12-3 23:47 | 只看该作者
怎么样的课程设计?有什么要求
回复

使用道具 举报

6#
ID:257970 发表于 2017-12-6 10:08 来自手机 | 只看该作者
这个可以改成实现6位数码管显示时分秒倒计时的吗?
回复

使用道具 举报

7#
ID:267933 发表于 2017-12-27 20:02 | 只看该作者
大神,没有仿真图。
回复

使用道具 举报

8#
ID:781537 发表于 2020-6-17 13:38 | 只看该作者
可以,这功能完美
回复

使用道具 举报

9#
ID:243874 发表于 2020-10-19 13:07 | 只看该作者
这个有电路吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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