52單片機(jī)一共有6個中斷源:
52單片機(jī)的中斷級別
單片機(jī)在使用中斷功能時,通常需要設(shè)置兩個與中斷有關(guān)的寄存器:
①中斷允許寄存器IE
②中斷優(yōu)先級寄存器IP
一,中斷允許寄存器 IE
功能:
EA-- 全局中斷允許位
EA=1 打開全局中斷控制,在此條件下,有各個中斷控制位確定相應(yīng)中斷的打開或關(guān)閉
EA=0 關(guān)閉全部中斷
二,定時器/計數(shù)器控制寄存器TCON
ET2 定時器/計數(shù)器2中斷允許位
ET2=1 打開T2中斷
ET2=0 關(guān)閉T2中斷
ES 串行中斷允許位
ET1 定時器1中斷允許位
EX1 外部中斷1允許位
ET0 定時器/計數(shù)器0中斷允許位
ET0 定時器/計數(shù)器0中斷允許位
EX0 外部中斷允許位
二,中斷優(yōu)先級寄存器IP
PS 串行優(yōu)先級控制位
PS=1 串行口中斷定義為高優(yōu)先級中斷
PS=0 串行口中斷定義為低優(yōu)先級中斷
PT1 定時器/計數(shù)器1優(yōu)先級控制位
PX1 外部中斷1中斷優(yōu)先級控制位
PT0 定時器/計數(shù)器0優(yōu)先級控制位
PX0 外部中斷0中斷優(yōu)先級控制位
注意:定時器系統(tǒng)是單片機(jī)內(nèi)部一個獨立的硬件部分,它與CPU和晶振通過內(nèi)部某些控制線連接并相互作用,CPU一旦設(shè)置開始啟動定時功能后,定時器便在晶振的作用下自動開始計時,當(dāng)定時器計數(shù)計滿后,會產(chǎn)生中斷,即通知CPU該如處理。
單片機(jī)在使用定時器/計數(shù)器功能時,通常需要設(shè)置兩個與定時器有關(guān)的寄存器:
①工作方式寄存器TMOD
②控制計數(shù)器TCON
一,工作方式寄存器TMOD
GATE 門控位
GATE=0 定時器/計數(shù)器啟動與停止僅受TCON寄存器中TRX(X=0,1)來控制
GATE=1 定時器/計數(shù)器啟動與停止由TCON寄存器中TRX(X=0,1)和外部中斷引腳(INT0或INT1)上的電平狀態(tài)來共同控制
C/T 定時器模式和計數(shù)器模式選擇位(1為計數(shù)器模式,0為定時器模式)
M1M0 工作方式選擇位
每個定時器有4個工作方式,他們由M1M0設(shè)定
IF1 定時器1溢出標(biāo)志位
TR1 定時器1運行控制位
由軟件清零關(guān)閉定時器1,當(dāng)GATE=1,且INT1為高電平時,TR1置1啟動定時器1;當(dāng)GATE=0時,TR1置1啟動定時器1
IE1 外部中斷1請求標(biāo)志
當(dāng)IT0=1時為電平觸發(fā)方式,每個機(jī)器周期的S5P2采樣INT1引腳,若INT1腳為低電平。則置1,否則IE1清0.
當(dāng)IT1=0時,INT1為跳變沿觸發(fā),當(dāng)?shù)谝粋機(jī)器周期采樣到INT1為低電平時,則IE1置1,便是外部中斷1正向CPU申請中斷,當(dāng)CPU響應(yīng)中斷,轉(zhuǎn)向中斷服務(wù)程序時,該位由硬件清0.
IT1 外部中斷1觸發(fā)方式選擇位
IT1=0 為電平觸發(fā)模式,引腳INT1上低電平有效
IT1=1 為跳變沿觸發(fā)模式,引腳INT1上下降沿有效
IE0 同上
IT0 同上
計算定時器的初值問題
52單片機(jī)內(nèi)部有12倍的分頻,假設(shè)采用的是12MHZ的晶振,那么12個時鐘周期為一個機(jī)器周期,那么此時機(jī)器周期就是1us。以定時器1,工作方式1為例。16位的計數(shù)器
溢出一次需要計數(shù)2^16-1個數(shù)=65536。約為65.5ms
如果要定時50ms的話,(65536-50000)/256 轉(zhuǎn)載到THX
公式:
THX=(65536-50000)/256
LTX =(65536-50000)/256
中斷服務(wù)函數(shù)的寫法:
void 函數(shù)名() interrupt 中斷號 using 工作組
{
中斷服務(wù)程序內(nèi)容
}
定時器的初始化過程如下
①對TMOD賦值,以確定T0和T1的工作方式
②計算初值,并將初值寫入TH0,TL0,或TH1,TL1
③中斷方式,則對IE賦值,開放中斷
④使TR0或TR1置位,啟動定時器/計數(shù)器定時或計數(shù)
程序?qū)嵗?/div>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0X01; //設(shè)置定時器工作方式1(M1M0為01)
TH0(65536-45872)/256; //裝初值11.0592M晶振時為50ms數(shù)為45872
HL0=(65536-45872)%6;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1); //程序停止在這等待中斷發(fā)生
}
void T0_time() interrupt 1
{
TH0(65536-45872)/256; //裝初值11.0592M晶振時為50ms數(shù)為45872
HL0=(65536-45872)%6;
num++;
if(num==20)
{
num=0;
led1=~led1;
}
}