新聞中心

單片機(jī)中斷問題30例

作者: 時(shí)間:2013-05-07 來源:網(wǎng)絡(luò) 收藏

topen=1;//10ms延時(shí)計(jì)數(shù)開始

}

由于字?jǐn)?shù)有限,有部分程序給刪了,顯示等部分程序應(yīng)該沒問題,我在其它地方能正常運(yùn)行。

答:

不需要每次在進(jìn)入中斷程序后開一次中斷;EX0=1可以去掉。

實(shí)際上,外部中斷工作在邊沿觸發(fā)方式的時(shí)候,第一次電平跳變觸發(fā)后進(jìn)入中斷程序,然后硬件自動(dòng)清除IE0中斷標(biāo)志位。但是在執(zhí)行中斷程序的過程中,如果中斷引腳再次檢測(cè)到電平跳變(負(fù)到高),那么IE0會(huì)被再次置1 。如果在退出中斷程序之前沒及時(shí)清0,那么就會(huì)再次引發(fā)一次中斷。

而按鍵的過程,不包括按下和松開時(shí)的電平抖動(dòng),至少會(huì)產(chǎn)生兩次電平跳轉(zhuǎn)。

因此,只需在你中斷程序里適當(dāng)加一點(diǎn)延遲,再將EX=1, 改成IE0=0 。

12、我用的是8051F的,在程序中我用了兩個(gè)中斷。一個(gè)是定時(shí)計(jì)數(shù)器2產(chǎn)生的中斷100MS一次的數(shù)據(jù)采集。另一個(gè)是向上位機(jī)發(fā)送采集來的數(shù)據(jù),使用的串口來實(shí)現(xiàn)的,用的的UART來實(shí)現(xiàn)。也是一個(gè)中斷。這兩個(gè)中斷在一起工作時(shí)需要注意些什么?我的中斷程序出了一些問題。

(就是默認(rèn)情況下,UART的中斷級(jí)別更高,但是有的時(shí)候UART的中斷不能及時(shí)響應(yīng),這是為甚?)

答:

之前和你做的一樣就兩個(gè)中斷 UART0加一個(gè)定時(shí)器 我用的是C8051F040

你向上位機(jī)發(fā)送數(shù)據(jù)使用UART0時(shí) 要確認(rèn)定時(shí)器工作完畢

T2定時(shí)中斷后 你加一個(gè)完成標(biāo)志如T2FLAG

if(T2FLAG==1) 將采集的數(shù)據(jù)放入 UART0的SBUF0 是UART0工作

你100ms的中斷時(shí)間 C8051這么快速的單片機(jī)怎么都該發(fā)送完成了吧。

13、MSP430單片機(jī)中斷嵌套,如何跳出中斷?

當(dāng)進(jìn)行A中斷時(shí),來了一個(gè)B中斷,我想讓B中斷程序執(zhí)行完后不繼續(xù)

執(zhí)行A中斷而跳出整個(gè)中斷,去執(zhí)行主程序,請(qǐng)問這個(gè)怎么設(shè)置呢?

答:

中斷的時(shí)候會(huì)把SR狀態(tài)跟中斷下來要執(zhí)行語(yǔ)句的地址放進(jìn)堆棧中,實(shí)現(xiàn)處理完中斷以后cpu要執(zhí)行的語(yǔ)句,注意是地址先進(jìn),SR后進(jìn),出棧時(shí)SR先出,地址后出,當(dāng)然了在中斷里面可以嵌套中斷的,對(duì)可屏蔽中斷來說,主要是CPU響應(yīng)中斷以后,GIE會(huì)自動(dòng)復(fù)位,所以不能對(duì)可屏蔽中斷進(jìn)行嵌套,如果在中斷中要嵌套可屏蔽中斷的話可以開GIE,但要注意的是如果此時(shí)正在響應(yīng)的中斷標(biāo)志還是置位的情況下會(huì)反復(fù)進(jìn)入此中斷,就像死循環(huán)一樣,這時(shí)會(huì)引起堆棧的溢出,而在響應(yīng)可屏蔽中斷時(shí),不可屏蔽中斷不受此影響,因?yàn)樗皇蹽IE的影響,只受自己?jiǎn)为?dú)的使能位影響。在堆棧中的操作原理類似。

14、MSP430單片機(jī)有幾個(gè)需要軟件清除的中斷標(biāo)志?如何清除?

(1)清除各個(gè)端口的外中斷用:PxIFG,相應(yīng)的位置0即可;

(2)清除Timer中斷用:TAIFG,TBIFG,相應(yīng)的位置0即可;

答:

MSP430的16個(gè)外中斷比如軟件清除Flag,在進(jìn)入外中斷后,首先要做的就是把相應(yīng)的PxIFG清0;

而定時(shí)器Timer中斷是自動(dòng)清除Flag;

還有在中斷嵌套的時(shí)候會(huì)用到,在進(jìn)入中斷后,MCU會(huì)自動(dòng)把全局中斷位GIE清零,這樣在進(jìn)入本中斷后就不會(huì)再相應(yīng)其他中斷,若要進(jìn)行中斷嵌套,必須在進(jìn)入中斷后把GIE再置1.

15、MCS-51系列單片機(jī)的有幾個(gè)中斷源?各中斷標(biāo)志是如何產(chǎn)生的?如何清除各中斷標(biāo)志?

答:

標(biāo)準(zhǔn)51有5個(gè)中斷向量(不算復(fù)位),分別是外部中斷0,定時(shí)器0,外部中斷1,定時(shí)器1,串行口;總共有6個(gè)中斷標(biāo)志,串行口的發(fā)送和接受共享一個(gè)中斷向量。

各個(gè)終端標(biāo)志產(chǎn)生情況如下:

外部中斷可以設(shè)置邊沿觸發(fā)或者電平觸發(fā),邊沿觸發(fā)進(jìn)入中斷程序后硬件自動(dòng)清中斷標(biāo)志,電平觸發(fā)需要軟件清標(biāo)志位;

定時(shí)器T0,T1計(jì)數(shù)溢出產(chǎn)生中斷,進(jìn)入中斷程序硬件自動(dòng)清標(biāo)志位;

串行口發(fā)送完成或者接收到數(shù)據(jù)就觸發(fā)中斷,由于是兩個(gè)中斷標(biāo)志共享一個(gè)中斷向量,所以需要在中斷程序里由軟件判斷是發(fā)送中斷還是接受中斷,并且只能由軟件清標(biāo)志位;

以上是標(biāo)準(zhǔn)51的中斷系統(tǒng),52由于多了一個(gè)T2定時(shí)器(T2定時(shí)器跟T0,T1功能相差很大,T2要強(qiáng)大很多),因此多了一個(gè)中斷向量2個(gè)中斷標(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ī)的匯編語(yǔ)言的中斷服務(wù)程序最多有幾個(gè)?

答:一般而言有5個(gè)對(duì):2個(gè)外中斷 ,2個(gè)定時(shí)器中斷, 1個(gè)串口中斷。

但是單片機(jī)的中斷服務(wù)資源是根據(jù)硬件的結(jié)構(gòu)設(shè)計(jì),會(huì)有不同的數(shù)量和類型的中斷服務(wù),,,因此中斷并不是對(duì)語(yǔ)言來講的,而是對(duì)于硬件資源來講的。比如52有6個(gè)中斷。

基于語(yǔ)言編譯器來講,我就舉例個(gè)人感覺最好的開發(fā)51大系列的開發(fā)環(huán)境Keil,其編譯器最多支持32個(gè)中斷服務(wù),,,,因此中斷對(duì)編譯來說,是一個(gè)“模擬”的概念。

17、單片機(jī)中斷改變頻率,為什么幾個(gè)輸出頻率無法改變? 程序如下?

#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;

}



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉