寫在開頭:中斷是包括單片機在內的所有微處理器很重要的功能之一,初學單片機必須這一部分的知識。
一、中斷的概念
先看百度百科是怎么定義中斷的:
中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。
—— 百度百科
那么怎么理解中斷?看下面的例子。
關于中斷:
小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉去玩吃雞游戲。玩了幾局后,關掉游戲,繼續學習。
關于中斷優先級:
小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉去玩吃雞游戲,(吃雞過程中,小A女朋友打來電話,于是掛機游戲,去接電話,接完電話,繼續游戲。)玩了幾局后,關掉游戲,繼續學習。
幾個重要概念:
中斷:小A學習被小B打斷的過程就稱為中斷。
中斷源:小B被稱為中斷源。
中斷服務程序:小A執行的玩游戲操作稱為中斷服務程序
中斷優先級:小A女朋友的電話比游戲優先級高
在89c52單片機中,有3類中斷源:
1、外部中斷:當外部中斷引腳信號產生跳變(低電平→高電平)時引起中斷。
2、定時器/計數器中斷:當計數器計滿溢出時引起跳變。
3、串口中斷:串行端口完成一幀數據的發送/接受時引起(如藍牙傳輸)。
其優先級如下表:
中斷源 優先級 中斷服務號
INT0 – 外部中斷0 最高 0
T0 – 定時器/計數器0中斷 第2 1
INT1 – 外部中斷1 第3 2
T1 – 定時器/計數器1中斷 第4 3
串口中斷 第5 4
T2 – 定時器/計數器2中斷 最低 5
下面以定時器中斷為例,討論中斷的編程方法。
二、定時器中斷
2.1 軟件延時的不足
根據現有的知識,如果要在程序中等待一端時間,想到的操作應該是通過執行若干次空指令,達到延時的效果。
如下:
//延時xms
void delayms(uint xms){
uint i,j;
for(i = 0; i < xms; ++i)
for(j = 0; j < 110; ++j)
;
}
但是,假設要實現以下功能:
1、8位數碼管動態掃描顯示。
2、LED燈每隔1s閃爍一次。
電路如下:
考慮程序怎么寫……
//代碼不完整,僅為舉例說明
void main(){
P2 = 0x01; //數碼管從最低位開始掃描
while(1){
//功能1:執行數碼管動態掃描
//P2控制顯示哪一個數碼管,P0控制數碼管顯示什么內容
P2 = P2<<1; //掃描更高一位的數碼管
P0 = xxxx; //輸出段碼
delayms(5); //延時5ms后顯示下一位數碼管
//功能2:執行LED燈閃爍
led = ~led; //LED燈狀態取反
delayms(1000); //延時1000ms
}
}
功能1和功能2單獨寫都沒有問題。
但是如果組合在一起,寫在一個while循環中,就會有問題了:
一個while循環中有兩個延時函數,因此執行一次while循環,共延時了1005ms。這并不是我們所希望的結果。我們希望led閃爍的延時不影響數碼管動態掃描的延時。
2.2 中斷寄存器
要使用硬件定時,主要涉及到寄存器的操作。51單片機里的關于中斷的寄存器如下:
IE – 中斷允許控制寄存器
IP – 中斷優先級控制寄存器
TMOD – 定時器工作方式寄存器
TCON – 定時器控制寄存器
SCON – 串口控制寄存器
THx/TLx – 定時器初值寄存器
在定時器中斷中,需要設置的有TMOD、THx/TLx、TCON、IE。
下面只介紹使用定時器中斷所需要設置的寄存器,其余寄存器可自行查閱資料。
2.2.1 中斷允許控制寄存器 IE
該寄存器的主要功能是控制中斷的開啟與關閉,共7個有效位,包含一個全局中斷控制位和6個中斷源的控制位。
中斷允許控制寄存器 IE各位的定義如下表:
序號 D7 D6 D5 D4 D3 D2 D1 D0
符號 EA – ET2 ES ET1 EX1 ET0 EX0
說明:
EA 全局中斷允許位,當此位是1時中斷可用。(重要)
ET2 定時器/計數器2中斷允許位
ES 串口中斷允許位
ET1 定時器/計數器1中斷允許位
EX1 外部中斷1允許位
ET0 定時器/計數器0中斷允許位 (重要)
EX0 外部中斷0允許位
要使用定時器中斷,需要將IE寄存器中的EA位設置為1,以及需要將ETx(x = 0,1,2)設置為1。
2.2.2 定時器工作方式寄存器 TMOD
該寄存器的主要功能是設置定時器/計數器中斷的工作方式。如設置位定時器模式、定時器模式的計數位的位數。以下是詳細介紹:
定時器工作方式寄存器 TMOD各位的定義如下表:
序號 D7 D6 D5 D4 D3 D2 D1 D0
符號 GATE
C/TˉˉˉC/bar{T}
C/
T
ˉ
M1 M0 GATE
C/TˉˉˉC/bar{T}
C/
T
ˉ
M1 M0
說明:
GATE 定時器/計數器的開關控制選項。常將該位置0,即定時器/計數器的開關控制僅由TCON寄存器中的TRx(x = 0,1)控制。(見2.2.3的TRx)
C/T 定時器模式和計數器模式選擇位,將該位置0則為定時器模式。
M1M0 設置定時器/計數器工作方式,常將該兩位設置為0 1,其定義如下表:
M1 M0 工作方式
0 0 模式0,13位計數
0 1 模式1,16位計數,常用此模式
1 0 模式2,8位初值自動重裝
1 1 模式3,僅適用于T0,分為兩個8位計數器,T1停止計數
2.2.3 定時器控制寄存器 TCON
該寄存器用于控制中斷,如控制定時器的啟動,停止、判斷定時器的溢出和中斷情況。
定時器控制寄存器 TCON各位的定義如下表:
序號 D7 D6 D5 D4 D3 D2 D1 D0
符號 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
說明:
TF1 定時器1溢出標志位
TR1 定時器1運行控制位,將該位置1時啟動定時器1
TF0 定時器0溢出標志位
TR0 定時器0運行控制位,將該位置1時啟動定時器0 (重要)
IE1 外部中斷1請求標志
IT1 外部中斷1觸發方式選擇位
IE0 外部中斷0請求標志
IT0 外部中斷0觸發方式選擇位
2.2.4 定時器初值寄存器 THx/TLx
以定時器T0為例,其的工作原理是,每當晶振產生一次脈沖,就將該寄存器TL0加一,當TL0加滿溢出后,將TL0清空,TH0加一,TH0計滿后產生定時中斷。即TH0與TL0組成了一個16位的計數器,這個計數器可以從0x0000(0)加到0xffff(65535)。
以12Mhz的晶振、定時10ms為例:
51單片機為12分頻單片機,因此執行一條指令的時間是12×(1/12M) s,即計數器每1us加一。
若定時10ms,則共需要加10000次。
因此將TH0、TL0設置從(65536-10000)= 55536開始計數。55536 的16進制為0xD8F0。因此將TH0設置為0xD8,TL0 設置為0xF0。
2.3 定時器中斷程序寫法
首先要初始化定時器,即將命令寫入以上的寄存器。 假設使用定時器T0
首先設置定時器工作模式TMOD:GATE設置為0;C/T位設置為0使其工作在定時器模式下;M1M0設置為01,使用16位計數。
因此第一句代碼是
TMOD = 0x01; // 0000 0001
然后設置定時器時長THx/TLx:
TH0 = 0xD8;
TL0 = 0xF0;
設置定時器允許寄存器IE,打開中斷總開關和T0中斷開關
EA = 1;
ET0 = 1;
最后設置定時器控制寄存器TCON,使定時器開始計數
TR0 = 1;
因此,完整的定時器初始化代碼如下
void initT0(){
TMOD = 0x01; // 0000 0001.
TH0 = 0xD8; //65536-10000
TL0 = 0xF0; //55536
EA = 1;
ET0 = 1;
TR0 = 1;
}
當定時器計數觸發中斷時,單片機會調用中斷服務程序。中斷服務程序的格式如下:
void 函數名() interrupt 中斷號 using 工作組
{
//所要執行內容
}
說明:
中斷服務函數要寫在主函數后面,且不需要聲明 。
中斷服務函數無返回值,所以用void
函數名可以隨便起
interrupt后的中斷號由下表的重點服務號確定
using 工作組可省略不寫
中斷源 優先級 中斷服務號
INT0 – 外部中斷0 最高 0
T0 – 定時器/計數器0中斷 第2 1
INT1 – 外部中斷1 第3 2
T1 – 定時器/計數器1中斷 第4 3
串口中斷 第5 4
T2 – 定時器/計數器2中斷 最低 5
因此T0中斷服務程序如下:
void t0Intr() interrupt 0
{
//因為執行到此時,計數器已經清零,所以要重新賦值
TH0 = 0xD8; //65536-10000
TL0 = 0xF0; //55536
//下面寫需要執行的操作
}
根據以上內容,可設計一個簡單定時器電路如下:
其中:
D1燈由定時器控制,每秒閃一次
D2 - D8由軟件延時實現流水燈效果,周期為100ms
代碼如下
#include #include //num為計數器,每10ms將num加一,當num為100時為1s unsigned char num; sbit led = P1^0; //函數聲明 void delay100ms(); //軟件延時100ms void initT0(); //初始化定時器T0 void main() { unsigned char k ; //初始化num值 num = 0; //初始化定時器 initT0(); //初始化led燈 led = 0; //初始化流水燈 P0 = 0xfe; k = 0xfe; while(1) { //每100ms流水燈移位一次 k = _crol_(k, 1); P0 = k; delay100ms(); } } //t0定時器中斷服務程序 //每隔10ms進入一次該程序 void t0Intr() interrupt 1 { TH0 = 0xD8; TL0 = 0xF0; num++; //該變量加至100說明為1s if(num == 100) { num = 0; led = ~led; //翻轉led燈狀態 } } void delay100ms() { unsigned char a,b,c; for(c=19;c>0;c--) for(b=20;b>0;b--) for(a=130;a>0;a--); } void initT0() { TMOD = 0x01; TH0 = 0xD8; TL0 = 0xF0; EA = 1; ET0 = 1; TR0 = 1; }
上一篇:51單片機流水燈電路以及C代碼
下一篇:51單片機入門教程(4)——按鍵控制
推薦閱讀
史海拾趣
在電子行業中,有許多偉大的企業(GREATECS公司,這里假設為泛指多個杰出電子企業)通過不同的路徑和策略實現了顯著的發展。以下是五個相關故事,每個故事均基于事實,旨在展示這些企業如何成長和壯大。
1. 通用電氣(General Electric, GE)的多元化擴張
通用電氣(GE)的故事始于1888年,由托馬斯·愛迪生創立,最初專注于電力和照明領域。隨著時間的推移,GE通過一系列的戰略并購和內部創新,逐漸擴展到電機、電動機制造、航空、醫療設備、核能等多個領域。在20世紀,GE成為全球最大的多元化企業之一,其業務遍布全球。特別是在杰克·韋爾奇擔任CEO期間(1981-2001),通過大規模的并購和擴張,GE的營業收入和市值顯著增長。然而,2008年金融危機后,GE面臨經濟困境,隨后進行了戰略調整,出售金融資產并重點發展核心業務,如今仍是全球領先的科技和工業公司之一。
2. 索尼(Sony)的創新之路
索尼公司成立于1946年,最初由井深大和盛田昭夫創立,起初是一家小型電子產品制造商。索尼的崛起得益于其持續的創新精神和對消費者需求的敏銳洞察。1958年,索尼推出了世界上第一臺便攜式晶體管收音機,開啟了便攜式電子產品的新時代。隨后,索尼又推出了Walkman便攜式音樂播放器、PlayStation游戲機等一系列革命性產品,這些產品不僅改變了人們的娛樂方式,也奠定了索尼在全球電子行業的領先地位。索尼的成功在于其不斷追求技術創新和產品質量,以及對市場趨勢的準確把握。
3. 三星電子的崛起
三星電子是韓國最大的電子企業,其發展歷程充滿了挑戰與機遇。起初,三星主要從事貿易和低端電子產品制造。然而,在20世紀80年代末至90年代初,三星決定實施“新經營”戰略,通過大規模投資研發、提升產品質量和品牌形象,實現了從低端制造商向高端科技企業的轉型。在半導體、智能手機、顯示面板等領域,三星取得了重大突破,成為全球市場的領導者。三星的成功在于其強大的研發能力、高效的供應鏈管理以及對市場變化的快速響應。
4. 英特爾(Intel)的芯片霸主地位
英特爾公司成立于1968年,最初是一家專注于半導體存儲器的初創企業。然而,隨著日本存儲器制造商的崛起,英特爾面臨了巨大的競爭壓力。在關鍵時刻,英特爾決定放棄存儲器業務,轉而專注于微處理器(CPU)的研發和生產。這一戰略轉型使英特爾迅速崛起為全球最大的CPU制造商,其“Intel Inside”計劃更是深入人心,成為個人電腦行業的標準配置。英特爾的成功在于其強大的技術創新能力、對市場需求的精準把握以及與全球合作伙伴的緊密合作。
5. 華為的技術突破與全球化戰略
華為作為中國電子行業的代表企業,其發展歷程充滿了傳奇色彩。起初,華為主要從事電信設備的研發和銷售。然而,隨著技術的不斷進步和市場需求的不斷變化,華為逐漸將業務擴展到智能手機、云計算、人工智能等多個領域。華為的成功在于其持續的技術研發投入、對全球市場的深入洞察以及靈活的市場策略。特別是在5G技術方面,華為取得了重大突破,成為全球領先的5G解決方案提供商。同時,華為還積極推動全球化戰略,與全球多個國家和地區的運營商建立了緊密的合作關系。
隨著公司規模的擴大和產品線的豐富,Ark-Les Connectors公司開始積極尋求市場拓展。公司制定了針對不同區域和行業的市場拓展策略,通過參加國際電子展會、建立銷售網絡、開展合作伙伴計劃等方式,不斷擴大品牌影響力。同時,公司還根據市場需求調整產品策略,推出定制化解決方案,滿足不同客戶的個性化需求。這些舉措使得Ark-Les的市場占有率穩步提升,公司業績也實現了穩步增長。
隨著技術的不斷進步,ERA Transformers公司的產品逐漸受到了業界的廣泛關注。一次,一家國際知名的電子設備制造商找到他們,希望合作開發一款適用于其新產品的變壓器。這對ERA Transformers公司來說是一個難得的機會,也是一個巨大的挑戰。公司迅速組織技術團隊,與這家制造商緊密合作,經過數輪的設計、測試和修改,最終成功研發出了一款完全符合客戶要求的高性能變壓器。這一成功合作不僅為公司帶來了可觀的收益,更贏得了客戶的極高評價和長期合作意向。
為了保持技術領先地位和市場競爭力,ERA Transformers公司非常重視創新與研發工作。公司每年都會投入大量資金用于新產品的研發和技術創新。在一次研發項目中,公司成功開發出了一種具有超高能效和極低損耗的新型變壓器。這款產品的問世立即引起了市場的廣泛關注,并成功獲得了多項國內外專利。持續的創新與研發使得ERA Transformers公司在電子行業中始終保持著領先地位。
在市場競爭日益激烈的背景下,Esc意識到品質管理的重要性。公司投入大量資源用于提升產品質量和服務水平,通過嚴格的質量控制和客戶反饋機制,不斷優化產品設計和生產流程。同時,Esc還積極塑造品牌形象,通過參加行業展會、發布新品廣告等方式,提升品牌知名度和美譽度。這些努力使得Esc在消費者心中樹立了高品質、可信賴的形象。
當5G技術開始在全球范圍內推廣時,ElectronicsCorp看到了巨大的商機。公司迅速調整戰略,將重點轉向5G相關產品的研發。通過與全球領先的通信公司合作,ElectronicsCorp推出了一系列5G手機和通信設備。這些產品不僅性能卓越,而且價格合理,贏得了消費者的青睞。隨著5G技術的普及,ElectronicsCorp的市場份額不斷擴大。
簡介: 內容簡介: 本書涵蓋了電路分析的基本內容,包括各種直流和交流電路,特別是運算放大器電路的分析方法,并介紹了計算機電路分析程序PSpice。書中對精選的700道習題,詳細介紹了解題步驟;另外提供了幾百道補充練習題,并附有答案。 ...… 查看全部問答∨ |
|
程序中,duty為控制占空比的參數;count為控制分頻的參數。通過改變duty和count兩個參數,得到占空比及分頻數可調的時鐘信號,極為方便。 2.2 其他模塊的實現 其他控制模塊包括地址發生器、DAC控制電路、并/串轉換電路。存儲數據 ...… 查看全部問答∨ |
本人最近要申請國家的一個大學生創新項目,但是現在還沒有好一點的想法,難就難在要有創新點,做別人之前沒做的或是在別人的基礎上改進,偏硬件方面的,比如ARM嵌入式,FPGA之類的,便要涉及一些算法,大家有沒有好的想法可以提供一下啊,我是計信 ...… 查看全部問答∨ |
毫無疑問,【最愛TI M3 - Stellaris!】板塊是論壇最火、活動也最多的板塊,這里面體現了論壇管理層的重視、TI的大力支持和壇友的熱情參與。當前板塊成員結構大致是:資深電子工程師和在校學生,這當中在校學生占比重更大,他們對嵌入式應用的編程 ...… 查看全部問答∨ |
|
是這樣的一個結構我先給大家簡單的說下,在地表打一個20多米深的孔,孔口直徑在110毫米以上的,在這個孔的下面有可能有一些積水,我想問問大家有什么方法殼儀在孔口位置可以透過水面測到孔底。雖然這個用笨方法很簡單,用繩子側就行了,但是我想知 ...… 查看全部問答∨ |
在做電力線載波通信的部分,想自己配一套ST7538的FSK調制解調模塊,最好主控芯片是ATmega系列,最好能有較全的外圍接口和較多的功能,如撥碼按鍵、+-12V電源輸出、RS232/485接口等。 等待用過的或有了解的 ...… 查看全部問答∨ |