寫在開頭:中斷是包括單片機在內(nèi)的所有微處理器很重要的功能之一,初學單片機必須這一部分的知識。
一、中斷的概念
先看百度百科是怎么定義中斷的:
中斷是指計算機運行過程中,出現(xiàn)某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運行。
—— 百度百科
那么怎么理解中斷?看下面的例子。
關于中斷:
小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉(zhuǎn)去玩吃雞游戲。玩了幾局后,關掉游戲,繼續(xù)學習。
關于中斷優(yōu)先級:
小A正在學習。這時,他的朋友小B叫他一塊兒吃雞,小A停止學習,轉(zhuǎn)去玩吃雞游戲,(吃雞過程中,小A女朋友打來電話,于是掛機游戲,去接電話,接完電話,繼續(xù)游戲。)玩了幾局后,關掉游戲,繼續(xù)學習。
幾個重要概念:
中斷:小A學習被小B打斷的過程就稱為中斷。
中斷源:小B被稱為中斷源。
中斷服務程序:小A執(zhí)行的玩游戲操作稱為中斷服務程序
中斷優(yōu)先級:小A女朋友的電話比游戲優(yōu)先級高
在89c52單片機中,有3類中斷源:
1、外部中斷:當外部中斷引腳信號產(chǎn)生跳變(低電平→高電平)時引起中斷。
2、定時器/計數(shù)器中斷:當計數(shù)器計滿溢出時引起跳變。
3、串口中斷:串行端口完成一幀數(shù)據(jù)的發(fā)送/接受時引起(如藍牙傳輸)。
其優(yōu)先級如下表:
中斷源 優(yōu)先級 中斷服務號
INT0 – 外部中斷0 最高 0
T0 – 定時器/計數(shù)器0中斷 第2 1
INT1 – 外部中斷1 第3 2
T1 – 定時器/計數(shù)器1中斷 第4 3
串口中斷 第5 4
T2 – 定時器/計數(shù)器2中斷 最低 5
下面以定時器中斷為例,討論中斷的編程方法。
二、定時器中斷
2.1 軟件延時的不足
根據(jù)現(xiàn)有的知識,如果要在程序中等待一端時間,想到的操作應該是通過執(zhí)行若干次空指令,達到延時的效果。
如下:
//延時xms
void delayms(uint xms){
uint i,j;
for(i = 0; i < xms; ++i)
for(j = 0; j < 110; ++j)
;
}
但是,假設要實現(xiàn)以下功能:
1、8位數(shù)碼管動態(tài)掃描顯示。
2、LED燈每隔1s閃爍一次。
電路如下:
考慮程序怎么寫……
//代碼不完整,僅為舉例說明
void main(){
P2 = 0x01; //數(shù)碼管從最低位開始掃描
while(1){
//功能1:執(zhí)行數(shù)碼管動態(tài)掃描
//P2控制顯示哪一個數(shù)碼管,P0控制數(shù)碼管顯示什么內(nèi)容
P2 = P2<<1; //掃描更高一位的數(shù)碼管
P0 = xxxx; //輸出段碼
delayms(5); //延時5ms后顯示下一位數(shù)碼管
//功能2:執(zhí)行LED燈閃爍
led = ~led; //LED燈狀態(tài)取反
delayms(1000); //延時1000ms
}
}
功能1和功能2單獨寫都沒有問題。
但是如果組合在一起,寫在一個while循環(huán)中,就會有問題了:
一個while循環(huán)中有兩個延時函數(shù),因此執(zhí)行一次while循環(huán),共延時了1005ms。這并不是我們所希望的結果。我們希望led閃爍的延時不影響數(shù)碼管動態(tài)掃描的延時。
2.2 中斷寄存器
要使用硬件定時,主要涉及到寄存器的操作。51單片機里的關于中斷的寄存器如下:
IE – 中斷允許控制寄存器
IP – 中斷優(yōu)先級控制寄存器
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 定時器/計數(shù)器2中斷允許位
ES 串口中斷允許位
ET1 定時器/計數(shù)器1中斷允許位
EX1 外部中斷1允許位
ET0 定時器/計數(shù)器0中斷允許位 (重要)
EX0 外部中斷0允許位
要使用定時器中斷,需要將IE寄存器中的EA位設置為1,以及需要將ETx(x = 0,1,2)設置為1。
2.2.2 定時器工作方式寄存器 TMOD
該寄存器的主要功能是設置定時器/計數(shù)器中斷的工作方式。如設置位定時器模式、定時器模式的計數(shù)位的位數(shù)。以下是詳細介紹:
定時器工作方式寄存器 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 定時器/計數(shù)器的開關控制選項。常將該位置0,即定時器/計數(shù)器的開關控制僅由TCON寄存器中的TRx(x = 0,1)控制。(見2.2.3的TRx)
C/T 定時器模式和計數(shù)器模式選擇位,將該位置0則為定時器模式。
M1M0 設置定時器/計數(shù)器工作方式,常將該兩位設置為0 1,其定義如下表:
M1 M0 工作方式
0 0 模式0,13位計數(shù)
0 1 模式1,16位計數(shù),常用此模式
1 0 模式2,8位初值自動重裝
1 1 模式3,僅適用于T0,分為兩個8位計數(shù)器,T1停止計數(shù)
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觸發(fā)方式選擇位
IE0 外部中斷0請求標志
IT0 外部中斷0觸發(fā)方式選擇位
2.2.4 定時器初值寄存器 THx/TLx
以定時器T0為例,其的工作原理是,每當晶振產(chǎn)生一次脈沖,就將該寄存器TL0加一,當TL0加滿溢出后,將TL0清空,TH0加一,TH0計滿后產(chǎn)生定時中斷。即TH0與TL0組成了一個16位的計數(shù)器,這個計數(shù)器可以從0x0000(0)加到0xffff(65535)。
以12Mhz的晶振、定時10ms為例:
51單片機為12分頻單片機,因此執(zhí)行一條指令的時間是12×(1/12M) s,即計數(shù)器每1us加一。
若定時10ms,則共需要加10000次。
因此將TH0、TL0設置從(65536-10000)= 55536開始計數(shù)。55536 的16進制為0xD8F0。因此將TH0設置為0xD8,TL0 設置為0xF0。
2.3 定時器中斷程序?qū)懛?p>首先要初始化定時器,即將命令寫入以上的寄存器。 假設使用定時器T0
首先設置定時器工作模式TMOD:GATE設置為0;C/T位設置為0使其工作在定時器模式下;M1M0設置為01,使用16位計數(shù)。
因此第一句代碼是
TMOD = 0x01; // 0000 0001
然后設置定時器時長THx/TLx:
TH0 = 0xD8;
TL0 = 0xF0;
設置定時器允許寄存器IE,打開中斷總開關和T0中斷開關
EA = 1;
ET0 = 1;
最后設置定時器控制寄存器TCON,使定時器開始計數(shù)
TR0 = 1;
因此,完整的定時器初始化代碼如下
void initT0(){
TMOD = 0x01; // 0000 0001.
TH0 = 0xD8; //65536-10000
TL0 = 0xF0; //55536
EA = 1;
ET0 = 1;
TR0 = 1;
}
當定時器計數(shù)觸發(fā)中斷時,單片機會調(diào)用中斷服務程序。中斷服務程序的格式如下:
void 函數(shù)名() interrupt 中斷號 using 工作組
{
//所要執(zhí)行內(nèi)容
}
說明:
中斷服務函數(shù)要寫在主函數(shù)后面,且不需要聲明 。
中斷服務函數(shù)無返回值,所以用void
函數(shù)名可以隨便起
interrupt后的中斷號由下表的重點服務號確定
using 工作組可省略不寫
中斷源 優(yōu)先級 中斷服務號
INT0 – 外部中斷0 最高 0
T0 – 定時器/計數(shù)器0中斷 第2 1
INT1 – 外部中斷1 第3 2
T1 – 定時器/計數(shù)器1中斷 第4 3
串口中斷 第5 4
T2 – 定時器/計數(shù)器2中斷 最低 5
因此T0中斷服務程序如下:
void t0Intr() interrupt 0
{
//因為執(zhí)行到此時,計數(shù)器已經(jīng)清零,所以要重新賦值
TH0 = 0xD8; //65536-10000
TL0 = 0xF0; //55536
//下面寫需要執(zhí)行的操作
}
根據(jù)以上內(nèi)容,可設計一個簡單定時器電路如下:
其中:
D1燈由定時器控制,每秒閃一次
D2 - D8由軟件延時實現(xiàn)流水燈效果,周期為100ms
代碼如下
#include #include //num為計數(shù)器,每10ms將num加一,當num為100時為1s unsigned char num; sbit led = P1^0; //函數(shù)聲明 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; //翻轉(zhuǎn)led燈狀態(tài) } } 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)——按鍵控制
推薦閱讀
史海拾趣
聚辰(Giantec)公司電子行業(yè)發(fā)展的五個故事
故事一:技術傳承與獨立運營
聚辰半導體股份有限公司(Giantec Semiconductor Corporation)的故事始于2009年,由美國ISSI公司與其高管共同出資成立。這家公司繼承了ISSI在EEPROM和智能卡芯片技術上的專利和研發(fā)團隊,為后續(xù)的快速發(fā)展奠定了堅實基礎。隨著ISSI公司股權的變動,聚辰半導體逐漸由國資企業(yè)接手并開始獨立運營。這一轉(zhuǎn)變不僅讓聚辰獲得了更大的自主權,也為其在存儲芯片領域的深耕細作提供了有力支持。
故事二:全球布局與市場拓展
自成立以來,聚辰半導體便致力于全球化布局,不僅在上海設立總部,還在美國硅谷、韓國、中國香港、中國臺灣、深圳、南京、蘇州等地設立了子公司、辦事處或銷售機構。這一戰(zhàn)略布局使得聚辰能夠更好地服務全球客戶,迅速響應市場需求。同時,聚辰的產(chǎn)品線不斷擴展,從最初的EEPROM存儲芯片,逐步延伸到NOR Flash、音圈馬達驅(qū)動芯片和智能卡芯片等多個領域,廣泛應用于智能手機、汽車電子、工業(yè)控制等多個行業(yè)。
故事三:技術突破與產(chǎn)品創(chuàng)新
在技術創(chuàng)新方面,聚辰半導體始終走在行業(yè)前列。2012年,聚辰推出的EEPROM存儲芯片成功進入三星、OPPO等手機品牌的攝像頭模組供應鏈,標志著公司在全球EEPROM存儲芯片市場的地位逐漸穩(wěn)固。此后,聚辰不斷推出新產(chǎn)品,如音圈馬達驅(qū)動芯片與EEPROM二合一產(chǎn)品,進一步提升了其在手機攝像頭模組中的競爭力。同時,聚辰還積極布局汽車電子市場,多款車規(guī)級存儲芯片獲得市場認可,為公司帶來了新的增長點。
故事四:資本市場助力與品牌提升
2019年,聚辰半導體在上海證券交易所科創(chuàng)板成功上市,為公司的發(fā)展注入了強勁動力。資本市場的助力不僅讓聚辰獲得了更多的資金支持,還顯著提升了公司的品牌影響力和市場認知度。上市以來,聚辰持續(xù)加大研發(fā)投入,優(yōu)化產(chǎn)品結構,提升產(chǎn)品性能,進一步鞏固了其在存儲芯片領域的市場地位。
故事五:榮譽加身與行業(yè)認可
近年來,聚辰半導體憑借其出色的業(yè)績和技術實力贏得了多項榮譽和行業(yè)認可。公司多次入選中國物聯(lián)網(wǎng)企業(yè)百強榜單、上海硬核科技企業(yè)TOP100榜單等權威榜單,彰顯了其在行業(yè)內(nèi)的領先地位。同時,聚辰還積極履行社會責任,參與公益事業(yè),如向中國科學技術大學捐贈資金用于支持人工智能創(chuàng)新中心建設等,進一步提升了公司的社會形象和品牌價值。這些榮譽和認可不僅是對聚辰過去努力的肯定,也是對其未來發(fā)展的期待和鼓舞。
隨著業(yè)務的不斷擴展,Continental Industries開始積極尋求全球市場機會。公司在歐洲、北美洲、南美洲和亞洲等多個地區(qū)設立了代表處或全資子公司,以更好地服務當?shù)乜蛻?。通過本地化運營和定制化服務,公司成功打開了多個新的市場,實現(xiàn)了業(yè)務的快速增長。
星海鋼琴始終注重技術創(chuàng)新和品質(zhì)提升。從引進國外先進技術到自主研發(fā),星海鋼琴在鋼琴設計和制造方面取得了顯著成果。公司特聘德國鋼琴制造大師勞瑟·切爾先生為公司顧問,不斷提升產(chǎn)品的工藝水平和音質(zhì)表現(xiàn)。同時,星海鋼琴還通過了ISO9001國際質(zhì)量管理體系認證,確保每一架鋼琴都符合高標準的質(zhì)量要求。
Asia Electronics Ind Co Ltd深知人才是企業(yè)發(fā)展的核心。因此,公司注重人才培養(yǎng)和團隊建設。公司定期舉辦各類培訓活動,提升員工的技能和素質(zhì)。同時,公司還建立了一套完善的激勵機制,鼓勵員工積極創(chuàng)新、勇于擔當。這些舉措有效激發(fā)了員工的工作熱情和創(chuàng)造力,為公司的發(fā)展注入了源源不斷的動力。
隨著公司產(chǎn)品的不斷成熟和市場的不斷擴大,Asia Electronics Ind Co Ltd積極尋求市場拓展的機會。公司加強與國際知名企業(yè)的合作,通過參加國際電子展、建立海外銷售渠道等方式,不斷提升品牌知名度和影響力。同時,公司還注重品牌形象的塑造,通過統(tǒng)一的品牌標識、宣傳資料等,增強消費者對品牌的認知度和信任度。
為了進一步提升市場份額和品牌影響力,APM開始積極拓展國內(nèi)外市場。公司不僅加強了與現(xiàn)有客戶的合作關系,還積極參加各類行業(yè)展會和技術交流會,與潛在客戶建立聯(lián)系。同時,APM還加大了對品牌建設的投入,通過廣告宣傳、媒體報道等方式提升品牌知名度和美譽度。這些舉措使得APM在電子行業(yè)中的影響力逐漸增強。
1 要學電子,先學好汽車電路。外部原理不懂如何修內(nèi)部? 2要學好電路,先學好汽車原理?;倦娖髟聿欢绾畏治龉收显? 比如:曲軸傳感器,1有幾條線?兩條線的與三條線的如何區(qū)別?工作原理是什么?線分別是到哪里的?分別是什么信號? 信號 ...… 查看全部問答∨ |
|
硬件實驗設計板是這樣的: 一個獨立按鍵和4X3距陣鍵盤(共13個按鍵),用中斷掃描鍵盤是否被按下,如一個按鍵被按下就向PC機發(fā)送一個單音的MIDI信號音符。我只知道用單片機向PC機發(fā)送MIDI信號的協(xié)議是這樣的 //這是發(fā)送函數(shù) void send(uchar cc,k ...… 查看全部問答∨ |
我參照msdn上wince服務的介紹寫了個服務,但好像一直沒有被系統(tǒng)調(diào)用,大家?guī)兔聪略? appKey.SetValue(\"Dll\", \"MyMobileService.dll\"); appKey.SetValue(\"Order\", \"10\", RegistryValueKind.DWord); appKey.SetValue(\"Prefix\", \"CU\" ...… 查看全部問答∨ |
DSP arm 和flash的CMD有什么區(qū)別? 有人了解不,可以一起討論下 [ 本帖最后由 安_然 于 2010-8-8 14:24 編輯 ]… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 13:31 編輯 IR推出新系列40V至75V車用MOSFET 21ic訊 IR近日推出新的車用MOSFET系列,適合要求低導通電阻的一系列應用,包括傳統(tǒng)內(nèi)燃機 (ICE) 平臺以及微型和混合動力汽車平臺上的重載應用。 IR堅固的新型平面 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- DigiKey應用探索站重磅上線!潮流應用,硬核技術探秘,N多干貨,一站get!
- ADI有獎下載活動之7 可編程邏輯控制器(PLCs)解決方案
- 下載、答題贏好禮:使用Mentor的Xpedition Layout高效設計PCB
- 開學季!解鎖奇樓去充電,玩轉(zhuǎn)幸運大抽獎~抽不中再抽
- 有獎直播 | 恩智浦微處理器產(chǎn)品與應用分享 報名中!
- 月度原創(chuàng)精選評選:有料,夠精彩,要的就是它!
- 看視頻,了解泰克高性價比頻譜分析儀,填卷贏好禮!
- PI 電源小課堂:集成式半橋驅(qū)動IC BridgeSwitch 2, 助力高效永磁同步電機逆變器的設計
- 安世半導體&世平集團 高效能&小型化, Nexperia MOSFET的5G解決方案 觀看、下載 闖關贏好禮!
- 7月21日有獎直播|ADI開關/多路復用器系列產(chǎn)品的典型應用