① 單片機定時/計數器和中斷到底有什麼用
中斷是處理器響應事件的方法,例如,串口中斷,定時器中斷
中斷的特點是,當指定的事件發生時,如串口有數據進入,定時器溢出等,處理器將保存當前程序指令寄存器的值,轉而運行中斷服務子程序。
顧名思義,定時/計數器的作用就是定時或者計數,某些應用中需要用到定時或者計數功能,例如精確延時,顯示屏每100ms進行一次刷新等
定時器計數器的中斷是可以開關的,一般他們有兩個寄存器,一個保存初始值,一個保存目標值,每一個定時周期,初始值會加1,當初始值超過目標值時為溢出,此時可以觸發定時器中斷,然後就可以自動進入中斷服務子程序了。
② 單片機的定時功能,計數功能,中斷功能的定義。。。
我這里有點教材,希望對你有幫助!
MCS-51中斷系統的結構:
如圖(抱歉,本圖請找本51書看一下)所示,由與中斷有關的特殊功能寄存器、中斷入口、順序查詢邏輯電路等組成,包括5個中斷請求源,4個用於中斷控制的寄存器IE、IP、ECON和SCON來控制中斷 類弄、中斷的開、關和各種中斷源的優先順序確定。
中斷請求源:
(1)外部中斷請求源:即外中斷0和1,經由外部引腳引入的,在單片機上有兩個引腳,名稱為INT0、INT1,也就是P3.2、P3.3這兩個引腳。在內部的TCON中有四位是與外中斷有關的。
IT0:INT0觸發方式控制位,可由軟體進和置位和復位,IT0=0,INT0為低電平觸發方式,IT0=1,INT0為負跳變觸發方式。這兩種方式的差異將在以後再談。
IE0:INT0中斷請求標志位。當有外部的中斷請求時,這位就會置1(這由硬體來完成),在CPU響應中斷後,由硬體將IE0清0。
IT1、IE1的用途和IT0、IE0相同。
(2)內部中斷請求源
TF0:定時器T0的溢出中斷標記,當T0計數產生溢出時,由硬體置位TF0。當CPU響應中斷後,再由硬體將TF0清0。
TF1:與TF0類似。
TI、RI:串列口發送、接收中斷,在串口中再講解。
2、中斷允許寄存器IE
在MCS-51中斷系統中,中斷的允許或禁止是由片內可進行位定址的8位中斷允許寄存器IE來控制的。見下表
EA
X
X
ES
ET1
EX1
ET0
EX0
其中EA是總開關,如果它等於0,則所有中斷都不允許。
ES-串列口中斷允許
ET1-定時器1中斷允許
EX1-外中斷1中斷允許。
ET0-定時器0中斷允許
EX0-外中斷0中斷允許。
SETB EA
SETB ET1
SETB EX1
來實現它。
3、五個中斷源的自然優先順序與中斷服務入口地址
外中斷0:0003H
定時器0:000BH
外中斷1:0013H
定時器1:001BH
串口 :0023H
它們的自然優先順序由高到低排列。
寫到這里,大家應當明白,為什麼前面有一些程序一始我們這樣寫:
ORG 0000H
LJMP START
ORG 0030H
START:
。
這樣寫的目的,就是為了讓出中斷源所佔用的向量地址。當然,在程序中沒用中斷時,直接從0000H開始寫程序,在原理上並沒有錯,但在實際工作中最好不這樣做。
優先順序:單片機採用了自然優先順序和人工設置高、低優先順序的策略,即可以由程序員設定那些中斷是高優先順序、哪些中斷是低優先順序,由於只有兩級,必有一些中斷處於同一級別,處於同一級別的,就由自然優先順序確定。
開機時,每個中斷都處於低優先順序,我們可以用指令對優先順序進行設置。看錶2
中斷優先順序中由中斷優先順序寄存器IP來高置的,IP中某位設為1,相應的中斷就是高優先順序,否則就是低優先順序。
X
X
X
PS
PT1
PX1
PT0
PX0
例:在上例中,如果5個中斷請求同時發生,求中斷響應的次序。
響應次序為:定時器0->外中斷1->外中斷0->實時器1->串列中斷。
MCS-51的中斷響應過程:
1、中斷響應的條件:講到這兒,我們依然對於計算機響應中斷感到神奇,我們人可以響應外界的事件,是因為我們有多種「感測器「――眼、耳可以接受不同的信息,計算機是如何做到這點的呢?其實說穿了,一點都不希奇,MCS51工作時,在每個機器周期中都會去查詢一下各個中斷標記,看他們是否是「1「,如果是1,就說明有中斷請求了,所以所謂中斷,其實也是查詢,不過是每個周期都查一下而已。這要換成人來說,就相當於你在看書的時候,每一秒鍾都會抬起頭來看一看,查問一下,是不是有人按門鈴,是否有電話。。。。很蠢,不是嗎?可計算機本來就是這樣,它根本沒人聰明。
了解了上述中斷的過程,就不難解中斷響應的條件了。在下列三種情況之一時,CPU將封鎖對中斷的響應:
CPU正在處理一個同級或更高級別的中斷請求。
現行的機器周期不是當前正執行指令的最後一個周期。我們知道,單片機有單周期、雙周期、三周期指令,當前執行指令是單位元組沒有關系,如果是雙位元組或四位元組的,就要等整條指令都執行完了,才能響應中斷(因為中斷查詢是在每個機器周期都可能查到的)。
當前正執行的指令是返回批令(RETI)或訪問IP、IE寄存器的指令,則CPU至少再執行一條指令才應中斷。這些都是與中斷有關的,如果正訪問IP、IE則可能會開、關中斷或改變中斷的優先順序,而中斷返回指令則說明本次中斷還沒有處理完,所以都要等本指令處理結束,再執行一條指令才可以響應中斷。
2、中斷響應過程
CPU響應中斷時,首先把當前指令的下一條指令(就是中斷返回後將要執行的指令)的地址送入堆棧,然後根據中斷標記,將相應的中斷入口地址送入PC,PC是程序指針,CPU取指令就根據PC中的值,PC中是什麼值,就會到什麼地方去取指令,所以程序就會轉到中斷入口處繼續執行。這些工作都是由硬體來完成的,不必我們去考慮。這里還有個問題,大家是否注意到,每個中斷向量地址只間隔了8個單元,如0003-000B,在如此少的空間中如何完成中斷程序呢?很簡單,你在中斷處安排一個LJMP指令,不就可以把中斷程序跳轉到任何地方了嗎?
一個完整的主程序看起來應該是這樣的:
ORG 0000H
LJMP START
ORG 0003H
LJMP INT0 ;轉外中斷0
ORG 000BH
RETI ;沒有用定時器0中斷,在此放一條RETI,萬一 「不小心「產生了中斷,也不會有太大的後果。
中斷程序完成後,一定要執行一條RETI指令,執行這條指令後,CPU將會把堆棧中保存著的地址取出,送回PC,那麼程序就會從主程序的中斷處繼續往下執行了。注意:CPU所做的保護工作是很有限的,只保護了一個地址,而其它的所有東西都不保護,所以如果你在主程序中用到了如A、PSW等,在中斷程序中又要用它們,還要保證回到主程序後這裡面的數據還是沒執行中斷以前的數據,就得自己保護起來。
一、計數概念的引入
從選票的統計談起:畫「正」。這就是計數,生活中計數的例子處處可見。例:錄音機上的計數器、家裡面用的電度表、汽車上的里程錶等等,再舉一個工業生產中的例子,線纜行業在電線生產出來之後要計米,也就是測量長度,怎麼測法呢?用尺量?不現實,太長不說,要一邊做一邊量呢,怎麼辦呢?行業中有很巧妙的方法,用一個周長是1米的輪子,將電纜繞在上面一周,由線帶輪轉,這樣輪轉一周不就是線長1米嘛,所以只要記下輪轉了多少圈,就可以知道走過的線有多長了。
二、計數器的容量
從一個生活中的例子看起:一個水盆在水龍頭下,水龍沒關緊,水一滴滴地滴入盆中。水滴不斷落下,盆的容量是有限的,過一段時間之後,水就會逐漸變滿。錄音機上的計數器最多隻計到999….那麼單片機中的計數器有多大的容量呢?8031單片機中有兩個計數器,分別稱之為T0和T1,這兩個計數器分別是由兩個8位的RAM單元組成的,即每個計數器都是16位的計數器,最大的計數量是65536。
三、定時
8031中的計數器除了可以作為計數之用外,還可以用作時鍾,時鍾的用途當然很大,如打鈴器,電視機定時關機,空調定時開關等等,那麼計數器是如何作為定時器來用的呢?
一個鬧鍾,我將它定時在1個小時後鬧響,換言之,也可以說是秒針走了(3600)次,所以時間就轉化為秒針走的次數的,也就是計數的次數了,可見,計數的次數和時間之間的確十分相關。那麼它們的關系是什麼呢?那就是秒針每一次走動的時間正好是1秒。
圖1
結論:只要計數脈沖的間隔相等,則計數值就代表了時間的流逝。
由此,單片機中的定時器和計數器是一個東西,只不過計數器是記錄的外界發生的事情,而定時器則是由單片機提供一個非常穩定的計數源。
那麼提供組定時器的是計數源是什麼呢?看圖1,原來就是由單片機的晶振經過12分頻後獲得的一個脈沖源。晶振的頻率當然很准,所以這個計數脈沖的時間間隔也很准。問題:一個12M的晶振,它提供給計數器的脈沖時間間隔是多少呢?當然這很容易,就是12M/12等於1M,也就是1個微秒。
結論:計數脈沖的間隔與晶振有關,12M的晶振,計數脈沖的間隔是1微秒。
四、溢出
讓我們再來看水滴的例子,當水不斷落下,盆中的水不斷變滿,最終有一滴水使得盆中的水滿了。這時如果再有一滴水落下,就會發生什麼現象?水會漫出來,用個術語來講就是「溢出」。
水溢出是流到地上,而計數器溢出後將使得TF0變為「1」。至於TF0是什麼我們稍後再談。一旦TF0由0變成1,就是產生了變化,產生了變化就會引發事件,就象定時的時間一到,鬧鍾就會響一樣。至於會引發什麼事件,我們下次課再介紹,現在我們來研究另一個問題:要有多少個計數脈沖才會使TF0由0變為1。
五、任意定時及計數的方法
剛才已研究過,計數器的容量是16位,也就是最大的計數值到65536,因此計數計到65536就會產生溢出。這個沒有問題,問題是我們現實生活中,經常會有少於65536個計數值的要求,如包裝線上,一打為12瓶,一瓶葯片為100粒,怎麼樣來滿足這個要求呢?
……
提示:如果是一個空的盆要1萬滴水滴進去才會滿,我在開始滴水之前就先放入一勺水,還需要10000滴嘛?
對了,我們採用預置數的方法,我要計100,那我就先放進65436,再來100個脈沖,不就到了65536了嗎。
定時也是如此,每個脈沖是1微秒,則計滿65536個脈沖需時65.536毫秒,但現在我只要10毫秒就可以了,怎麼辦?
……
10個毫秒為10000個微秒,所以,只要在計數器裡面放進55536就可以了。
③ 請問51單片機,怎麼用中斷計數
類似按鍵輸入?按一次就計數+1?這樣的話很容易實現啊。 追問: 剛學 郭天祥 的新概念51,但是上面沒有沒有外部中斷的程序,所以外部中斷函數不會寫。。。順便弱弱的問一句: 定時器 工作方式二是不是不可以與單片機的空閑模式一起用。。 回答: 額,弄個 51單片機 模擬100例就有類似的例子,至於你後面那個,我玩51的時候也沒玩過,我能確定的是方式1可以,方式2我只是用來做過 脈沖 計數,沒有用過空閑模式, 補充: 額,弄個 51單片機 模擬100例就有類似的例子,至於你後面那個,我玩51的時候也沒玩過,我能確定的是方式1可以,方式2我只是用來做過 脈沖 計數,沒有用過空閑模式
④ 一個簡單的單片機計數器中斷計時的程序
#include<stdio.h>
#include<AT89X52.h>
unsigned char flag;
unsigned char commond;
void main()
{
TMOD=0x21;//計數器1工作方式2,計數器0工作方式1
TH1=TL1=0xfb; //波特率9600
TR1=1; //開始計時
SCON=0x50; //串口工作方式1 ,允許接收數據
EA=1;
ES=1; //打開串口中斷
ET0=0; //禁止計時器TO中斷
while(1)
{
if(flag)
{
flag=0;
}
}
}
void comm() interrupt 4 using 2
{ //unsigned char i;
if(RI)
{
RI=0;
flag=1;
commond = SBUF;
P2= commond;
RI=0;
if(commond=='e')
{
ET0=1; //打開計數器0中斷
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //延時0.5秒
TR0=1; //開始計時
}
}
}
void time0() interrupt 1 using 3
{
unsigned char j,k;
EA=0;
while(j>10)
{
j=0;
P3_4 = ~P3_4;
k++;
if(k>13)
{
TR0 =0;
k = 0;
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
j++;
EA =1;
}
你的程序好像是定時器中斷那裡有問題,這個改過的可以實現你的要求了
⑤ 51單片機利用中斷計數顯示程序怎麼寫
51單片機利用中斷計數顯示程序怎麼寫?嗯,那就看你的技術怎麼寫了那就用中段顯示程序寫吧?
⑥ 51單片機利用外部中斷INT0和INT1實現編碼器雙向計數功能
分數給的太少了。我只能給你提供一個思路,然後你自已寫程序:
int0和int1分別對應單片機兩個不同的引腳,你要先在單片機復位時在特殊功能寄存器中來配置這兩個引腳的功能,int0和int1的中斷都分別有兩個功能,一個是計數器工作方式,一個是外部中斷工作方式。
你的這個要求是不能用int0和int1兩個引腳的計數器功能的,你只能用外部中斷功能。
然後定義好int0和int1分別在中斷時的跳轉地址,在程序進入中斷之後,分別在不同的中斷程序中對一個寄存器表示的計數器進行加1或者減1操作。
一定記得在處理中斷的時候,要把中斷使能的寄存器標置位關掉,以避免中斷重復執行和錯誤。
⑦ 在單片機里有一個名稱叫中斷計數器(interrupt counters),具體指什麼意思
就是計數器計到一定值之後,就會產生一個中斷,然後就可以執行中斷里的程序了。通俗來講,就像手機鬧鍾一樣,你可以設置一個時間,當到了這個時間,它就會發出鬧鈴的聲音。