1. 程式人生 > >中斷計數器定時器串口通信

中斷計數器定時器串口通信

data inter highlight 介紹 3.2 條件 light 兩個 alt

技術分享圖片

技術分享圖片

1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還http://www是下降沿有效。當CPU檢測到P3.2引腳上出現有效的中斷信號時,中斷標誌IE0(TCON.1)置1,向CPU申請中斷。

2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現有效的中斷信號時,中斷標誌IE1(TCON.3)置1,向CPU申請中斷。

3、TF0(TCON.5),片內定時/計數器T0溢出中斷請求標誌。當定時/計數器T0發生溢出時,置位TF0,並向CPU申請中斷。

CPU對中斷系統所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。

技術分享圖片

EX0(IE.0),外部中斷0允許位;

ET0(IE.1),定時/計數器T0中斷允許位;

EX1(IE.2),外部中斷0允許位;

ET1(IE.3),定時/計數器T1中斷允許位;

ES(IE.4),串行口中斷允許位;

EA (IE.7), CPU中斷允許(總允許)位。

1、TCON的中斷標誌

技術分享圖片

IT0(TCON.0),外部中斷0觸發方式控制位。
當IT0=0時,為電平觸發方式。
當IT0=1時,為邊沿觸發方式(下降沿有效)。
IE0(TCON.1),外部中斷0中斷請求標誌位。
IT1(TCON.2),外部中斷1觸發方式控制位。
IE1(TCON.3),外部中斷1中斷請求標誌位。
TF0(TCON.5),定時/計數器T0溢出中斷請求標誌位。
TF1(TCON.7),定時/計數器T1溢出中斷請求標誌位。

同一優先級中的中斷申請不止一個時,則有中斷優先權排隊問題。同一優先級的中斷優先權排隊,由中斷系統硬件確定的自然優先級形成,其排列如所示:

技術分享圖片

中斷源

技術分享圖片

中斷響應條件
中斷源有中斷請求;
此中斷源的中斷允許位為1;
CPU開中斷(即EA=1)。

以外部中斷0為例:

主程序中需要有以下代碼:
EA=1;//打開總中斷開關
EX0=1;//開外部中斷0
IT0=0/1;//設置外部中斷的觸發方式

中斷服務函數:

void int0 () interrupt 0 using 1
{
do anything that you want
}

技術分享圖片

定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器THx和TLx組成。TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標誌。

技術分享圖片

定時/計數器的控制

51單片機定時/計數器的工作由兩個特殊功能寄存器控制。TMOD用於設置其工作方式;TCON用於控制其啟動和中斷申請。
1、工作方式寄存器TMOD
工作方式寄存器TMOD用於設置定時/計數器的工作方式,低四位用於T0,高四位用於T1。其格式如下:

技術分享圖片

GATE是門控位, GATE=0時,用於控制定時器的啟動是否受外部中斷源信號的影響。只要用軟件使TCON中的TR0或TR1為1,就可以啟動定時/計數器工作;GATA=1時,要用軟件使TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時/計數器工作。即此時定時器的啟動條件,加上了INT0/1引腳為高電平這一條件。
C/T :定時/計數模式選擇位。C/T =0為定時模式;C/T =1為計數模式。
M1M0:工作方式設置位。定時/計數器有四種工作方式。

技術分享圖片

2、控制寄存器TCON
TCON的低4位用於控制外部中斷,已在前面介紹。TCON的高4位用於控
制定時/計數器的啟動和中斷申請。其格式如下:

技術分享圖片

TF1(TCON.7):T1溢出中斷請求標誌位。T1計數溢出時由硬件自動置TF1為1。CPU響應中斷後TF1由硬件自動清0。T1工作時,CPU可隨時查詢TF1的狀態。所以,TF1可用作查詢測試的標誌。TF1也可以用軟件置1或清0,同硬件置1或清0的效果一樣。
TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。
TF0(TCON.5):T0溢出中斷請求標誌位,其功能與TF1類同。
TR0(TCON.4):T0運行控制位,其功能與TR1類同。

定時器模式時有:N=t/ Tcy
計數初值計算的公式為:X=213-N。
定時器的初值還可以采用計數個數直接取補法獲得。
計數模式時,計數脈沖是T0引腳上的外部脈沖。

門控位GATE具有特殊的作用。當GATE=0時,經反相
後使或門輸出為1,此時僅由TR0控制與門的開啟,與門輸出
1時,控制開關接通,計數開始;當GATE=1時,由外中斷引
腳信號控制或門的輸出,此時控制與門的開啟由外中斷引腳
信號和TR0共同控制。當TR0=1時,外中斷引腳信號引腳的
高電平啟動計數,外中斷引腳信號引腳的低電平停止計數。
這種方式常用來測量外中斷引腳上正脈沖的寬度。

定時/計數器的工作方式

1.

計數器初值的計算

機器周期也就是CPU完成一個基本操作所需要的時間。
機器周期=1/單片機的時鐘頻率。
51單片機內部時鐘頻率是外部時鐘的12分頻。也就是說當外部晶振的頻率輸入到單片機裏面的時候要進行12分頻。比如說你用的是12MHZ的晶振,那麽單片機內部的時鐘頻率就是12/12MHZ,當你使用12MHZ的外部晶振的時候。機器周期=1/1M=1us。
而我們定時1ms的初值是多少呢,1ms/1us=1000。也就是要計數1000個數,初值=65535-1000+1(因為實際上計數器計數到66636才溢出)=64536=FC18H

初始化程序應完成如下工作:
對TMOD賦值,以確定T0和T1的工作方式。
計算初值,並將其寫入TH0、TL0或TH1、TL1。
中斷方式時,則對EA賦值,開放定時器中斷。
使TR0或TR1置位,啟動定時/計數器定時或計數

以定時器0模式工作方式1為例:

主程序中需要有以下代碼:

TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器

中斷服務函數:

void Timer0() interrupt 1
{
   static u16 i;
   TH0=0XFC; //給定時器賦初值,定時1ms
   TL0=0X18;
   i++;
   if(i==1000)
    {
      i=0;
      led=~led;
    }
}

中斷計數器定時器串口通信