• 專注電子技術學習與研究
    當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

    52單片機中斷

    作者:程序那些事   來源:程序那些事   點擊數:  更新時間:2014年08月03日   【字體:

    52單片機一共有6個中斷源:

     INTO0--外部中斷0,由P3.2端口線引入,低電平或下降沿引起。
     INTO1--外部中斷1,有P3.3端口線引入,低電平或下降沿引起。
     T0--定時器/計數器0中斷,由T0計數器計滿回零引起。
     T1--定時器/計數器1中斷,由T1計數器計滿回零引起。
     T2--定時器/計數器2中斷,由T2計數器計滿回零引起。
     TI/RI--串口中斷,串行端口完成一幀字符發送/接收后引起。
     
    52單片機的中斷級別
     
    單片機在使用中斷功能時,通常需要設置兩個與中斷有關的寄存器:
    ①中斷允許寄存器IE
    ②中斷優先級寄存器IP
    一,中斷允許寄存器 IE

    功能:

    EA-- 全局中斷允許位
    EA=1 打開全局中斷控制,在此條件下,有各個中斷控制位確定相應中斷的打開或關閉
    EA=0 關閉全部中斷
    ET2  定時器/計數器2中斷允許位
    ET2=1   打開T2中斷
    ET2=0 關閉T2中斷
     
    ES 串行中斷允許位
    ET1 定時器1中斷允許位
    EX1 外部中斷1允許位
    ET0 定時器/計數器0中斷允許位
    EX0 外部中斷允許位
     
    二,中斷優先級寄存器IP

    PS 串行優先級控制位
    PS=1 串行口中斷定義為高優先級中斷
    PS=0 串行口中斷定義為低優先級中斷
    PT1 定時器/計數器1優先級控制位
    PX1 外部中斷1中斷優先級控制位
    PT0 定時器/計數器0優先級控制位
    PX0 外部中斷0中斷優先級控制位
     
    注意:定時器系統是單片機內部一個獨立的硬件部分,它與CPU和晶振通過內部某些控制線連接并相互作用,CPU一旦設置開始啟動定時功能后,定時器便在晶振的作用下自動開始計時,當定時器計數計滿后,會產生中斷,即通知CPU該如處理。
     
    單片機在使用定時器/計數器功能時,通常需要設置兩個與定時器有關的寄存器:
    ①工作方式寄存器TMOD
    ②控制計數器TCON
    一,工作方式寄存器TMOD
     
    GATE 門控位
    GATE=0 定時器/計數器啟動與停止僅受TCON寄存器中TRX(X=0,1)來控制
    GATE=1 定時器/計數器啟動與停止由TCON寄存器中TRX(X=0,1)和外部中斷引腳(INT0或INT1)上的電平狀態來共同控制
    C/T 定時器模式和計數器模式選擇位(1為計數器模式,0為定時器模式)
    M1M0 工作方式選擇位
     
    每個定時器有4個工作方式,他們由M1M0設定
     
    二,定時器/計數器控制寄存器TCON

     

    IF1   定時器1溢出標志位
    TR1  定時器1運行控制位
    由軟件清零關閉定時器1,當GATE=1,且INT1為高電平時,TR1置1啟動定時器1;當GATE=0時,TR1置1啟動定時器1
    IE1  外部中斷1請求標志
    當IT0=1時為電平觸發方式,每個機器周期的S5P2采樣INT1引腳,若INT1腳為低電平。則置1,否則IE1清0.
    當IT1=0時,INT1為跳變沿觸發,當第一個機器周期采樣到INT1為低電平時,則IE1置1,便是外部中斷1正向CPU申請中斷,當CPU響應中斷,轉向中斷服務程序時,該位由硬件清0.
    IT1   外部中斷1觸發方式選擇位
    IT1=0  為電平觸發模式,引腳INT1上低電平有效
    IT1=1 為跳變沿觸發模式,引腳INT1上下降沿有效
    IE0 同上
    IT0 同上
     
    計算定時器的初值問題
    52單片機內部有12倍的分頻,假設采用的是12MHZ的晶振,那么12個時鐘周期為一個機器周期,那么此時機器周期就是1us。以定時器1,工作方式1為例。16位的計數器
    溢出一次需要計數2^16-1個數=65536。約為65.5ms
    如果要定時50ms的話,(65536-50000)/256 轉載到THX
         (65536-50000)/256 轉載到TLX
    公式:
    THX=(65536-50000)/256
    LTX =(65536-50000)/256
     
    中斷服務函數的寫法:
    void 函數名() interrupt 中斷號 using 工作組
    {
    中斷服務程序內容
    }
     
    定時器的初始化過程如下
    ①對TMOD賦值,以確定T0和T1的工作方式
    ②計算初值,并將初值寫入TH0,TL0,或TH1,TL1
    ③中斷方式,則對IE賦值,開放中斷
    ④使TR0或TR1置位,啟動定時器/計數器定時或計數
     
    程序實例
    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int 
    sbit led1=P1^0;
    uchar num;
    void main()
    {
    TMOD=0X01; //設置定時器工作方式1(M1M0為01)
    TH0(65536-45872)/256; //裝初值11.0592M晶振時為50ms數為45872
    HL0=(65536-45872)%6;
    EA=1; //開總中斷
    ET0=1; //開定時器0中斷
    TR0=1; //啟動定時器0
    while(1); //程序停止在這等待中斷發生
    }
    void T0_time() interrupt 1
    {
    TH0(65536-45872)/256; //裝初值11.0592M晶振時為50ms數為45872
    HL0=(65536-45872)%6;
    num++;
    if(num==20)
    {
    num=0;
    led1=~led1;
    }
    }
    關閉窗口

    相關文章

    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的