久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

關于單片機中斷詳解

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年12月02日   【字體:

   什么是中斷?就是打斷當前要做的事,轉而去執行別的事情。比如小七我現在正在電腦前寫帖子,突然老媽叫我幫她下樓拿點東西,于是我就收到了老媽給我的一個中斷(可以叫做外部中斷),當我去拿東西時,突然尿急(內部中斷,尿袋快要撐爆了),這又是一個中斷,!我們把引起中斷的事件叫做中斷源(如老媽給我的任務,以及我的尿意。。。外部引起的叫外部中斷,內部引起的叫內部中斷),產生中斷后就要去處理它,這稱為中斷的響應

    由于尿急這個內部中斷的優先級比老媽給我的外部中斷還要高,尿急了,我總得先去撒尿吧?所以我就先去執行撒尿這個語句(小七:怎么我覺得這個比喻很別扭呢?!)。當我撒完尿后(還是覺得很別扭。。。)我會返回來幫老媽拿東西(高優先級的中斷處理完后返回執行優先級較低的中斷),拿完東西了我再回到電腦前繼續寫帖子(全部中斷處理完后繼續接手中斷前的工作)。這個就叫做中斷的返回。這么通俗的比喻,大家對中斷的概念應該都明白了吧,那么在單片機里面,中斷有什么用呢?


    當單片機正在執行程序的時候,突然某個按鍵按下了(產生外部中斷),單片機就必須得去處理那個按鍵(中斷的響應),看看是發生了什么事,按鍵處理完后繼續回來執行程序(中斷的返回)。

    同樣,單片機正在執行程序的時候,內部的定時器溢出(定時器后面會單獨講到),或者檢測到單片機的電壓低于正常值等等(單片機內部產生的中斷叫內部中斷),單片機就得去處理這些事情,然后再返回來。

在單片機里面,中斷是有特殊的功能寄存器控制的,單片機里面一共有兩個中斷,一個是中斷0,一個是中斷1 ,和兩個定時器T0,T1,定時器就是你打開它后,它會自動數數,當數到你給它限定的值時,它就會溢出,產生中斷讓CPU處理(就像一個桶,你打開水龍頭后,水越來越多,當達到你需要的水位時,就會產生中斷叫你去處理它)。這些我們先不深入了解他是什么東西,我們只需知道中斷是用下面這幾個關鍵詞控制的就行了:

IT0      聲明外部中斷0的類型,IT0=1是邊沿觸發,0是電平觸發
邊沿觸發就是當檢測到外部電平發生變化,即由低變高,或者由高變低時,就會產生一個中斷
電平觸發就是檢測到高電平或者低電平時,產生中斷

IE0     外部邊沿觸發產生中斷后,它的值會變1,當CPU響應后,會自動變為0

IT1      和IT0一樣的含義
IE1     和IT0一樣的含義


EX0    外部中斷0控制器,EX0=1是允許外部中斷,0是禁止外部中斷,也就是不理會外部中斷
ET0    這個是定時器中斷控制器,ET1=1是允許定時器產生中斷,0是禁止
EX1,ET1的含義跟上面的都一樣。
EA      總中斷控制器,1是允許有中斷產生,0是禁止所有中斷,就算天打雷劈也不理會

    另外,還有一個中斷優先級的控制器,就是控制是去幫媽媽拿東西的優先級高還是去撒尿的優先級高。


PX0 外部中斷0的優先級控制,假如內外都產生了中斷,1就是優先處理外部中斷,0就是優先處理內部中斷

PT0 定時器0優先級控制器,1就是優先相應定時器0

PT1 定時器1優先級控制器,1就是優先相應定時器1

另外還有串口的RI,TI,PS等我們先不學習了,不然大伙該亂了
(眾人:其實我們早已凌亂了。。。一頭霧水!)

    還有個概念,就是中斷請求的撤銷,也就是說,產生中斷后,會產生一個中斷請求,為1,當CPU處理完中斷后,必須清除這個請求,不然CPU又會認為這個中斷沒有處理又跑去處理它……

    對于兩個定時器產生的中斷,當CPU響應后,會自動清除TF0,TF1這兩個定制器中斷請求,處理完后就跳出來,回到原來的地方繼續執行。

    對于外部中斷INT0,INT1,如果中斷類型是邊沿觸發,單片機會自動清除中斷請求IE0,IE1
若是電平觸發,如果有一個電平,使中斷產生后,這個電平仍然還保持著,那么這個電平還會觸發中斷,這樣CPU就死在中斷的石榴裙下出不來了。。。

(眾人:說了那么多,沒例子你說個J8)

例子來啦!用外部中斷來控制一個LED的亮滅。對了,外部中斷并不是單片機的每個引腳都能產生,標有INT0或INT1的才行,我們看看11F02E的引腳圖





    中斷的引腳是INT0:P3^2和 INT1:P3^3,我們用邊沿觸發(由高電平變成低電平時,就會觸發)的中斷方式來控制LED,


    當我們沒按下按鍵的時候,由于上拉電阻(不懂的問百度姐姐哦~)的原因,P3^2是高電平,當我們按下按鍵后,P3^2的電平就會變低,這個從高變低的過程就會產生一個中斷(邊沿觸發),CPU會第一時間來相應這個中斷,看看是誰看帖不回貼,看完帖子不評分,然后根據小七寫的中斷處理程序去處理他!


O(∩_∩)O 。

程序怎么寫呢?

 #include <reg52.h>
sbit led=P1^7;  //定義LED
void zhongduan() interrupt 0 using 1       //聲明中斷處理函數,由于是外部中斷,所以 interrupt X 里X的值是 0
{
  led=!led;  //CPU響應中斷后會跑來這里執行(讓led的狀態取反)
}
void main()      //主函數,程序執行的起點
{
  EA=1;              //允許CPU響應所有中斷
  IT0=1;             //設外部中斷0的響應模式為邊沿觸發
  EX0=1;             //允許中斷0產生中斷
  while(1);         //CPU不斷在這里死循環,中斷產生后放下工作去響應中斷,處理完后然后再返回來繼續死循環
}

按下按鍵,CPU會跑去中斷處理函數執行,執行完中斷處理后返回原處繼續執行




(眾人:這個中斷跟我們前面學習的按鍵有什么區別么?)


    當然有區別啦!雖然都是控制LED,但是按鍵是當CPU執行到按鍵檢測如 if(key==0) 語句后,才去改變LED的狀態,如果沒有執行到,那么即使你按下按鍵單片機也不會響應的,也就是CPU主動去問按鍵有沒有被按下。而中斷呢,就是無論CPU在干嘛,只要觸發中斷后,CPU就會放下手中的活,第一時間趕回來處理,也就是按鍵被按下后主動告訴CPU。。。就像windows 系統的 ctrl+alt+del 組合鍵,你一按下這個組合鍵,無論系統在做什么,都會彈出任務管理器。


    另外中斷的處理函數是這樣聲明的


void abc() interrupt X using n
{
    處理語句;



我們看到,只是普通的函數 加上了 interrupt X using Y 了而已,X 的取值是有規定的:


如果是外部中斷0的中斷處理函數,則X為0 即void abc() interrupt 0 using n


若是定時器0的中斷處理函數,則 X 為1


若是外部中斷1的中斷處理函數,則 X 為2


若是定時器1的中斷處理函數,則 X 為3 


若是串口中斷的中斷處理函數,則 X 為4

n 是中斷號,取值范圍為 0 - 31




關于中斷的學習,也到此告一段落了,當然還有一些問題沒解決.......

Q1: 為什么count==40的時候數碼管也不能閃爍???



 
/*
實現目的:
讓LED燈以1000ms(即1s)產生流水燈效果,并用定時器0讓數碼管以500ms從0~F閃爍
*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P2^1;
uchar weixuan=0x00;//位選全開
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//段選
uchar temp,count,num;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
count=0;
num=0;
P1=weixuan;
P0=table[num];
temp=0xfe;
P2=temp;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
delay(1000);
temp=_crol_(temp,1);
P2=temp;
/*
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
} */
}
}
void time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
}  
}

 

 
/*
PS:我們不能把數碼管500ms閃爍時間是否到達的語句寫在主程序中,
若寫在主程序中,有可能發生如下錯誤情況:當主程序在LED燈顯示語句當中時,
此時恰好定時器0進入中斷并且count剛好加到了10,當定時器0中斷再次進入時,
主程序仍未退出LED流水燈的顯示程序,那么此時count的值便變成了11,
這樣的話,count==10這個點永遠檢測不到,因此數碼管閃爍失去了控制


在調試代碼當中發現delay(uint z)函數與中斷是同時執行的。。。 
*/  

 

 

關閉窗口

相關文章

主站蜘蛛池模板: 国产欧美日韩在线一区 | 欧美另类视频在线 | 中文字幕视频在线观看免费 | 欧美一区二区三区在线观看 | 久久国 | 高清av一区 | 欧美日韩在线免费 | 亚洲精品久久视频 | 亚洲视频第一页 | 9久久婷婷国产综合精品性色 | av在线二区 | 欧美激情欧美激情在线五月 | 成人乱人乱一区二区三区软件 | 亚洲巨乳自拍在线视频 | 亚洲欧美精品在线 | 久久r免费视频 | 国产精品久久久精品 | 黄色一级毛片 | 黑人巨大精品欧美一区二区一视频 | 最新免费av网站 | chinese中国真实乱对白 | 成人在线观看免费 | 亚洲v日韩v综合v精品v | 免费成人在线网站 | 国产欧美日韩一区 | 日韩欧美三区 | 黄色男女网站 | 中文字幕精品一区二区三区精品 | 在线视频a | 伊人久久麻豆 | 中文字幕亚洲一区 | 日本欧美在线观看视频 | 国产精品久久久久久久久久了 | 欧美激情免费在线 | 成人免费视频在线观看 | 国产亚韩 | 亚洲区视频| 日本淫视频 | 欧美aaa一级片 | 97影院在线午夜 | 午夜激情影院 |