新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機的定時器中斷0

        單片機的定時器中斷0

        作者: 時間:2016-12-01 來源:網絡 收藏
        定時器工作的流程可以按照這個順序(以51為例用定時器0方式一產生50毫秒的定時)
        1、確定使用哪個定時器,使用哪種方式,這一步通過TMOD設置,TMOD的低四位是設置定時器0的,高四位是用來設置定時器1的,其中的M0,M1是用來設置定時器工作在哪種方式,GATE一般用不要設置,C/T是選擇計數模式還是定時模式的,如:TMOD = 0X01,就說明定時器0工作在方式1。
        2、接下來就要設置定時的時間,用定時器定時50毫秒,可以用這種方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以這樣理解:因為這是定時器的初值,也就是說計數脈沖就是在這個數的基礎上向上遞增,到達65535后就溢出產生中斷
        3、第三步就要打開中斷了,使用IE寄存器,我一般是對各個位進行單獨設置,這樣看起來感覺更好,首先打開總中斷EA = 1,這一步是所有中斷所必須的,然后打開定時器0中斷,ET0 =1;
        4、這時準備工作都準備好了就要開始啟動定時器了,使用TCON寄存器,TR0 = 1,到現在為止就實現了一個50毫秒的定時了;
        總結一下:TMOD = 0X01; TH0 = (65535 - 5000) / 256; TL0 = (65535 - 50000) % 256; EA = 1; ET0 = 1; TR0 = 1,至于那個中斷函數我就不寫了,要注意的是方式0 ,1, 3是不能自動重裝的,所以得在中斷函數中重新對TH0 ,TL0賦初值

        TMOD


        TMOD:定時器/計數器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
        定時器/計數器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節尋址,其字節地址為89H。
        其格式為:

        工作原理

        其中低四位(即D0 ~ D3)定義定時器/計數器T0,高四位(即D4 ~ D7)定義定時器/計數器T1。

        Ⅰ,GATE——門控制。

        ●GATE=1時,“與門”的輸出信號K由INTx輸入電平和TRx位的狀態一起決定(即此時K=TRx·INTx),當且僅當TRx=1,INTx=1(高電平)時,計數啟動;否則,計數停止。
        當INT0引腳為高電平時且TR0置位,TR0=1;啟動定時器T0;
        當INT1引腳為高電平時且TR1置位,TR1=1;啟動定時器T1。
        ●GATE=0時,“或門”輸出恒為1,“與門”的輸出信號K由TRx決定(即此時K=TRx),定時器不受INTx輸入電平的影響,由TRx直接控制定時器的啟動和停止。
        當TR0=1,啟動定時器T0。
        當TR1=1,啟動定時器T1。

        Ⅱ,C/T——功能選擇位

        C/T=0時為定時功能: 加1計數器對脈沖f進行計數,每來一個脈沖,計數器加1,直到計時器TFx滿溢出;
        C/T=1時為計數功能: 加1計數器對來自輸入引腳T0(P3.4)和T1(P3.5)的外信號脈沖進行計數,每來一個脈沖,計數器加1,直到計時器TFx滿溢出;

        Ⅲ,M0、M1——方式選擇功能

        MCS-51的定時器T0有4種工作方式:方式0,方式1,方式2,方式3。
        MCS-51的定時器T1有3種工作方式:方式0,方式1,方式2。
        M1
        M0
        工作方式
        功能說明
        0
        0
        方式0
        13位定時器/計數器
        0
        1
        方式1
        16位定時器/計數器
        1
        0
        方式2
        自動重載8位定時器/計數器
        1
        1
        方式3
        T0分為2個8位獨立計數器,T1停止計數

        #include
        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit D1=P2^0;
        uchar num,time;
        uchar wnum=0x00;
        uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選,選擇要顯示的數字
        //uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位數碼管
        void delay(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        {
        for(y=0;y<113;y++)
        {
        }
        }
        }
        void main()
        {
        P1=wnum;
        time=0;
        num=0;
        TMOD=0x01;//設置定時器0為工作方式1
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;//打開中斷總開關
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0
        while(1)
        {
        if(time==20)
        {
        D1=~D1;
        time=0;
        num++;
        num=num%10;
        if(num==10)
        {
        num=0;
        }
        P0=dbit[num];
        }
        }
        }
        void duan() interrupt 1
        {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        time++;
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 中阳县| 邵阳市| 廊坊市| 玉门市| 太仆寺旗| 拉萨市| 永丰县| 阜宁县| 沧源| 黎川县| 益阳市| 建始县| 股票| 舞阳县| 元谋县| 南宁市| 紫阳县| 苍溪县| 茶陵县| 天台县| 盘锦市| 渭源县| 萨迦县| 栖霞市| 四子王旗| 花莲县| 郑州市| 乳源| 弋阳县| 武邑县| 海原县| 仙居县| 宁远县| 四平市| 望城县| 大足县| 定边县| 周至县| 永德县| 临泽县| 当雄县|