找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 58311|回復(fù): 33
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)中斷系統(tǒng)詳解(定時(shí)器、計(jì)數(shù)器)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:191393 發(fā)表于 2018-11-4 16:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51單片機(jī)中斷級(jí)別
中斷源
默認(rèn)中斷級(jí)別
序號(hào)(C語言用)
INT0---外部中斷0
最高
0
T0---定時(shí)器/計(jì)數(shù)器0中斷
2
1
INT1---外部中斷1
3
2
T1----定時(shí)器/計(jì)數(shù)器1中斷
4
3
TX/RX---串行口中斷
5
4
T2---定時(shí)器/計(jì)數(shù)器2中斷
最低
5
中斷允許寄存器IE
位序號(hào)
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
符號(hào)位
EA
-------
ET2
ES
ET1
EX1
ET0
EX0
EA---全局中允許位。
EA=1,打開全局中斷控制,在此條件下,由各個(gè)中斷控制位確定相應(yīng)中斷的打開或關(guān)閉。
EA=0,關(guān)閉全部中斷。
-------,無效位。
ET2---定時(shí)器/計(jì)數(shù)器2中斷允許位。 EA總中斷開關(guān),置1為開;
ET2=1,打開T2中斷。 EX0為外部中斷0INT0)開關(guān),……
ET2=0,關(guān)閉T2中斷。 ET0為定時(shí)器/計(jì)數(shù)器0T0)開關(guān),……
ES---串行口中斷允許位。 EX1為外部中斷1INT1)開關(guān),……
ES=1,打開串行口中斷。 ET1為定時(shí)器/計(jì)數(shù)器1T1)開關(guān),……
ES=0,關(guān)閉串行口中斷。 ES為串行口(TX/RX)中斷開關(guān),……
ET1---定時(shí)器/計(jì)數(shù)器1中斷允許位。 ET2為定時(shí)器/計(jì)數(shù)器2T2)開關(guān),……
ET1=1,打開T1中斷。
ET1=0,關(guān)閉T1中斷。
EX1---外部中斷1中斷允許位。
EX1=1,打開外部中斷1中斷。
EX1=0,關(guān)閉外部中斷1中斷。
ET0---定時(shí)器/計(jì)數(shù)器0中斷允許位。
ET0=1,打開T0中斷。
ET0=0,關(guān)閉T0中斷。
EX0---外部中斷0中斷允許位。
EX0=1,打開外部中斷0中斷。
EX0=0,關(guān)閉外部中斷0中斷。
中斷優(yōu)先級(jí)寄存器IP
位序號(hào)
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
位地址
---
---
---
PS
PT1
PX1
PT0
PX0
-------,無效位。
PS---串行口中斷優(yōu)先級(jí)控制位。
PS=1,串行口中斷定義為高優(yōu)先級(jí)中斷。
PS=0,串行口中斷定義為低優(yōu)先級(jí)中斷。
PT1---定時(shí)器/計(jì)數(shù)器1中斷優(yōu)先級(jí)控制位。
PT1=1,定時(shí)器/計(jì)數(shù)器1中斷定義為高優(yōu)先級(jí)中斷。
PT1=0,定時(shí)器/計(jì)數(shù)器1中斷定義為低優(yōu)先級(jí)中斷。
PX1---外部中斷1中斷優(yōu)先級(jí)控制位。
PX1=1,外部中斷1中斷定義為高優(yōu)先級(jí)中斷。
PX1=0,外部中斷1中斷定義為低優(yōu)先級(jí)中斷。
PT0---定時(shí)器/計(jì)數(shù)器0中斷優(yōu)先級(jí)控制位。
PT0=1,定時(shí)器/計(jì)數(shù)器0中斷定義為高優(yōu)先級(jí)中斷。
PT0=0,定時(shí)器/計(jì)數(shù)器0中斷定義為低優(yōu)先級(jí)中斷。
PX0---外部中斷0中斷優(yōu)先級(jí)控制位。
PX0=1,外部中斷0中斷定義為高優(yōu)先級(jí)中斷。
PX0=0,外部中斷0中斷定義為低優(yōu)先級(jí)中斷。
定時(shí)器/計(jì)數(shù)器工作模式寄存器TMOD
位序號(hào)
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
位符號(hào)
GATE
C/T
M1
M0
GATE
C/T
M1
M0
|-----------------定時(shí)器1------------------------|--------------------定時(shí)器0----------------------|
GATE---門控制位。
GATE=0,定時(shí)器/計(jì)數(shù)器啟動(dòng)與停止僅受TCON寄存器中TRX(X=0,1)來控制。
GATE=1,定時(shí)器計(jì)數(shù)器啟動(dòng)與停止由TCON寄存器中TRX(X=0,1)和外部中斷引腳(INT0INT1)上的電平狀態(tài)來共同控制。
C/T---定時(shí)器和計(jì)數(shù)器模式選擇位。
C/T=1,為計(jì)數(shù)器模式;C/T=0,為定時(shí)器模式。
M1M0---工作模式選擇位。
M1
M0
工作模式
0
0
方式0,為13位定時(shí)器/計(jì)數(shù)器
0
1
方式1,為16位定時(shí)器/計(jì)數(shù)器
1
0
方式28位初值自動(dòng)重裝的8位定時(shí)器/計(jì)數(shù)器
1
1
方式3,僅適用于T0,分成兩個(gè)8位計(jì)數(shù)器,T1停止工作
定時(shí)器/控制器控制寄存器TCON
位序號(hào)
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
符號(hào)位
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TF1---定時(shí)器1溢出標(biāo)志位。
當(dāng)定時(shí)器1記滿溢出時(shí),由硬件使TF11,并且申請(qǐng)中斷。進(jìn)入中斷服務(wù)程序后,由硬件自動(dòng)清0。需要注意的是,如果使用定時(shí)器中斷,那么該位完全不用人為去操作,但是如果使用軟件查詢方式的話,當(dāng)查詢到該位置1后,就需要用軟件清0。
TR1---定時(shí)器1運(yùn)行控制位。
由軟件清0關(guān)閉定時(shí)器1。當(dāng)GATE=1,且INIT為高電平時(shí),TR11啟動(dòng)定時(shí)器1;當(dāng)GATE=0時(shí),TR11啟動(dòng)定時(shí)器1。
TF0---定時(shí)器0溢出標(biāo)志,其功能及其操作方法同TF1
TR0---定時(shí)器0運(yùn)行控制位,其功能及操作方法同TR1。
IE1---外部中斷1請(qǐng)求標(biāo)志。
當(dāng)IT1=0時(shí),位電平觸發(fā)方式,每個(gè)機(jī)器周期的S5P2采樣INT1引腳,若NIT1腳為定電平,則置1,否則IE10。
當(dāng)IT1=1時(shí),INT1為跳變沿觸發(fā)方式,當(dāng)?shù)谝粋(gè)及其機(jī)器周期采樣到INIT1為低電平時(shí),則IE11IE1=1,表示外部中斷1正向CPU中斷申請(qǐng)。當(dāng)CPU響應(yīng)中斷,轉(zhuǎn)向中斷服務(wù)程序時(shí),該位由硬件清0。
IT1外部中斷1觸發(fā)方式選擇位。
IT1=0,為電平觸發(fā)方式,引腳INT1上低電平有效。
IT1=1,為跳變沿觸發(fā)方式,引腳INT1上的電平從高到低的負(fù)跳變有效。
IE0---外部中斷0請(qǐng)求標(biāo)志,其功能及操作方法同IE1。
IT0---外部中斷0觸發(fā)方式選擇位,其功能及操作方法同IT1
從上面的知識(shí)點(diǎn)可知,每個(gè)定時(shí)器都有4種工作模式,可通過設(shè)置TMOD寄存器中的M1M0位來進(jìn)行工作方式選擇。
方式1的計(jì)數(shù)位數(shù)是16位,對(duì)T0來說,由TL0寄存器作為低8、TH0寄存器作為高8位,組成了16位加1計(jì)數(shù)器。
關(guān)于如何確定定時(shí)器T0的初值問題定時(shí)器一但啟動(dòng),它便在原來的數(shù)值上開始加1計(jì)數(shù),若在程序開始時(shí),我們沒有設(shè)置TH0TL0,它們的默認(rèn)值都是0,假設(shè)時(shí)鐘頻率為12MHz,12個(gè)時(shí)鐘周期為一個(gè)機(jī)器周期,那么此時(shí)機(jī)器周期為1us,記滿TH0TL0就需要216 -1個(gè)數(shù),再來一個(gè)脈沖計(jì)數(shù)器溢出,隨即向CPU申請(qǐng)中斷。因此溢出一次共需65536us,約等于65.6ms,如果我們要定時(shí)50ms的話,那么就需要先給TH0TL0裝一個(gè)初值,在這個(gè)初值的基礎(chǔ)上記50000個(gè)數(shù)后,定時(shí)器溢出,此時(shí)剛好就是50ms中斷一次,當(dāng)需要定時(shí)1s時(shí),我們寫程序時(shí)當(dāng)產(chǎn)生2050ms的定時(shí)器中斷后便認(rèn)為是1s,這樣便可精確控制定時(shí)時(shí)間啦。要計(jì)50000個(gè)數(shù)時(shí),TH0TL0中應(yīng)該裝入的總數(shù)是65536-50000=15536.,把15536對(duì)256求模:15536/256=60裝入TH0中,把15536對(duì)256求余:15536/256=176裝入TL0中。
以上就是定時(shí)器初值的計(jì)算法,總結(jié)后得出如下結(jié)論:當(dāng)用定時(shí)器的方式1時(shí),設(shè)機(jī)器周期為TCY,定時(shí)器產(chǎn)生一次中斷的時(shí)間為t,那么需要計(jì)數(shù)的個(gè)數(shù)為N=t/TCY ,裝入THXTLX中的數(shù)分別為:
THX=(65536-N)/256 , TLX=(65536-N)%256 <x為01>
中斷服務(wù)程序的寫法
void 函數(shù)名()interrupt 中斷號(hào) using 工作組
{
中斷服務(wù)程序內(nèi)容
}
在寫單片機(jī)的定時(shí)器程序時(shí),在程序開始處需要對(duì)定時(shí)器及中斷寄存器做初始化設(shè)置,通常定時(shí)器初始化過程如下:
1)對(duì)TMOD賦值,以確定T0 T1的工作方式。
2)計(jì)算初值,并將初值寫入TH0、TL0TH1、TL1。
3)中斷方式時(shí),則對(duì)IE賦值,開放中斷。
4)使TR0TR1置位,啟動(dòng)定時(shí)器/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
例:利用定時(shí)器0工作方式1,實(shí)現(xiàn)一個(gè)發(fā)光管以1s亮滅閃爍。
程序代碼如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0x01; //設(shè)置定時(shí)器0位工作模式1M1,M00,1
TH0=(65536-45872)/256; //裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
TL0=(65536-45872)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1; //啟動(dòng)定時(shí)器0
while(1)
{
if(num==20) //如果到了20次,說明1秒時(shí)間
{
led1=~led1; //讓發(fā)光管狀態(tài)取反
num=0;
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256; //重新裝載初值
TL0=(65536-45872)%256;
num++;
}


完整的Word格式文檔51黑下載地址:
中斷1.docx (27.98 KB, 下載次數(shù): 359)


評(píng)分

參與人數(shù) 2黑幣 +52 收起 理由
yun764585754 + 2 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏34 分享淘帖 頂5 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:477508 發(fā)表于 2019-4-2 19:51 | 只看該作者
verygood
回復(fù)

使用道具 舉報(bào)

板凳
ID:156220 發(fā)表于 2019-4-3 08:44 | 只看該作者
這個(gè)資料找了很久,謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:527630 發(fā)表于 2019-5-5 14:11 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報(bào)

5#
ID:525734 發(fā)表于 2019-5-13 20:53 | 只看該作者
理解了 很有用
回復(fù)

使用道具 舉報(bào)

6#
ID:423971 發(fā)表于 2019-6-10 18:33 | 只看該作者
可以設(shè)置中斷優(yōu)先級(jí)  使外部中斷1中斷外部中斷0嘛?
回復(fù)

使用道具 舉報(bào)

7#
ID:557774 發(fā)表于 2019-6-12 00:22 來自手機(jī) | 只看該作者
感謝樓主,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

8#
ID:584303 發(fā)表于 2019-7-15 10:59 | 只看該作者
牛逼的資料
回復(fù)

使用道具 舉報(bào)

9#
ID:538722 發(fā)表于 2019-10-26 14:06 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:631408 發(fā)表于 2019-10-30 23:46 | 只看該作者
感謝分享~
回復(fù)

使用道具 舉報(bào)

11#
ID:634994 發(fā)表于 2019-11-3 20:56 | 只看該作者
感謝樓主分享  很贊  學(xué)到了
回復(fù)

使用道具 舉報(bào)

12#
ID:16087 發(fā)表于 2019-11-4 09:31 | 只看該作者
寫的相當(dāng)好了啊,非常支持。也是單片機(jī)的幾大難點(diǎn)之一,尤其是 裝處置和設(shè)置工作模式。還有就是存儲(chǔ)器擴(kuò)展,串行并行通訊,模擬量轉(zhuǎn)換。輸入輸出,LED和LCD 相對(duì)要簡單的。
回復(fù)

使用道具 舉報(bào)

13#
ID:634325 發(fā)表于 2019-11-12 21:21 | 只看該作者
正好用到
回復(fù)

使用道具 舉報(bào)

14#
ID:581602 發(fā)表于 2019-11-17 18:27 | 只看該作者
感謝樓主,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

15#
ID:640585 發(fā)表于 2020-1-7 10:00 | 只看該作者
感謝樓主,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

16#
ID:412814 發(fā)表于 2020-1-9 09:27 | 只看該作者
感謝分享,如果程序中多次使用不同定時(shí)時(shí)間,該怎樣寫?
回復(fù)

使用道具 舉報(bào)

17#
ID:663154 發(fā)表于 2020-1-9 11:25 | 只看該作者
感謝分享,對(duì)於初學(xué)者,真的是太好了!
回復(fù)

使用道具 舉報(bào)

18#
ID:690181 發(fā)表于 2020-2-5 11:55 | 只看該作者
請(qǐng)問一下,c51得話還是th0=(65536-45872)/256嘛
回復(fù)

使用道具 舉報(bào)

19#
ID:690726 發(fā)表于 2020-2-7 10:01 | 只看該作者
很仔細(xì)!
回復(fù)

使用道具 舉報(bào)

20#
ID:485431 發(fā)表于 2020-2-8 13:56 | 只看該作者
寫的非常好,學(xué)習(xí)了,謝謝
回復(fù)

使用道具 舉報(bào)

21#
ID:208733 發(fā)表于 2020-2-8 17:30 | 只看該作者
精準(zhǔn)延時(shí)程序好
回復(fù)

使用道具 舉報(bào)

22#
ID:691262 發(fā)表于 2020-2-9 09:04 | 只看該作者
verygood
回復(fù)

使用道具 舉報(bào)

23#
ID:691262 發(fā)表于 2020-2-9 09:05 | 只看該作者
這個(gè)資料找了很久,謝謝分享
回復(fù)

使用道具 舉報(bào)

24#
ID:697117 發(fā)表于 2020-2-23 21:13 | 只看該作者
寫得好,非常感謝!但是
if(num==20) //如果到了20次,說明1秒時(shí)間
{
led1=~led1; //讓發(fā)光管狀態(tài)取反
num=0;
}

更保險(xiǎn)的應(yīng)該是
if(num>=20) //如果到了20次,說明1秒時(shí)間
{
led1=~led1; //讓發(fā)光管狀態(tài)取反
num=0;
}
回復(fù)

使用道具 舉報(bào)

25#
ID:74554 發(fā)表于 2020-2-24 09:57 | 只看該作者
學(xué)習(xí)了,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

26#
ID:686739 發(fā)表于 2020-2-24 17:41 來自手機(jī) | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

27#
ID:583247 發(fā)表于 2020-3-1 01:38 | 只看該作者

感謝分享!
回復(fù)

使用道具 舉報(bào)

28#
ID:701320 發(fā)表于 2020-3-2 18:41 | 只看該作者
十分感謝大佬
回復(fù)

使用道具 舉報(bào)

29#
ID:695749 發(fā)表于 2020-3-2 19:51 | 只看該作者
講述很好,很實(shí)用,謝謝分享。
回復(fù)

使用道具 舉報(bào)

30#
ID:345127 發(fā)表于 2020-3-4 15:56 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

31#
ID:649907 發(fā)表于 2020-4-9 13:52 | 只看該作者
學(xué)到了,贊!
回復(fù)

使用道具 舉報(bào)

32#
ID:726005 發(fā)表于 2020-4-10 09:15 | 只看該作者

學(xué)到了,贊!
回復(fù)

使用道具 舉報(bào)

33#
ID:532611 發(fā)表于 2020-6-6 10:54 | 只看該作者
謝謝分享。!
回復(fù)

使用道具 舉報(bào)

34#
ID:546335 發(fā)表于 2020-7-28 14:29 | 只看該作者
那個(gè)裝載初值應(yīng)該是46080吧,不是45872,否則會(huì)有0.001秒左右延時(shí)誤差
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表