新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC89C52-秒表(精確10ms)同時LED二進制計數

        STC89C52-秒表(精確10ms)同時LED二進制計數

        作者: 時間:2016-12-01 來源:網絡 收藏
        #include
        typedef unsigned char uint8;
        typedef unsigned int uint16;
        typedef unsignedlong uint32;
        /*數碼管0到F定義 */
        code uint8 number[] = {0xc0,0xf9,0xa4,0xb0,
        0x99,0x92,0x82,0xf8,
        0x80,0x90,0x88,0x83,
        0xa7,0xa1,0x86,0x8e};
        uint8 a[6];
        uint16 counter1 = 0;
        uint8 counter = 0;
        sbit ENLED = P1^4;
        sbit ADDR0 = P1^0;
        sbit ADDR1 = P1^1;
        sbit ADDR2 = P1^2;
        sbit ADDR3 = P1^3;
        /*定時器1初始化,并定時1ms*/
        void timer1_init()
        {
        TMOD |= 0x10;
        TMOD &= 0xdf;
        TH1 = 0xFC;
        TL1 = 0x67;
        TR1 = 1;
        }
        /*中斷初始化*/
        void int_init()
        {
        ET1 = 1;
        EA = 1;
        }
        /*刷新數碼管*/
        void refresh_led()
        {
        static uint8 j = 0;
        uint8 b = number[a[2]] - 0x80 ;

        switch(j)
        {
        case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;P0 = number[a[0]];break;
        case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;P0 = number[a[1]];break;
        case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;P0 = b;break;
        case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;P0 = number[a[3]];break;
        case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;P0 = number[a[4]];break;
        case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;P0 = number[a[5]];break;
        default: break;
        }
        if(7 == j++) j = 0;
        }
        main()
        {
        ENLED = 0; ADDR3 = 1;
        timer1_init();
        int_init();
        while(1);

        }
        /*中斷函數*/
        void interrupt_timer1() interrupt 3
        {
        static uint32 sec = 0;
        TH1 = 0xFC;
        TL1 = 0x66;
        counter++;
        if(counter == 10)
        {
        sec++;
        counter = 0;
        a[0] = sec%10;
        a[1] = sec/10%10;
        a[2] = sec/100%10;
        a[3] = sec/1000%10;
        a[4] = sec/10000%10;
        a[5] = sec/100000%10;
        if(sec%100 == 0) counter1++; //LED時間1s
        if(counter1 == 256) counter1 = 0;
        }
        if(counter == 9)
        {ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;P0 = ~counter1 ;}
        refresh_led();

        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 民和| 漾濞| 邹平县| 鄯善县| 哈尔滨市| 隆尧县| 芦溪县| 扶风县| 德清县| 古浪县| 阿鲁科尔沁旗| 温州市| 新田县| 舞钢市| 汝州市| 邓州市| 永安市| 泗水县| 都昌县| 通榆县| 东平县| 承德市| 石渠县| 祁东县| 阳信县| 普洱| 丹凤县| 东山县| 元朗区| 巫溪县| 望都县| 夏邑县| 陇川县| 海兴县| 海阳市| 济源市| 开阳县| 卓尼县| 迁西县| 衡水市| 安泽县|