㈠ 51單片機c語言編程中產生中斷的條件是什麼
三個:
1.總中斷使能位EA=1
2.相應中斷使能 (ET0、EX0……) 打開
3.中斷源:外部中斷引腳的電平觸發、定時器溢出……
oid PxInt0(void) interrupt 0 //定義外部中斷0
void PxInt1(void) interrupt 2 //定義外部中斷1
void time0_int(void) interrupt 1 //定義定時器0
void time1_int(void) interrupt 3 //定義定時器1
這里為什麼是 0 1 2 3的順序呢~?其實是單片機內部默認的,順序依次是:
0 外部中斷0
1 定時/計數器0
2 外部中斷1
3 定時/計數器1
4 串列口中斷
這個是沒有什麼理由的,記住就行,以後要定義一個中斷的時候,定義的是哪一個,就在後面加上它的序號就行了,比如void PxInt0(void) interrupt 0 表示外部中斷0,就在後面加上interrupt 0.
逐詞解釋的話。。。如:void PxInt0(void) interrupt 0
void的意思是沒有返回值,Pxint0(void)是你定義的函數名,interrupt表示你定義的是中斷函數,0表示你定義的是外部中斷0
後面的依此類推。
另外,中斷函數不需要在main函數前聲明,當單片機檢測到中斷所需的信號時,它會自動立即停止正在進行的工作進入中斷函數。
㈡ 單片機C語言問題,中斷問題
代碼太長,沒細看
我感覺問題可能是:
1,中斷初始化是否完善,是否中斷使能,
2,進入中斷程序的時候,要禁止中斷,
你的那個問題:中斷初始化完成後,會中斷產生會自動調用中斷函數。
㈢ C51單片機C語言中斷問題
51單片機12M晶振時,定時/計數器的時鍾為1uS,所以單個16位的定時/計數器能達到的最大定時時間為:65536*1uS=65.536ms,所以12M晶振的情況下,用單個16位定時器得不到100ms的定時。這時可更換頻率較低的晶振或用以下兩種軟體的方法:
1、定時器累加。用一個計數值來記錄定時器的中斷次數。比如,設定定時器10ms中斷,用一個計數值來記錄定時器的中斷次數,每中斷一次計數加1,這樣計數值為10時候,定時器中斷10次,即為100ms,然後將計數值清0,重新計數。這個方法會有小小誤差,因為操作計數值的時候會佔用一點時間,這個時間比較短。
2、2個定時/計數器串聯。一個用作定時器,一個用作計數器。定時器中斷的時候輸出一個脈沖作為計數器的計數脈沖,設定一個計數值,計數滿的時候中斷。總的定時時間的原理同上。
至於定時/計數器的操作,樓上兩位說得很清楚了。
㈣ 單片機c語言中的中斷問題
1.void(中斷函數返回類型(空型)) Time1 (中斷函數名)(void(參數類型) interrupt 3 (中斷號)
2: 中斷條件發生時執行中斷,比如void Time1(void) interrupt 3 是定時器1定時時間到發生中斷,中斷函數放在那裡無所謂
3:void PxInt0(void) interrupt 0 中斷名為PxInt0的0號中斷
void PxInt1(void) interrupt 2 中斷名為PxInt1的2號中斷
void time0_int(void) interrupt 1 中斷名為time0_int的1號中斷
void time1_int(void) interrupt 3 中斷名為time1_int的3號中斷
4:中斷的代碼是你想中斷執行的工作,中斷的代碼是根據任務,需要你自己寫的
㈤ 單片機 C語言 中斷
TR0是控制T0時間中斷的。TR0=1,中斷開啟但並不是馬上中斷,要等寄存器加到滿後才產生中斷,執行中斷程序。執行完中斷程序內容後返回,等待下次中斷。一般不會關閉中斷。如果你只執行一次中斷那你就得寫一句TR0=0.
㈥ 單片機C語言一個中斷的問題
51單片機,不會在中斷過程中,再響應同等級別的中斷。
只有退出該中斷後,如果剛才的中斷申請標志還存在,才會再次進入中斷程序。
㈦ 單片機C語言 中斷
我先說說interrupt關鍵字的意思。
interrupt聲明 表示中斷向量中(8*n+3)這里,n就是interrupt參數後的那個數字這里,生成 LJMP XXX 這樣一條指令.
假設你寫的是void spi_server() interrupt 5 using 0
那麼C51會自動在8*5+3這個地方生產LJMP ?C_SPI_SERVER。
當你的單片機響應了SPI中斷,那麼PC會自動跳到8*5+3這個地方,然後就跳到了spi_server()。希望能幫到你。
㈧ 單片機C語言中斷問題
你有個地方沒弄清楚。單片機執行的是機器碼,機器碼對應的是匯編指令。而C語言表述的句子,會編譯成若干匯編指令。就是說沒有C指令這一說,以51舉例,_nop_()對應匯編的NOP,但是一個簡單的a*b,編譯後可能長度就有好幾百位元組。
每條指令執行的周期不同。有些只要一個周期,有些需要幾個周期。中斷標志出現後,必須把當前執行的匯編指令執行完,才能響應中斷。
你的調用數組,也涉及到數據首地址,偏移量,讀寫數據等操作。這些操作是由好多個指令組合的。在這個過程中,產生中斷,會對數據有不可預知的影響。
如果要避免這個情況,只要調用這個數組前先關中斷。處理完數組後再開中斷就行了。