找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6577|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

多功能數(shù)碼管秒表(帶正、倒計(jì)時(shí),及時(shí)鐘模式)有代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

基于STC89C52的數(shù)碼管顯示秒表,用矩陣鍵盤,有走秒,輸入時(shí)間正計(jì)時(shí)、倒計(jì)時(shí),到時(shí)提醒,及切換到時(shí)鐘模式的功能
鍵盤位置:7                 8                   9                    開始(正計(jì)時(shí))
                 4                 5                   6                    暫停
                 1                 2                   3                    倒計(jì)時(shí)
                 模式切換     0                   時(shí)間校正        清零
很容易理解,所以,這個(gè)就直接附代碼~~
下載地址:
多功能秒表.doc (6.43 KB, 下載次數(shù): 85)


///////////////////////////////////////////////////頭文件和一些定義和初始化在附件里有///////////////////////////////////////////////////
char codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                   0x54};//數(shù)碼管段碼,最后一個(gè)為n
char code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//數(shù)碼管位碼

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)//延時(shí)
{
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;//防止循環(huán)進(jìn)入此函數(shù)      
}

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++)//數(shù)碼管0-2位依次顯示
//     {
//       yu1=shang1%10;//取余
//        shang1=shang1/10;//取商
//           if(a5==1)//循環(huán)到個(gè)位時(shí)顯示小數(shù)點(diǎn)
//           {      
//              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++)//數(shù)碼管3-4位依次顯示
//        {
//          yu2=shang2%10;//取余
//           shang2=shang2/10;//取商
//           if(a5==3)//循環(huán)到個(gè)位時(shí)顯示小數(shù)點(diǎn)
//           {      
//              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();
    }
}

評分

參與人數(shù) 3黑幣 +108 收起 理由
13202036330 + 3
51pp + 5 贊一個(gè)!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:151927 發(fā)表于 2016-12-3 17:57 | 只看該作者
可以用作課程設(shè)計(jì)嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:151893 發(fā)表于 2016-12-3 19:21 | 只看該作者
shizhanglei 發(fā)表于 2016-12-3 17:57
可以用作課程設(shè)計(jì)嗎

怎么樣的課程設(shè)計(jì)?有什么要求
回復(fù)

使用道具 舉報(bào)

地板
ID:151893 發(fā)表于 2016-12-3 19:55 | 只看該作者
shizhanglei 發(fā)表于 2016-12-3 17:57
可以用作課程設(shè)計(jì)嗎

你具體什么要求?
回復(fù)

使用道具 舉報(bào)

5#
ID:152009 發(fā)表于 2016-12-3 23:47 | 只看該作者
怎么樣的課程設(shè)計(jì)?有什么要求
回復(fù)

使用道具 舉報(bào)

6#
ID:257970 發(fā)表于 2017-12-6 10:08 來自手機(jī) | 只看該作者
這個(gè)可以改成實(shí)現(xiàn)6位數(shù)碼管顯示時(shí)分秒倒計(jì)時(shí)的嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:267933 發(fā)表于 2017-12-27 20:02 | 只看該作者
大神,沒有仿真圖。
回復(fù)

使用道具 舉報(bào)

8#
ID:781537 發(fā)表于 2020-6-17 13:38 | 只看該作者
可以,這功能完美
回復(fù)

使用道具 舉報(bào)

9#
ID:243874 發(fā)表于 2020-10-19 13:07 | 只看該作者
這個(gè)有電路嗎
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表