標(biāo)題: 51單片機(jī)時(shí)鐘顯示+計(jì)時(shí) [打印本頁(yè)]

作者: fghdfjh    時(shí)間: 2017-11-20 09:22
標(biāo)題: 51單片機(jī)時(shí)鐘顯示+計(jì)時(shí)
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uchar code Tab0[]=                //定義數(shù)碼管數(shù)組,沒(méi)有小數(shù)點(diǎn)
{
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar code Tab1[]=                //定義數(shù)碼管數(shù)組,有小數(shù)點(diǎn)
{       
        0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
};

sbit K1=P3^2;                        //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
sbit K2=P3^3;                        //設(shè)置時(shí)間時(shí)加一/開(kāi)始(暫停)秒表按鍵
sbit K3=P3^4;                        //切換設(shè)置位/清零秒表按鍵

void Delay(uchar x);                //延時(shí)函數(shù)
void Display0();                 //時(shí)間顯示函數(shù)
void Display1();                 //秒表顯示函數(shù)
void Display2();                //時(shí)間設(shè)置顯示函數(shù)
void Init();                         //中斷初始化函數(shù)
void Mode_K1();                        //模式切換函數(shù)
void KEY_MiaoBiao();        //檢測(cè)秒表操作按鍵
void KEY_Time_Set();         //檢測(cè)時(shí)間設(shè)置按鍵


uchar Hours=23,Minutes=56,seconds=55;                //分別定義三個(gè)變量表示時(shí)、分、秒
uchar Time0_bit=0;                        //用于定時(shí)器0的溢出標(biāo)志
bit Set_Time=0;                                //設(shè)置時(shí) 閃爍時(shí)長(zhǎng)的標(biāo)志位
bit Set0=0;                                        //設(shè)置時(shí)間標(biāo)志,確定是設(shè)置‘分’還設(shè)置‘時(shí)’
uchar K1_bit=0;                                  //用于模式切換的標(biāo)志
uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4;                //用于秒表的變量

void main()
{
        Init();                                                                                //中斷初始化
        while(1)                                                                        //死循環(huán)
                {
                        Mode_K1();                                                        //模式掃描
                        switch(K1_bit)                                                 //模式選擇
                                {
                                        case 0:
                                                {
                                                        Display0();                        //顯示時(shí)間                                                               
                                                        break;
                                                }
                                        case 1:
                                                {
                                                        Display1();                         //顯示秒表
                                                        KEY_MiaoBiao();                //掃描秒表操作
                                                        break;
                                                }
                                        case 2:
                                                        {
                                                                Display2();                //設(shè)置時(shí)間時(shí)的顯示程序,可閃爍定位
                                                                KEY_Time_Set();        //掃描按鍵
                                                                break;
                                                        }
                                }
                }
}

void KEY_Time_Set()                                                                   //設(shè)置時(shí)間時(shí)的按鍵掃描函數(shù)
{
        if(K1_bit==2)                                                                  //判斷是否為時(shí)間設(shè)置模式
                {
                        if(K2==0)                                                         //K2有按下(下同)
                                {
                                        Delay(10);                                           //延時(shí)消抖(下同)
                                        if(K2==0)                                         //再次檢測(cè)是否為誤按
                                                {
                                                        if(Set0==0)                        //檢測(cè)是設(shè)置‘時(shí)’還是分,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
                                                                {
                                                                        Minutes++;         //‘分’加1
                                                                        if(Minutes==60)        //當(dāng)'分'加到60時(shí),重新賦值0
                                                                                Minutes=0;
                                                                }
                                                        else
                                                                {
                                                                        Hours++;          //‘時(shí)’加1
                                                                        if(Hours==24)        //當(dāng)'時(shí)'加到24時(shí),重新賦值0
                                                                                Hours=0;
                                                                }
                                                        while(!K2);                        //按鍵松開(kāi)檢測(cè),消除松開(kāi)按鍵時(shí)的抖動(dòng)干擾
                                                }
                                }
                        if(K3==0)
                                {
                                        Delay(10);
                                        if(K3==0)
                                                {
                                                        Set0=~Set0;                        //K3每按一次Set0取反,以確定是設(shè)置‘時(shí)’還是設(shè)置‘分’,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
                                                        while(!K3);
                                                }       
                                }
                }
}

void KEY_MiaoBiao()                                                                //檢測(cè)秒表按鍵操作
{
        if(K1_bit==1)                                                                //判斷是否為秒表模式
                {
                        if(K2==0)
                                {
                                        Delay(10);
                                        if(K2==0)
                                                {
                                                        TR1=~TR1;                        //K2每按一次TR1取反,暫;蜷_(kāi)始定時(shí)器1,達(dá)到暫;蜷_(kāi)始秒表的目的
                                                        while(!K2);
                                                }
                                }
                        if(K3==0)
                                {
                                        Delay(10);
                                        if(K3==0)                                         //當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1
                                                {
                                                        TR1=0;                                 //停止定時(shí)器1
                                                        Miao_Biao0=0;                 //清零數(shù)據(jù)
                                                        Miao_Biao1=0;
                                                        Miao_Biao2=0;
                                                        Miao_Biao3=0;
                                                        Miao_Biao4=0;
                                                        while(!K3);
                                                }
                                }
                }
}

void Mode_K1()                                                                        //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
{
        if(K1==0)
                {
                        Delay(10);
                        if(K1==0)
                                {
                                        K1_bit++;
                                        if(K1_bit==3)
                                                {
                                                        K1_bit=0;
                                                }
                                        while(!K1);
/***********************************************************************
*************當(dāng)K1_bit為0時(shí)顯示時(shí)鐘,為1時(shí)進(jìn)入秒表,*********************
*******************為2時(shí)進(jìn)入時(shí)間設(shè)置模式********************************
***********************************************************************/
                                }
                }
}
       

void Time1() interrupt 3                          //定時(shí)器1函數(shù)
{
        TH1=(65536-50000)/256;                        //重裝初值
        TL1=(65536-50000)%256;

        Miao_Biao0++;
        if(Miao_Biao0==2)                                //以下為秒表數(shù)據(jù)處理
                {
                        Miao_Biao0=0;
                        Miao_Biao1++;                         //Miao_Biao1每加1次為100ms,
                        if(Miao_Biao1==10)
                                {
                                        Miao_Biao1=0;
                                        Miao_Biao2++;
                                        if(Miao_Biao2==60)
                                                {
                                                        Miao_Biao2=0;
                                                        Miao_Biao3++;
                                                        if(Miao_Biao3==60)
                                                                {
                                                                        Miao_Biao3=0;
                                                                        Miao_Biao4++;
                                                                        if(Miao_Biao4==10)
                                                                                Miao_Biao4=0;
                                                                }
                                                }
                                }
                }
}


void Time0() interrupt 1                                         //定時(shí)器0函數(shù)
{
        TH0=(65536-50000)/256;                                           //重裝初值
        TL0=(65536-50000)%256;
        Time0_bit++;
        if((Time0_bit%10)==0)                                        //每溢出10次Time0_bit取反一次
                Set_Time=~Set_Time;                                          //0.5秒閃爍一次

        if(Time0_bit==20)                                                //以下為時(shí)間數(shù)據(jù)處理
                {
                        Time0_bit=0;
                        seconds++;
                        if(seconds==60)
                                {
                                        seconds=0;
                                        Minutes++;
                                        if(Minutes==60)
                                                {
                                                        Minutes=0;
                                                        Hours++;
                                                        if(Hours==24)
                                                                {
                                                                        Hours=0;
                                                                }
                                                }
                                }

                }
}

void Init()                                                         //中斷初始化函數(shù)
{
        EA=1;                                                         //開(kāi)總中斷
        TMOD=0X11;                                                  //定時(shí)器工作方式選擇,定時(shí)器0和定時(shí)器1都選擇第1種工作方式
        TH0=(65536-50000)/256;                        //定時(shí)器0裝初值,定時(shí)50ms
        TL0=(65536-50000)%256;
        ET0=1;                                                        //開(kāi)定時(shí)器0開(kāi)關(guān)
        TR0=1;                                                           //開(kāi)定時(shí)器0小開(kāi)關(guān)

        TH1=(65536-50000)/256;                        //定時(shí)器1裝初值,定時(shí)50ms
        TL1=(65536-50000)%256;
        ET1=1;                                                          //開(kāi)定時(shí)器1開(kāi)關(guān)
        TR1=0;                                                        //關(guān)定時(shí)器1小開(kāi)關(guān)
}

void Display2()                                                        //時(shí)間設(shè)置時(shí)的顯示函數(shù)       
{
        if(Set0==0)                                                        //判斷是否為設(shè)置‘時(shí)’還是‘分’
                {
                        P0=Tab0[seconds%10];                //顯示秒的個(gè)位
                        P1=0xdf;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
               
                        P0=Tab0[seconds/10];                //顯示秒的十位
                        P1=0xef;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
                       
                        if(Set_Time)                                //這個(gè)if語(yǔ)句實(shí)現(xiàn)分鐘以0.5秒的頻率閃爍
                                {
                                        P0=Tab1[Minutes%10];                //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                                        P1=0xf7;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱

                                        P0=Tab0[Minutes/10];                //顯示分的十位
                                        P1=0xfb;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
                                }
                        else
                                {
                                        P0=0x00;                //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                                        P1=0xf7;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
               
                                        P0=0x00;                //顯示分的十位
                                        P1=0xfb;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
                                }
                       
                        P0=Tab1[Hours%10];                        //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                        P1=0xfd;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
               
                        P0=Tab0[Hours/10];                        //顯示時(shí)的十位
                        P1=0xfe;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
                }


        else                        //‘時(shí)’鐘閃爍
                {
                        P0=Tab0[seconds%10];                //顯示秒的個(gè)位
                        P1=0xdf;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
               
                        P0=Tab0[seconds/10];                //顯示秒的十位
                        P1=0xef;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
                       
                        P0=Tab1[Minutes%10];                //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                        P1=0xf7;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱

                        P0=Tab0[Minutes/10];                //顯示分的十位
                        P1=0xfb;                                        //段選
                        Delay(10);                                        //延時(shí)
                        P0=0X00;                                        //消隱
                       
                        if(Set_Time)                                //這個(gè)if語(yǔ)句實(shí)現(xiàn)‘時(shí)’鐘以0.5秒的頻率閃爍
                                {
                                        P0=Tab1[Hours%10];                        //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                                        P1=0xfd;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
                               
                                        P0=Tab0[Hours/10];                        //顯示時(shí)的十位
                                        P1=0xfe;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
                                }
                        else
                                {
                                        P0=0x00;                        //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
                                        P1=0xFF;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱
                               
                                        P0=0X00;                        //顯示時(shí)的十位
                                        P1=0xFF;                                        //段選
                                        Delay(10);                                        //延時(shí)
                                        P0=0X00;                                        //消隱                               
                                }               
                }
}

void Display1()                        //顯示秒表
{
        P0=Tab0[Miao_Biao1%10];                //顯示1/10秒的個(gè)位
        P1=0xdf;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab1[Miao_Biao2%10];                //顯示秒的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
        P1=0xef;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab0[Miao_Biao2/10];                //顯示秒的十位
        P1=0xf7;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab1[Miao_Biao3%10];                //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
        P1=0xfb;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab0[Miao_Biao3/10];                //顯示分的十位
        P1=0xfd;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab1[Miao_Biao4%10];                //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
        P1=0xfe;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱
}

void Display0()                        //顯示時(shí)鐘
{
        P0=Tab0[seconds%10];                //顯示秒的個(gè)位
        P1=0xdf;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab0[seconds/10];                //顯示秒的十位
        P1=0xef;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab1[Minutes%10];                //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
        P1=0xf7;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab0[Minutes/10];                //顯示分的十位
        P1=0xfb;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab1[Hours%10];                        //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
        P1=0xfd;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱

        P0=Tab0[Hours/10];                        //顯示時(shí)的十位
        P1=0xfe;                                        //段選
        Delay(10);                                        //延時(shí)
        P0=0X00;                                        //消隱
}


void Delay(uchar x)                                  //延時(shí)
{
        uchar i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1