單片機(jī)中斷問題30例
topen=1;//10ms延時計數(shù)開始
}
由于字?jǐn)?shù)有限,有部分程序給刪了,顯示等部分程序應(yīng)該沒問題,我在其它地方能正常運(yùn)行。
答:
不需要每次在進(jìn)入中斷程序后開一次中斷;EX0=1可以去掉。
實際上,外部中斷工作在邊沿觸發(fā)方式的時候,第一次電平跳變觸發(fā)后進(jìn)入中斷程序,然后硬件自動清除IE0中斷標(biāo)志位。但是在執(zhí)行中斷程序的過程中,如果中斷引腳再次檢測到電平跳變(負(fù)到高),那么IE0會被再次置1 。如果在退出中斷程序之前沒及時清0,那么就會再次引發(fā)一次中斷。
而按鍵的過程,不包括按下和松開時的電平抖動,至少會產(chǎn)生兩次電平跳轉(zhuǎn)。
因此,只需在你中斷程序里適當(dāng)加一點延遲,再將EX=1, 改成IE0=0 。
12、我用的單片機(jī)是8051F的單片機(jī),在程序中我用了兩個中斷。一個是定時計數(shù)器2產(chǎn)生的中斷100MS一次的數(shù)據(jù)采集。另一個是向上位機(jī)發(fā)送采集來的數(shù)據(jù),使用的串口來實現(xiàn)的,用的單片機(jī)的UART來實現(xiàn)。也是一個中斷。這兩個中斷在一起工作時需要注意些什么?我的中斷程序出了一些問題。
(就是默認(rèn)情況下,UART的中斷級別更高,但是有的時候UART的中斷不能及時響應(yīng),這是為甚?)
答:
之前和你做的一樣就兩個中斷 UART0加一個定時器 我用的是C8051F040
你向上位機(jī)發(fā)送數(shù)據(jù)使用UART0時 要確認(rèn)定時器工作完畢
T2定時中斷后 你加一個完成標(biāo)志如T2FLAG
if(T2FLAG==1) 將采集的數(shù)據(jù)放入 UART0的SBUF0 是UART0工作
你100ms的中斷時間 C8051這么快速的單片機(jī)怎么都該發(fā)送完成了吧。
13、MSP430單片機(jī)中斷嵌套,如何跳出中斷?
當(dāng)進(jìn)行A中斷時,來了一個B中斷,我想讓B中斷程序執(zhí)行完后不繼續(xù)
執(zhí)行A中斷而跳出整個中斷,去執(zhí)行主程序,請問這個怎么設(shè)置呢?
答:
中斷的時候會把SR狀態(tài)跟中斷下來要執(zhí)行語句的地址放進(jìn)堆棧中,實現(xiàn)處理完中斷以后cpu要執(zhí)行的語句,注意是地址先進(jìn),SR后進(jìn),出棧時SR先出,地址后出,當(dāng)然了在中斷里面可以嵌套中斷的,對可屏蔽中斷來說,主要是CPU響應(yīng)中斷以后,GIE會自動復(fù)位,所以不能對可屏蔽中斷進(jìn)行嵌套,如果在中斷中要嵌套可屏蔽中斷的話可以開GIE,但要注意的是如果此時正在響應(yīng)的中斷標(biāo)志還是置位的情況下會反復(fù)進(jìn)入此中斷,就像死循環(huán)一樣,這時會引起堆棧的溢出,而在響應(yīng)可屏蔽中斷時,不可屏蔽中斷不受此影響,因為他不受GIE的影響,只受自己單獨的使能位影響。在堆棧中的操作原理類似。
14、MSP430單片機(jī)有幾個需要軟件清除的中斷標(biāo)志?如何清除?
(1)清除各個端口的外中斷用:PxIFG,相應(yīng)的位置0即可;
(2)清除Timer中斷用:TAIFG,TBIFG,相應(yīng)的位置0即可;
答:
MSP430的16個外中斷比如軟件清除Flag,在進(jìn)入外中斷后,首先要做的就是把相應(yīng)的PxIFG清0;
而定時器Timer中斷是自動清除Flag;
還有在中斷嵌套的時候會用到,在進(jìn)入中斷后,MCU會自動把全局中斷位GIE清零,這樣在進(jìn)入本中斷后就不會再相應(yīng)其他中斷,若要進(jìn)行中斷嵌套,必須在進(jìn)入中斷后把GIE再置1.
15、MCS-51系列單片機(jī)的有幾個中斷源?各中斷標(biāo)志是如何產(chǎn)生的?如何清除各中斷標(biāo)志?
答:
標(biāo)準(zhǔn)51有5個中斷向量(不算復(fù)位),分別是外部中斷0,定時器0,外部中斷1,定時器1,串行口;總共有6個中斷標(biāo)志,串行口的發(fā)送和接受共享一個中斷向量。
各個終端標(biāo)志產(chǎn)生情況如下:
外部中斷可以設(shè)置邊沿觸發(fā)或者電平觸發(fā),邊沿觸發(fā)進(jìn)入中斷程序后硬件自動清中斷標(biāo)志,電平觸發(fā)需要軟件清標(biāo)志位;
定時器T0,T1計數(shù)溢出產(chǎn)生中斷,進(jìn)入中斷程序硬件自動清標(biāo)志位;
串行口發(fā)送完成或者接收到數(shù)據(jù)就觸發(fā)中斷,由于是兩個中斷標(biāo)志共享一個中斷向量,所以需要在中斷程序里由軟件判斷是發(fā)送中斷還是接受中斷,并且只能由軟件清標(biāo)志位;
以上是標(biāo)準(zhǔn)51的中斷系統(tǒng),52由于多了一個T2定時器(T2定時器跟T0,T1功能相差很大,T2要強(qiáng)大很多),因此多了一個中斷向量2個中斷標(biāo)志(溢出中斷和T2外部中斷),T2中斷標(biāo)志必須由軟件清除標(biāo)志位
中斷使能位于IE寄存器
各中斷標(biāo)志位于相應(yīng)的模塊控制寄存器里面
模塊 位地位 位名稱 說明
T1 TCON.7 TF1 T1溢出標(biāo)志
T0 TCON.5 TF0 T0溢出標(biāo)志
T2 T2CON.7 TF2 T2溢出中斷標(biāo)志
T2CON.6 EXF2 T2外部中斷標(biāo)志
外部中斷1 TCON.3 IE1 外部中斷1標(biāo)志
外部中斷0 TCON.1 IE0 外部中斷0標(biāo)志
串行口 SCON.1 TI 發(fā)送中斷標(biāo)志
SCON.0 RI 接受中斷標(biāo)志
16、MCS51單片機(jī)的匯編語言的中斷服務(wù)程序最多有幾個?
答:一般而言有5個對:2個外中斷 ,2個定時器中斷, 1個串口中斷。
但是單片機(jī)的中斷服務(wù)資源是根據(jù)硬件的結(jié)構(gòu)設(shè)計,會有不同的數(shù)量和類型的中斷服務(wù),,,因此中斷并不是對語言來講的,而是對于硬件資源來講的。比如52有6個中斷。
基于語言編譯器來講,我就舉例個人感覺最好的開發(fā)51大系列的開發(fā)環(huán)境Keil,其編譯器最多支持32個中斷服務(wù),,,,因此中斷對編譯來說,是一個“模擬”的概念。
17、單片機(jī)中斷改變頻率,為什么幾個輸出頻率無法改變? 程序如下?
#include
#define uchar unsigned char
#define uint unsigned int
uchar T,t1;
unsigned char data table[5] = {486,236,151,111,86} ;
sbit CLK=P2^3 ;
sbit EN=P2^0 ;
void init();
void main()
{
init();
}
void init()
{
EN=1;
T=0;
TMOD=0x01;
EA=1;
TR0=1;
ET0=1;
t1=table[T];
TH0=(65536-t1)/256;
TL0=(65536-t1)%256;
}
void timer0() interrupt 1
{
TMOD=0x01;
EA=1;
TR0=1;
ET0=1;
t1=table[T];
TH0=(65536-t1)/256;
TL0=(65536-t1)%256;
CLK=~CLK;
}
評論