新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用51單片機做的電子時鐘

        用51單片機做的電子時鐘

        作者: 時間:2016-11-23 來源:網絡 收藏

        程序如下:
        #include
        unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x76};//字碼表0-9,最后一個是一橫"-"
        unsigned int i,a,b,c,d,flag,flag1;
        unsigned int sec,min,h,nm,nh,nz;
        unsigned int w,day,mon,year;
        int miao1,miao2,miao3;
        sbit keyled=P1^0;
        sbit key2=P1^1;
        sbit keyinc=P1^2;
        sbit keymood=P1^3;
        sbit BEEP=P1^4;
        void second();
        void minute();
        void hour();
        void time();
        void riqi();
        void xianshi();
        void delay10ms();
        void delay20ms();
        void tiaoshi();
        void miaobiao();
        void miaotime();
        void week();
        void naozhong();
        void shengyin();
        //前幾天剛用了下定時器,想起來之前用匯編寫的時鐘程序基本沒有什么功能,所以這幾天就用C再寫了下
        //這個時鐘的功能是模仿我自己的手表寫的,功能完全一樣,有秒表,鬧鐘,可以顯示年月日及星期
        /
        {
        if(min==nm&&h==nh)//時間到了,鬧鐘響
        {
        shengyin(); //鬧鐘的聲音程序
        }
        }
        if(c==0||c==2)
        {
        if(keymood==0)
        {
        miao1=0;
        miao2=0;
        miao3=0;
        }
        }
        while(b==1)//保證按鍵只按一次,沒有重復按鍵
        {tiaoshi();
        goto B1; //如果b還等于1,剛重復掃描秒表界面
        }
        }
        /
        { i=0;//將i清零,保證每次進入都是一樣的
        B2:if(nz==0)
        { if(min==nm&&h==nh)
        {
        shengyin();
        }
        }
        naozhong();
        while(b==2)
        { tiaoshi();
        goto B2;
        }
        }
        /
        { i=1;
        B3:if(nz==0)
        { if(min==nm&&h==nh)
        {
        shengyin();
        }
        }
        xianshi(); //顯示程序,用i的大小來分配,相當于調時、分、秒就顯示時間,調年月日就顯示日期
        while(b==3)
        {tiaoshi();
        goto B3;
        }
        }
        /
        {i=0;
        if(nz==0)
        { if(min==nm&&h==nh)
        {
        shengyin();
        }
        }
        second();
        minute();
        hour();
        }
        if(keyinc==0)
        { delay10ms();
        if(keyinc==0)
        {
        B: riqi();
        while(keyinc==0)
        {
        goto B;
        }
        }
        }
        if(keymood==0)
        {
        delay10ms();
        if(keymood==0)
        {
        N: naozhong();
        }
        while(keymood==0)
        {
        goto N;
        }
        }
        tiaoshi();
        /
        {
        if(flag>10) //在flag>10的時候關閉所有的數碼管,其他時間開啟相應位,這樣就可以達到閃爍的目的了
        {
        P3=0xff;
        }
        else
        {
        P3=0x7f;
        }
        }
        else //如果i不等于1,剛正常顯示,不會閃爍
        {
        P3=0x7f;
        }
        P2=table1[secge];
        for(a=0;a<100;a++);
        if(i==1)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xbf;
        }
        }
        else//如果i不等于1,剛正常顯示,不會閃爍
        {
        P3=0xbf;
        }
        P2=table1[secshi];
        for(a=0;a<100;a++);
        P3=0xdf;
        P2=table1[10];
        for(a=0;a<100;a++);
        }
        //*******************************分顯示程序***************************
        void minute()
        {
        int minge,minshi;
        minge=min%10;
        minshi=min/10;


        if(i==2)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xef;
        }
        }
        else
        {
        P3=0xef;
        }
        P2=table1[minge];
        for(a=0;a<100;a++);

        if(i==2)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xf7;
        }
        }
        else
        {
        P3=0xf7;
        }
        P2=table1[minshi];
        for(a=0;a<100;a++);
        P3=0xfb;
        P2=table1[10];
        for(a=0;a<100;a++);
        }
        //*********************************時顯示程序*************************
        void hour()
        {
        int hourge,hourshi;
        hourge=h%10;
        hourshi=h/10;

        if(i==3)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfd;
        }
        }
        else
        {
        P3=0xfd;
        }
        P2=table1[hourge];
        for(a=0;a<100;a++);
        if(i==3)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfe;
        }
        }
        else
        {
        P3=0xfe;
        }
        P2=table1[hourshi];
        for(a=0;a<100;a++);
        }
        //*****************************年、月、日顯示程序************************
        void riqi()
        {
        int dayge,dayshi;
        int monge,monshi;
        int yearge,yearshi;
        dayge=day%10;
        dayshi=day/10;
        if(i==4)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0x7f;
        }
        }
        else
        {
        P3=0x7f;
        }
        P2=table1[dayge];
        for(a=0;a<100;a++);
        if(i==4)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xbf;
        }
        }
        else
        {
        P3=0xbf;
        }
        P2=table1[dayshi];
        for(a=0;a<100;a++);
        P3=0xdf;
        P2=table1[10];
        for(a=0;a<100;a++);
        monge=mon%10;
        monshi=mon/10;
        if(i==5)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xef;
        }
        }
        else
        {
        P3=0xef;
        }
        P2=table1[monge];
        for(a=0;a<100;a++);
        if(i==5)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xf7;
        }
        }
        else
        {
        P3=0xf7;
        }
        P2=table1[monshi];
        for(a=0;a<100;a++);
        P3=0xfb;
        P2=table1[10];
        for(a=0;a<100;a++);
        yearge=year%10;
        yearshi=year/10;
        if(i==6)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfd;
        }
        }
        else
        {
        P3=0xfd;
        }
        P2=table1[yearge];
        for(a=0;a<100;a++);
        if(i==6)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfe;
        }
        }
        else
        {
        P3=0xfe;
        }
        P2=table1[yearshi];
        for(a=0;a<100;a++);
        }
        //*****************************星期顯示程序****************************
        void week()
        {
        if(i==7)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xef;
        }
        }
        else
        {
        P3=0xef;
        }
        P2=table1[w];
        for(a=0;a<100;a++);
        }
        //*****************************秒表顯示程序************************
        void miaobiao()
        {
        int miao1ge,miao1shi;
        int miao2ge,miao2shi;
        int miao3ge,miao3shi;
        miao1ge=miao1%10;
        miao1shi=miao1/10;
        P3=0x7f;
        P2=table1[miao1ge];
        for(a=0;a<100;a++);
        P3=0xbf;
        P2=table1[miao1shi];
        for(a=0;a<100;a++);
        P3=0xdf;
        P2=table1[10];
        for(a=0;a<100;a++);
        miao2ge=miao2%10;
        miao2shi=miao2/10;
        P3=0xef;
        P2=table1[miao2ge];
        for(a=0;a<100;a++);
        P3=0xf7;
        P2=table1[miao2shi];
        for(a=0;a<100;a++);
        P3=0xfb;
        P2=table1[10];
        for(a=0;a<100;a++);
        miao3ge=miao3%10;
        miao3shi=miao3/10;
        P3=0xfd;
        P2=table1[miao3ge];
        for(a=0;a<100;a++);
        P3=0xfe;
        P2=table1[miao3shi];
        for(a=0;a<100;a++);
        }
        //****************************鬧鐘顯示程序************************
        void naozhong()
        {
        int nmge,nmshi;
        int nhge,nhshi;
        nmge=nm%10;
        nmshi=nm/10;
        if(i==1||i==3||i==5||i==7)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xef;
        }
        }
        else
        {
        P3=0xef;
        }
        P2=table1[nmge];
        for(a=0;a<100;a++);
        if(i==1||i==3||i==5||i==7)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xf7;
        }
        }
        else
        {
        P3=0xf7;
        }
        P2=table1[nmshi];
        for(a=0;a<100;a++);
        P3=0xfb;//顯示一橫
        P2=table1[10];
        for(a=0;a<100;a++);
        nhge=nh%10;
        nhshi=nh/10;
        if(i==2||i==4||i==6)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfd;
        }
        }
        else
        {
        P3=0xfd;
        }
        P2=table1[nhge];
        for(a=0;a<100;a++);
        if(i==2||i==4||i==6)
        {
        if(flag>10)
        {
        P3=0xff;
        }
        else
        {
        P3=0xfe;
        }
        }
        else
        {
        P3=0xfe;
        }
        P2=table1[nhshi];
        for(a=0;a<100;a++);
        P3=0xdf; //顯示H
        P2=table1[11];
        for(a=0;a<100;a++);
        }
        //*******************************調時顯示***********************
        void xianshi()
        {
        if(i>3&&i<7)
        {
        riqi();
        }
        else if(i==7)
        {
        week();
        }
        else
        {
        second();
        minute();
        hour();
        }
        }
        //***********************************鬧鐘聲音程序****************
        void shengyin()
        {
        BEEP=~BEEP;
        for(a=0;a<10;a++);
        }
        //***************************時鐘加1程序*******************************
        void time()
        {
        if(flag==90)
        {
        flag=0;
        sec++;
        if(sec==60)
        {
        sec=0;
        min++;
        if(min==60)
        {
        min=0;
        h++;
        if(h==24)
        {
        h=0;
        day++;
        if(day==31)
        {
        day=0;
        mon++;
        if(mon==12);
        {
        mon=0;
        year++;
        }
        }
        }
        }
        }
        }
        }
        //****************************秒表加1程序****************
        // flag1標志位主要是為秒表而設的
        void miaotime()//秒表加時程序
        {

        if(flag1==1)
        {
        flag1=0;
        miao1++;
        if(miao1==100)
        {
        miao1=0;
        miao2++;
        if(miao2==60)
        {
        miao2=0;
        miao3++;
        if(miao3==60)
        {
        miao3=0;
        }
        }
        }
        }
        }
        //************************調時程序*******************************
        void tiaoshi()//
        {
        if(keyinc==0&&keymood==0)
        {
        delay10ms();
        if(keyinc==0&&keymood==0)
        {
        nz++;
        if(nz==2)
        {
        nz=0;
        }
        }
        while(keyinc==0&&keymood==0);
        }
        //********************
        if(keymood==0)
        {
        delay10ms();
        if(keymood==0)
        {
        i++;
        if(i==8)
        {
        i=1;
        }
        }
        while(keymood==0);
        }
        //******************************
        if(key2==0)
        {
        for(a=0;a<2000;a++);
        if(key2==0)
        {
        b++;
        if(c>0||i>0)//只要調了秒表,再按一次key2鍵就可以退回到正常時間顯示界面
        {
        if(key2==0)
        {
        b=0;
        c=0;
        }
        }
        //***
        if(b==4)
        {
        b=0;
        }
        }

        while(key2==0);
        }
        //****************************************
        //**********
        if(b==2&&(i==1||i==3||i==5||i==7)) //調鬧鐘的分
        {
        if(keyinc==0)
        {
        nm++;
        if(nm==60)
        nm=0;
        }
        while(keyinc==0);
        }
        //
        if(b==2&&(i==2||i==4||i==6))//調鬧鐘的時
        {
        if(keyinc==0)
        {
        nh++;
        if(nh==24)
        {
        nh=0;
        }
        }
        while(keyinc==0);
        }
        //**********************
        if(b==1)
        {
        if(keyinc==0)
        {
        delay10ms();
        if(keyinc==0)
        {
        c++;
        if(c==3)
        {
        c=1;
        }
        }
        while(keyinc==0);
        }
        }

        //*******************************************************
        if(i==1)
        {

        if(keyinc==0)
        {
        delay10ms();
        if(keyinc==0)
        {
        sec=0;
        }
        while(keyinc==0);
        }
        }
        if(i==2&&keyinc==0)
        {
        for(a=0;a<5000;a++);
        if(keyinc==0)
        {
        min++;
        }
        if(min==60)
        {
        min=0;
        }
        delay10ms();
        }
        //***************
        if(i==3&&keyinc==0)
        {
        for(a=0;a<5000;a++);
        if(keyinc==0)
        {
        h++;
        }
        if(h==24)
        {
        h=0;
        }
        while(keyinc==0);
        }
        //******************
        if(i==4&&keyinc==0)
        {
        for(a=0;a<5000;a++);
        if(keyinc==0)
        {
        day++;
        if(day==31)
        {
        day=0;
        }
        }
        while(keyinc==0);
        }
        //
        if(i==5&&keyinc==0)
        {
        for(a=0;a<5000;a++);
        if(keyinc==0)
        {
        mon++;
        if(mon==13)
        {
        mon=0;
        }
        }
        while(keyinc==0);
        }
        //
        if(i==6&&keyinc==0)
        {
        for(a=0;a<5000;a++);
        if(keyinc==0)
        {
        year++;
        }
        while(keyinc==0);
        }
        //
        if(i==7&&keyinc==0)
        {
        delay10ms();
        if(keyinc==0)
        {
        w++;
        }
        while(keyinc==0);
        }
        }
        //*****************************延時程序******************************
        void delay10ms() //延時10MS子程序,在消除鍵盤的抖動
        {
        for(a=0;a<5000;a++);
        }
        //******************************************************
        void delay20ms()//延時20MS,在調時間的時候,按下超過20MS就可以被認為重復按鍵
        {
        for(a=0;a<10000;a++);
        }
        //*******************************中斷服務程序************************
        void timer1() interrupt 3
        {
        TH1=(65535-10000)/256;//計算初值
        TL1=(65535-10000)%256;
        flag++;
        time();
        if((c==1&&i==0)||(c==1&&(i==2||i==4||i==6)))
        {
        flag1++;
        }
        miaotime();
        }
        程序主要功能有時間顯示,秒表,鬧鐘,年月日及星期顯示,基本與一般的電子手表相同。還應該有個燈,按鍵已經畫出來了,程序部分沒有寫,不過比較簡單,就沒有寫了。當然還有一些地方要再改下,像鬧鐘應該還有個懶人模式,關鬧鐘也沒有達到預想的效果,當然鬧鐘的聲音就更不用說了,怎么都調不到手表上的那種清脆的聲音。先這樣,以后再努力!

        本文引用地址:http://www.104case.com/article/201611/320128.htm


        關鍵詞: 51單片機電子時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乳源| 东莞市| 绥棱县| 宜城市| 防城港市| 崇阳县| 镇安县| 依安县| 毕节市| 普洱| 盐山县| 东阳市| 海盐县| 正阳县| 罗甸县| 新津县| 会东县| 蓬溪县| 西峡县| 梁山县| 黑山县| 军事| 武清区| 巴里| 旅游| 桂平市| 吉安县| 天祝| 武义县| 米泉市| 宜阳县| 卢龙县| 高邑县| 即墨市| 泸水县| 孙吴县| 湘潭县| 石渠县| 大邑县| 乌拉特后旗| 武宣县|