導航:首頁 > 操作系統 > 單片機中斷的程序

單片機中斷的程序

發布時間:2022-11-20 02:02:40

❶ c語言怎麼編寫單片機的中斷

給你上個較完整的程序,可以直接在KEIL中運行並觀察輸出
/******************************************************************************
功能:
本程序在12M晶振模式下,通過定時器中斷精確實現數字時鍾計時操作,並在KEIL
中實現輸出。時、分、秒的變化在定時中斷里處理。
說明:
因採用工作方式2,自動裝入初值,所以此程序計時很精確,只是在KEIL中模擬輸
出顯示的變化速度很快,這點可不理會
******************************************************************************/
#include
#include
#define
TEST
//此行用於KEIL輸出顯示,如果不需要顯示可將其刪除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定時器8位自動裝入模式下寄存器初值,0.25ms中斷一次
char
cHour;
//時
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒計數,計數達到4000時1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒發生變化標志,每秒送一次輸出顯示,送顯完成後清0,提高主程序效率
//==============================================================================
//T0定時器中斷服務程序,12M晶振下每0.25ms產生中斷,本程序執行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒計數值+1
if(iCount==4000)
{//時間計數達到1S
iCount
=
0;
//重新開始下一秒計數
cSec++;
//時鍾:秒+1
bSecChanged
=
1;
//置秒發生變化標志
if(cSec==60)
{//計夠60s
cSec
=
0;
//重新開始下一分計數
cMin++;
//時鍾:分+1
}
if(cMin==60)
{//計夠60分鍾
cMin
=
0;
//重新開始下一小時計數
cHour++;
//時鍾:小時+1
}
if(cHour==24)
{//計夠24小時
cHour
=
0;
//重新開始第二天計數
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//輸出字元串,我的編譯器可能有問題,直接輸出有錯
TMOD
=
0X02;//工作方式2,8位自動重裝計時模式
TH0
=
TH0TL0_INIT;
//0.25ms中斷一次
TL0
=
TH0TL0_INIT;
//0.25ms中斷一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//時
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒計數
bSecChanged
=
0;
outstr[2]
=
':';
//時分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字元串結束符
EA=1;
//開總中斷
ET0=1;
//允許T0中斷
TR0=1;
//啟動T0
while(1)
{
if(bSecChanged==1)
{//秒發生變化,將時間值轉換為可顯示字元串准備送顯示
bSecChanged
=
0;//清除標志,節省CPU資源
outstr[0]
=
cHour/10
+
0x30;
//將秒轉換為ASCII碼
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//將分轉換為ASCII碼
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//將小時轉換為ASCII碼
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中顯示時鍾
#endif
}
}
}

❷ 簡述單片機中斷程序的組成

在匯編語言里
中斷程序首先有入口地址(比如ORG 0003H) 之後是中斷處理語句 最後有一個返回指令RETI;
例如:
ORG 000BH
LJMP TION
MOV R4,#0
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
WAIT: SJMP WAIT
TION: INC R4
CJNE R4,#10,timer
timer:MOV TH0,#3CH
MOV TL0,#0B0H
RETI

如果你說的是C51
中斷程序結構如下:
void 中斷程序名(void) interrupt n using m //確定中斷源和中斷程序所用寄存器
{
// 中斷處理部分
}
例如:
void Time0_int(void) interrupt 1 using 1
{
uchar led,i;
led=0xfe;
P1=led;
delay(500);
for(i=0;i<8;i++)
{
led=(led<<1)|0x01;
P1=led;
delay(500);
}
}

❸ 簡述8051單片機中斷響應過程

單片機一旦響應中斷請求, 就由硬體完成以下功能:

(1) 根據響應的中斷源的中斷優先順序, 使相應的優先順序狀態觸發器置1;

(2) 執行硬體中斷服務子程序調用, 並把當前程序計數器PC的內容壓入堆棧,保護斷點,尋找中斷源;

(3) 清除相應的中斷請求標志位(串列口中斷請求標志RI和TI除外);

(4) 把被響應的中斷源所對應的中斷服務程序的入口地址(中斷矢量)送入PC, 從而轉入相應的中斷服務程序。

(5)中斷返回,程序返回斷點處繼續執行。

(3)單片機中斷的程序擴展閱讀:

單片機應用分類:

單片機(Microcontrollers)作為計算機發展的一個重要分支領域,根據發展情況,從不同角度,單片機大致可以分為通用型/專用型、匯流排型/非匯流排型及工控型/家電型。

通用型:

這是按單片機(Microcontrollers)適用范圍來區分的。例如,80C51式通用型單片機,它不是為某種專門用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。

匯流排型:

這是按單片機(Microcontrollers)是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接。

另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。

控制型:

這是按照單片機(Microcontrollers)大致應用的領域進行區分的。一般而言,工控型定址范圍大,運算能力強;用於家電的單片機多為專用型,通常是小封裝、低價格,外圍器件和外設介面集成度高。 顯然,上述分類並不是惟一的和嚴格的。例如,80C51類單片機既是通用型又是匯流排型,還可以作工控用。

參考資料:網路——單片機

❹ 單片機中斷處理流程

當某中斷產生而且被CPU響應,主程序被中斷,接下來將執行如下操作:
1.
當前正被執行的指令全部執行完畢;
2.
PC值被壓入棧;
3.
現場保護;
4.
阻止同級別其他中斷;
5.
將中斷向量地址裝載到程序計數器PC;
6.
執行相應的中斷服務程序。
中斷服務程序ISR完成和該中斷相應的一些操作。ISR以RETI(中斷返回)指令結束,將PC值
從棧中取回,並恢復原來的中斷設置,之後從主程序的斷點處繼續執行。

❺ 什麼是單片機的中斷

不同的計算機其硬體結構和軟體指令是不完全相同的,因此,中斷系統也是不相同的。

計算機的中斷系統能夠加強CPU對多任務事件的處理能力。中斷機制是現代計算機系統中的基礎設施之一,它在系統中起著通信網路作用,以協調系統對各種外部事件的響應和處理。中斷是實現多道程序設計的必要條件。 中斷是CPU對系統發生的某個事件作出的一種反應。

引起中斷的事件稱為中斷源。中斷源向CPU提出處理的請求稱為中斷請求。發生中斷時被打斷程序的暫停點稱為斷點。

CPU暫停現行程序而轉為響應中斷請求的過程稱為中斷響應。處理中斷源的程序稱為中斷處理程序。

CPU執行有關的中斷處理程序稱為中斷處理。而返回斷點的過程稱為中斷返回。中斷的實現實行軟體和硬體綜合完成,硬體部分叫做硬體裝置,軟體部分稱為軟體處理程序。

響應處理

大多數中斷系統都具有如下幾方面的操作,這些操作是按照中斷的執行先後次序排列的。

1、 接收中斷請求。

2、 查看本級中斷屏蔽位,若該位為1則本級中斷源參加優先權排隊。

3、 中斷優先權選擇。

4、 處理機執行完一條指令後或者這條指令已無法執行完,則立即中止現行程序。接著,中斷部件根據中斷級去指定相應的主存單元,並把被中斷的指令地址和處理機當前的主要狀態信息存放在此單元中。

5、 中斷部件根據中斷級又指定另外的主存單元,從這些單元中取出處理機新的狀態信息和該級中斷控製程序的起始地址。

6、 執行中斷控製程序和相應的中斷服務程序。

7、 執行完中斷服務程序後,利用專用指令使處理機返回被中斷的程序或轉向其他程序。

沖突

在一些罕見的情況下,兩個ISA設備可以共享相同的 IRQ,只要它們不同時使用即可。為了解決這個問題,後來的PCI 匯流排允許 IRQ 共享。PCI Express沒有物理中斷線,並使用消息信號中斷(MSI) 到操作系統(如果可用)。

在早期的 IBM 兼容個人計算機中,中斷曾經是一種常見的硬體錯誤,當兩個設備嘗試使用相同的中斷請求(或 中斷)向可編程中斷控制器(PIC)發出中斷信號時會收到該錯誤。

PIC 期望每條線路僅來自一個設備的中斷請求,因此沿同一條線路發送中斷信號的多個設備通常會導致 中斷 沖突,從而導致計算機死機。

例如,如果在系統中添加數據機擴展卡並分配給中斷4,傳統上分配給串列埠1,則可能會導致中斷沖突。最初,中斷 7 是使用音效卡的常見選擇,但後來發現 中斷 7 會干擾列印機埠(LPT1)時使用了中斷5。該串列埠經常禁用可以用於其他設備的中斷線。

中斷 2/9 是 MPU-401 MIDI 埠的傳統中斷線,但這與ACPI系統控制中斷(SCI 在 Intel 晶元組上硬連線到 中斷9)沖突;

這意味著 ISAMPU-401帶有硬連線中斷2/9 的卡和帶有硬編碼 中斷 2/9 的 MPU-401 設備驅動程序不能在啟用 ACPI 的系統上以中斷驅動模式使用。

以上內容參考網路-中斷

❻ 單片機編程時中斷程序如何使用

中斷程序不是使用的,是當單片機的中斷源有中斷請求時,以允許中斷的情況下,就是自動轉到中斷程序去執行了。所以,編程時,需要在中斷完成什麼任務,都要寫到中斷程序中就行了,會自己去執行的。而不需要你去使用的。

❼ 單片機中斷程序

結構很規矩,這個程序。

首先單片機上電復位,運行死循環前面的程序(,你這里就是init_timer(); // 應該叫初始化定時器,才合適,讓定時器按照你需要的定時長度工作,或叫產生中斷 )
接下來單片機主程序就是一直在死循環了。我們的主要任務一般在這里處理。
中斷,就是在處理一些特殊任務,比如按鍵,或定時處理的程序,或外部一個不知道什麼時間發生的任務,或通信任務等等。你在主循環的時候,無論在什麼時候,中斷請求來了(可以理解為需要處理比較緊急任務,優先處理的任務),就會暫停主循環,進入對應中斷服務程序。運行完,在回主循環的暫停地方,繼續執行死循環的任務。
定時器中斷,就是每過一定時間,運行一下中斷服務程序。常用來計時和產生脈沖信號。

初始化定時器,就是給定時器的寄存器,設置工作模式,時鍾源,溢出的計數值。設置好了,定時器就能根據每個時鍾源的頻率,進行計數,直至溢出,然後產生一個中斷請求。如果不餓能自動載入計數初值的定時器,在中斷處理函數(服務函數)必須手動載入初值。

❽ 單片機中斷服務程序

定時器的原理是這樣的,你運行主程序的時候,只要打開定時器(給幾個控制位賦值)並且給了定時器初值,單片機會一邊繼續運行主程序,一邊計時,互不幹擾。當計時器滿了,溢出的時候,單片機才會停下主程序,進入中斷子程序,執行完中斷裡面的內容,再返回主程序。主程序裡面是while(1),所以一直在跑,每次定時器到了你定好的時間,就會執行一遍中斷。

❾ 51單片機中斷程序怎麼寫

//sbit zd=P3^2; //外部中斷口 //unsigned char a; void main(void)//主函數{TCON=0x01;EX0=1; //外部中斷允許 EA=1;//開總中斷while(1){//其他程序}} void int0(void) interrupt 0 //外部中斷0 中斷子程序{//這裡面可以寫中斷子程序/*a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //開關計時器 else TR0=0;*/} 由於對你的要求「按下INTO接的按鍵,使單片機執行間隔四燈輪流閃爍的中斷子程序」不夠理解,只能給你這樣一個程序框架了 進入中斷要執行中斷子程序,不同的中斷源要進入不同的中斷子程序。對於51的C編程,可以用中斷標號,如『interrupt 0』來使中斷進入不同的中斷。 中斷標號與它們的中斷優先順序一致,即 外部中斷0 interrupt 0 定時器中斷0 interrupt 1 外部中斷1 interrupt 2 定時器中斷1 interrupt3

❿ 單片機串口中斷執行流程

流程是:(主程序中)發送數據―等待中斷―發送成功產生中斷―進入中斷清除TL,再次發送―中斷返回―等待中斷―發送成功產生中斷―進入中斷清除TL,再次發送。。。。循環而已。

閱讀全文

與單片機中斷的程序相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163