找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)數(shù)字鐘

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:663010 發(fā)表于 2020-7-5 08:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
1.6位共陰極數(shù)碼管顯示時,分,秒。
2.調(diào)時功能,且在調(diào)時時具體調(diào)整位閃爍顯示。仿真圖及效果:

程序:
//------頭文件------
#include<reg51.h>
//------宏定義-------                 
#define uchar unsigned char
#define uint unsigned int
//------端口定義-----
sbit duan=P2^6;
sbit wei=P2^7;
sbit fm=P2^2;
sbit S2=P3^4;
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
//------變量定義-----
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//公陰極數(shù)碼管顯示0~9;
uint shi=23,fen=59,miao=55,counter=0;
uchar flag_1s,flag_m,num=0,i=0,m=0;
//------函數(shù)聲明-----                                       
void csh();                                 
void mode();
void zoushi();
void tiaoshi();
void xianshi();
void baoshi();
void delay(uchar x);
//---------主函數(shù)------------
void main()
{
         csh();
         while(1)
         {
                 mode();
                 if(flag_m==1)
                         {
                                TR0=1;
                                zoushi();
                                baoshi();
                        }
                 else
                 {
                                tiaoshi();
                 }
                 xianshi();
            }
}
//-----------初始化函數(shù)--------------
void csh()
{        
        EA=1;
        TMOD=0x11;                //選擇兩個定時器/計數(shù)器的方式一
        ET0=1;                        //定時器/計數(shù)器0溢出中斷允許
        TH0=15536/256;
        TL0=15536&256;

        ET1=1;                        //定時器/計數(shù)器1溢出中斷允許
        TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        TR1=1;                        //啟動定時器/計數(shù)器1
}
//-----------時鐘秒變量---------
void T0_ser() interrupt 1
{
        TH0=15536/256;
        TL0=15536&256;
        counter++;
        if(counter==20)
        {               
                flag_1s=1;
                counter=0;
        }
}
//---------閃爍顯示變量---------
void T1_ser() interrupt 3
{
        TH1=15536/256;
           TL1=15536&256;
        m++;
        if(m==20)
        {               
                m=0;
        }
}
//-----------------切換模式函數(shù)---------------
void mode()
{
        if(S2==0)
        {
                delay(10);
                if(S2==0)
                {
                        num=num+1;
                        while(!S2)xianshi();
                        switch(num%2)
                        {
                                case 0:flag_m=0;break;
                                case 1:flag_m=1;break;        
                        }
                        if(num==2)
                                num=0;
                }        
        }
}
//---------------走時函數(shù)--------------------
void zoushi()
{
        if(flag_1s==1)
        {
                flag_1s=0;
                if(++miao>59)
                {
                         miao=0;
                         if(++fen>59)
                         {
                          fen=0;
                          if(++shi>23)
                          shi=0;
                          }
                }
          }
}
void tiaoshi()                                           //調(diào)時函數(shù)定義
{
   if(flag_m==0&&S3==0)
   {
      delay(10);
      if(S3==0)                  
      {
              i++;
                  while(!S3)
                  xianshi();               
          }
          if(i==3)
          {
                  i=1;
          }
   }

   if(i==1)
   {
      if(S4==0)
          {
             delay(10);
             if(S4==0)
             {
                shi++;
                if(shi==24)
                shi=0;
                while(!S4)
                        xianshi();
             }
          }
             if(S5==0)
          {
             delay(10);
             if(S5==0)
             {
                shi--;
                if(shi==-1)
                shi=23;
                while(!S5)
                        xianshi();
                 }
          }
        }
        if(i==2)
   {  
      if(S4==0)
          {
             delay(10);
             if(S4==0)
             {
                fen++;
                if(fen==60)
                fen=0;
                while(!S4)
                        xianshi();
             }
          }
             if(S5==0)
          {
             delay(10);
             if(S5==0)
             {
                fen--;
                if(fen==-1)
                fen=59;
                while(!S5)
                        xianshi();
                 }
          }
        }
}   
void xianshi()
{        
                P0=0xdf;   
                wei=1;
                wei=0;
                P0=table_du[miao%10];   
                duan=1;
                duan=0;
                delay(10);
        
                P0=0xef;   
                wei=1;
                wei=0;
                P0=table_du[miao/10];   
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xf7;  
                wei=1;
                wei=0;
                if(flag_m==0&&i==2)        //調(diào)時顯示判斷
                {        
                        if(m<10)                //閃爍顯示
                        P0=table_du[fen%10]|0x80;
                        else
                        P0=0x00|0x80;
                }
                else                        
                P0=table_du[fen%10]|0x80;
                duan=1;
                duan=0;
                delay(10);

                P0=0xfb;   
                wei=1;
                wei=0;
                if(flag_m==0&&i==2)
                {        
                        if(m<10)        
                        P0=table_du[fen/10];
                        else
                        P0=0x00;
                }
                else
                P0=table_du[fen/10];
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xfd;   
                wei=1;
                wei=0;
                if(flag_m==0&&i==1)
                {        
                        if(m<10)        
                        P0=table_du[shi%10]|0x80;
                        else
                        P0=0x00|0x80;
                }
                else
                P0=table_du[shi%10]|0x80;
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xfe;  
                wei=1;
                wei=0;
                if(flag_m==0&&i==1)
                {               
                        if(m<10)
                        P0=table_du[shi/10];
                        else
                        P0=0x00;                        
                }
                else
                P0=table_du[shi/10];
                duan=1;
                duan=0;
                delay(10);        
}
//-----------------整點提醒函數(shù)-------------
void baoshi()   
{
         if (fen==0&&miao==0)
                                fm=0;
                         if(miao==5)
                                fm=1;
}
//-----------------延時函數(shù)---------------
void delay(uchar x)  
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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