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