新聞中心

        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單片機教程


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


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


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


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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 正蓝旗| 行唐县| 万盛区| 阜南县| 永清县| 宜州市| 宁晋县| 监利县| 芒康县| 阿拉尔市| 施秉县| 西和县| 红河县| 共和县| 格尔木市| 富川| 丽江市| 荣昌县| 含山县| 西乌珠穆沁旗| 阳城县| 酒泉市| 临夏县| 平阴县| 清水县| 都昌县| 府谷县| 郯城县| 内丘县| 许昌市| 贺兰县| 合肥市| 临澧县| 井陉县| 鄂托克旗| 湘阴县| 自贡市| 亚东县| 怀柔区| 绥化市| 信丰县|