新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 15. 定時(shí)計(jì)數(shù)器T0作定時(shí)應(yīng)用技術(shù)(一)

        15. 定時(shí)計(jì)數(shù)器T0作定時(shí)應(yīng)用技術(shù)(一)

        作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
        1.實(shí)驗(yàn)任務(wù)
        用AT89S51單片機(jī)的定時(shí)/計(jì)數(shù)器T0產(chǎn)生一秒的定時(shí)時(shí)間,作為秒計(jì)數(shù)時(shí)間,當(dāng)一秒產(chǎn)生時(shí),秒計(jì)數(shù)加1,秒計(jì)數(shù)到60時(shí),自動(dòng)從0開始。硬件電路如下圖所示
        2.電路原理

        圖4.15.1
        3.系統(tǒng)板上硬件連線
        (1.把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P0.0/AD0對(duì)應(yīng)著a,P0.1/AD1對(duì)應(yīng)著b,……,P0.7/AD7對(duì)應(yīng)著h。
        (2.把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P2.0/A8對(duì)應(yīng)著a,P2.1/A9對(duì)應(yīng)著b,……,P2.7/A15對(duì)應(yīng)著h。
        4.程序設(shè)計(jì)內(nèi)容
        AT89S51單片機(jī)的內(nèi)部16位定時(shí)/計(jì)數(shù)器是一個(gè)可編程定時(shí)/計(jì)數(shù)器,它既可以工作在13位定時(shí)方式,也可以工作在16位定時(shí)方式和8位定時(shí)方式。只要通過設(shè)置特殊功能寄存器TMOD,即可完成。定時(shí)/計(jì)數(shù)器何時(shí)工作也是通過軟件來設(shè)定TCON特殊功能寄存器來完成的。
        現(xiàn)在我們選擇16位定時(shí)工作方式,對(duì)于T0來說,最大定時(shí)也只有65536us,即65.536ms,無法達(dá)到我們所需要的1秒的定時(shí),因此,我們必須通過軟件來處理這個(gè)問題,假設(shè)我們?nèi)0的最大定時(shí)為50ms,即要定時(shí)1秒需要經(jīng)過20次的50ms的定時(shí)。對(duì)于這20次我們就可以采用軟件的方法來統(tǒng)計(jì)了。
        因此,我們?cè)O(shè)定TMOD=00000001B,即TMOD=01H
        下面我們要給T0定時(shí)/計(jì)數(shù)器的TH0,TL0裝入預(yù)置初值,通過下面的公式可以計(jì)算出
        TH0=(216-50000)/256
        TL0=(216-50000)MOD256
        當(dāng)T0在工作的時(shí)候,我們?nèi)绾蔚弥?0ms的定時(shí)時(shí)間已到,這回我們通過檢測(cè)TCON特殊功能寄存器中的TF0標(biāo)志位,如果TF0=1表示定時(shí)時(shí)間已到。
        5.程序框圖
















        圖4.15.2
        6.匯編源程序(查詢法)
        SECONDEQU30H
        TCOUNTEQU31H
        ORG00H
        START:MOVSECOND,#00H
        MOVTCOUNT,#00H
        MOVTMOD,#01H
        MOVTH0,#(65536-50000)/256
        MOVTL0,#(65536-50000)MOD256
        SETBTR0
        DISP:MOVA,SECOND
        MOVB,#10
        DIVAB
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,B
        MOVCA,@A+DPTR
        MOVP2,A
        WAIT:JNBTF0,WAIT
        CLRTF0
        MOVTH0,#(65536-50000)/256
        MOVTL0,#(65536-50000)MOD256
        INCTCOUNT
        MOVA,TCOUNT
        CJNEA,#20,NEXT
        MOVTCOUNT,#00H
        INCSECOND
        MOVA,SECOND
        CJNEA,#60,NEX
        MOVSECOND,#00H
        NEX:LJMPDISP
        NEXT:LJMPWAIT
        TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
        END
        7.C語言源程序(查詢法)
        #include

        unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x00};
        unsignedcharsecond;
        unsignedchartcount;

        voidmain(void)
        {
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        tcount=0;
        second=0;
        P0=dispcode[second/10];
        P2=dispcode[second%10];
        while(1)
        {
        if(TF0==1)
        {
        tcount++;
        if(tcount==20)
        {
        tcount=0;
        second++;
        if(second==60)
        {
        second=0;
        }
        P0=dispcode[second/10];
        P2=dispcode[second%10];
        }
        TF0=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        }
        }
        }
        1.匯編源程序(中斷法)
        SECONDEQU30H
        TCOUNTEQU31H
        ORG00H
        LJMPSTART
        ORG0BH
        LJMPINT0X
        START:MOVSECOND,#00H
        MOVA,SECOND
        MOVB,#10
        DIVAB
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,B
        MOVCA,@A+DPTR
        MOVP2,A
        MOVTCOUNT,#00H
        MOVTMOD,#01H
        MOVTH0,#(65536-50000)/256
        MOVTL0,#(65536-50000)MOD256
        SETBTR0
        SETBET0
        SETBEA
        SJMP$
        INT0X:
        MOVTH0,#(65536-50000)/256
        MOVTL0,#(65536-50000)MOD256
        INCTCOUNT
        MOVA,TCOUNT
        CJNEA,#20,NEXT
        MOVTCOUNT,#00H
        INCSECOND
        MOVA,SECOND
        CJNEA,#60,NEX
        MOVSECOND,#00H
        NEX:MOVA,SECOND
        MOVB,#10
        DIVAB
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,B
        MOVCA,@A+DPTR
        MOVP2,A
        NEXT:RETI

        TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
        END
        2.C語言源程序(中斷法)
        #include

        unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x00};
        unsignedcharsecond;
        unsignedchartcount;

        voidmain(void)
        {
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        ET0=1;
        EA=1;
        tcount=0;
        second=0;
        P0=dispcode[second/10];
        P2=dispcode[second%10];
        while(1);
        }

        voidt0(void)interrupt1using0
        {
        tcount++;
        if(tcount==20)
        {
        tcount=0;
        second++;
        if(second==60)
        {
        second=0;
        }
        P0=dispcode[second/10];
        P2=dispcode[second%10];
        }
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        }


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 永城市| 农安县| 宁海县| 得荣县| 光山县| 游戏| 洪泽县| 云林县| 宝清县| 大关县| 阿尔山市| 定结县| 藁城市| 塘沽区| 来安县| 连云港市| 乐平市| 海阳市| 昌图县| 股票| 重庆市| 类乌齐县| 武城县| 万全县| 腾冲县| 罗平县| 海宁市| 西安市| 尉氏县| 本溪| 芜湖市| 壤塘县| 建阳市| 凤庆县| 奇台县| 威宁| 本溪市| 嘉善县| 临清市| 宜章县| 民权县|