新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 8位數碼管顯示電子時鐘c51單片機程序

        8位數碼管顯示電子時鐘c51單片機程序

        作者: 時間:2012-09-10 來源:網絡 收藏

        /*
        8位 時間格式 05—50—00 標示05點50分00秒
        S1 用于小時加1操作
        S2 用于小時減1操作
        S3 用于分鐘加1操作
        S4 用于分鐘減1操作
        */

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

        #includereg52.h>
        sbit KEY1=P3^0; //定義端口參數
        sbit KEY2=P3^1;
        sbit KEY3=P3^2;
        sbit KEY4=P3^3;
        sbit LED=P1^2; //定義指示燈參數


        code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極管0—9
        unsigned char StrTab[8]; //定義緩沖區
        unsigned char minute=19,hour=23,second; //定義并初始化為 12:30:00


        void delay(unsigned int cnt)
        {
        while(--cnt);
        }

        /******************************************************************/
        /* 處理函數 */
        /******************************************************************/
        void Displaypro(void)
        {

        StrTab[0]=tab[hour/10]; //小時
        StrTab[1]=tab[hour%10];
        StrTab[2]=0x40; //顯示-
        StrTab[3]=tab[minute/10]; //顯示分鐘

        StrTab[4]=tab[minute%10];
        StrTab[5]=0x40; //顯示-
        StrTab[6]=tab[second/10]; //顯示秒

        StrTab[7]=tab[second%10];
        }

        main()
        {
        TMOD |=0x01; //定時器0 10ms inM crystal 用于計時
        TH0=0xd8; //初值
        TL0=0xf0;
        ET0=1;
        TR0=1;

        TMOD |=0x10; //定時器1用于動態掃描
        TH1=0xF8; //初值
        TL1=0xf0;
        ET1=1;
        TR1=1;
        EA =1;
        Displaypro(); //調用顯示處理函數

        while(1)
        {
        if(!KEY1) //按鍵1去抖以及動作
        {
        delay(10000);
        if(!KEY1)
        {
        hour++;

        if(hour==24)

        hour=0; //正常時間 小時 加1
        Displaypro();
        }
        }

        if(!KEY2) //按鍵2去抖以及動作
        {
        delay(10000);
        if(!KEY2)
        {
        hour--;

        if(hour==255)

        hour=23; //正常時間 小時減1
        Displaypro();
        }
        }
        if(!KEY3) //按鍵去抖以及動作
        {
        delay(10000);
        if(!KEY3)
        {
        minute++;

        if(minute==60)

        minute=0; //分加1
        Displaypro();
        }
        }
        if(!KEY4) //按鍵去抖以及動作
        {
        delay(10000);
        if(!KEY4)
        {
        minute--;

        if(minute==255)

        minute=59; //分減1
        Displaypro();
        }
        }
        }
        }


        /******************************************************************/
        /* 定時器1中斷 */
        /******************************************************************/
        void time1_isr(void) interrupt 3 using 0 //定時器1用來動態掃描
        {
        static unsigned char num;
        TH1=0xF8; //重入初值
        TL1=0xf0;

        switch (num)

        {
        case 0:P2=0;P0=StrTab[num];break; //分別調用緩沖區的值進行掃描
        case 1:P2=1;P0=StrTab[num];break;
        case 2:P2=2;P0=StrTab[num];break;
        case 3:P2=3;P0=StrTab[num];break;
        case 4:P2=4;P0=StrTab[num];break;
        case 5:P2=5;P0=StrTab[num];break;
        case 6:P2=6;P0=StrTab[num];break;
        case 7:P2=7;P0=StrTab[num];break;
        default:break;
        }
        num++; //掃描8次,使用8個
        if(num==8)
        num=0;
        }


        /******************************************************************/
        /* 定時器0中斷 */
        /******************************************************************/
        void tim(void) interrupt 1 using 1
        {
        static unsigned char count; //定義內部局部變量

        TH0=0xd8; //重新賦值
        TL0=0xf0;
        count++;
        switch (count)
        {
        case 0:
        case 20:
        case 40:
        case 60:
        case 80:Displaypro();break; //隔一定時間調用顯示處理
        case 50:P1=~P1;break; //半秒 LED 閃爍
        default:break;
        }

        if (count==100)
        {
        count=0;
        second++; //秒加1
        if(second==60)
        {
        second=0;
        minute++; //分加1
        if(minute==60)
        {
        minute=0;
        hour++; //時加1
        if(hour==24)
        hour=0;
        }
        }
        }
        }

        51單片機相關文章:51單片機教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        燃氣報警器相關文章:燃氣報警器原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 三亚市| 开化县| 绿春县| 上饶县| 叙永县| 万载县| 达孜县| 阳谷县| 桑日县| 军事| 南平市| 潍坊市| 益阳市| 井研县| 谢通门县| 称多县| 贡觉县| 陆丰市| 稻城县| 嵩明县| 四会市| 厦门市| 宜兴市| 顺义区| 仁布县| 长岭县| 斗六市| 阳信县| 大兴区| 随州市| 长治县| 武冈市| 崇信县| 新余市| 咸阳市| SHOW| 磐石市| 南阳市| 荃湾区| 乐亭县| 上虞市|