新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 定時計數器T0作定時應用技術(一)

        定時計數器T0作定時應用技術(一)

        作者: 時間:2011-02-27 來源:網絡 收藏

        1.實驗任務

        AT89S51的定時/計數器T0產生一秒的定時時間,作為秒計數時間,當一秒產生時,秒計數加1,秒計數到60時,自動從0開始。硬件電路如下圖所示

        2.電路原理圖

        4.15.1

        3.系統板上硬件連線

        (1. 把“系統”區域中的P0.0/AD0P0.7/AD7端口用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個ah端口上;要求:P0.0/AD0對應著aP0.1/AD1對應著b……P0.7/AD7對應著h

        (2. 把“系統”區域中的P2.0/A8P2.7/A15端口用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個ah端口上;要求:P2.0/A8對應著aP2.1/A9對應著b……P2.7/A15對應著h

        4.程序設計內容

        AT89S51單片機的內部16位定時/計數器是一個可編程定時/計數器,它既可以工作在13位定時方式,也可以工作在16位定時方式和8位定時方式。只要通過設置特殊功能寄存器TMOD,即可完成。定時/計數器何時工作也是通過軟件來設定TCON特殊功能寄存器來完成的。

        現在我們選擇16位定時工作方式,對于T0來說,最大定時也只有65536us,即65.536ms,無法達到我們所需要的1秒的定時,因此,我們必須通過軟件來處理這個問題,假設我們取T0的最大定時為50ms,即要定時1秒需要經過20次的50ms的定時。對于這20次我們就可以采用軟件的方法來統計了。

        因此,我們設定TMOD00000001B,即TMOD01H

        下面我們要給T0定時/計數器的TH0TL0裝入預置初值,通過下面的公式可以計算出

        TH0=(21650000/ 256

        TL0=(21650000MOD 256

        T0在工作的時候,我們如何得知50ms的定時時間已到,這回我們通過檢測TCON特殊功能寄存器中的TF0標志位,如果TF01表示定時時間已到。

        5.程序框圖

        4.15.2

        6.匯編源程序(查詢法)

        SECOND EQU 30H

        TCOUNT EQU 31H

        ORG 00H

        START: MOV SECOND,#00H

        MOV TCOUNT,#00H

        MOV TMOD,#01H

        MOV TH0,#(65536-50000) / 256

        MOV TL0,#(65536-50000) MOD 256

        SETB TR0

        DISP: MOV A,SECOND

        MOV B,#10

        DIV AB

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        MOV A,B

        MOVC A,@A+DPTR

        MOV P2,A

        WAIT: JNB TF0,WAIT

        CLR TF0

        MOV TH0,#(65536-50000) / 256

        MOV TL0,#(65536-50000) MOD 256

        INC TCOUNT

        MOV A,TCOUNT

        CJNE A,#20,NEXT

        MOV TCOUNT,#00H

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NEX

        MOV SECOND,#00H

        NEX: LJMP DISP

        NEXT: LJMP WAIT

        TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

        END

        7.C語言源程序(查詢法)

        #include AT89X51.H>

        unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

        0x66,0x6d,0x7d,0x07,

        0x7f,0x6f,0x77,0x7c,

        0x39,0x5e,0x79,0x71,0x00};

        unsigned char second;

        unsigned char tcount;

        void main(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. 匯編源程序(中斷法)

        SECOND EQU 30H

        TCOUNT EQU 31H

        ORG 00H

        LJMP START

        ORG 0BH

        LJMP INT0X

        START: MOV SECOND,#00H

        MOV A,SECOND

        MOV B,#10

        DIV AB

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        MOV A,B

        MOVC A,@A+DPTR

        MOV P2,A

        MOV TCOUNT,#00H

        MOV TMOD,#01H

        MOV TH0,#(65536-50000) / 256

        MOV TL0,#(65536-50000) MOD 256

        SETB TR0

        SETB ET0

        SETB EA

        SJMP $

        INT0X:

        MOV TH0,#(65536-50000) / 256

        MOV TL0,#(65536-50000) MOD 256

        INC TCOUNT

        MOV A,TCOUNT

        CJNE A,#20,NEXT

        MOV TCOUNT,#00H

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NEX

        MOV SECOND,#00H

        NEX: MOV A,SECOND

        MOV B,#10

        DIV AB

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        MOV A,B

        MOVC A,@A+DPTR

        MOV P2,A

        NEXT: RETI

        TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

        END

        2. C語言源程序(中斷法)

        #include AT89X51.H>

        unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

        0x66,0x6d,0x7d,0x07,

        0x7f,0x6f,0x77,0x7c,

        0x39,0x5e,0x79,0x71,0x00};

        unsigned char second;

        unsigned char tcount;

        void main(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);

        }

        void t0(void) interrupt 1 using 0

        {

        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;

        }

        塵埃粒子計數器相關文章:塵埃粒子計數器原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黑龙江省| 临西县| 临城县| 涞源县| 长春市| 德江县| 惠安县| 仲巴县| 福建省| 黄陵县| 牙克石市| 耒阳市| 玉林市| 麦盖提县| 辛集市| 伊金霍洛旗| 定日县| 喜德县| 名山县| 扶绥县| 招远市| 新郑市| 英德市| 汝州市| 天津市| 关岭| 凭祥市| 灌南县| 前郭尔| 武鸣县| 辉南县| 丹巴县| 通化市| 义马市| 平凉市| 清水河县| 大理市| 香河县| 梁山县| 大邑县| 曲松县|