㈠ 匯編語言單片機中斷
ORG 00H ;開始地址
JMP MAIN ;跳轉到主程序
ORG 03H ;外部中斷0地址
JMP EXT1 ;跳轉
ORG 13H ;外部中斷1地址
JMP EXT2 ;跳轉
MAIN:
MOV IE, #85H ;使能中斷 0,1
SETB TCON.2 ;邊沿觸發
SETB TCON.0 ;邊沿觸發
SJMP $ ;--沒有這一句,程序,自己就去執行中斷函數了
EXT1:
MOV P2, #0 ;清0,點亮發光二極體
RETI
EXT2:
MOV P2, #0FFH ;置1,關閉
RETI
END
㈡ 用匯編程序用定時器和中斷,編寫程序
主程序:
push ds ;保存數據段
mov ax,0000
mov ds,ax ;數據段清零
mov ax,offset irq7 ;取中斷程序入口地址
add ax,2000 ;加裝時IP=2000地址
mov si,003c ;填8259中斷7中斷矢量
mov w[si],ax ;填偏移量矢量
mov ax,0000 ;段地址CS=0000H
mov si,003e
mov w[si],ax ;填段地址矢量
pop ds ;彈棧
in al,21 ;讀8259中斷屏蔽字
and al,7f ;開8259中斷7
out 21,al
mov al,b4 ;8253的計數器2為方式2,採用二進制計數,先低後高寫入計數值 10110100
out 43,al ;寫入方式控制字
mov ax,2e9c 0010 1110 1001 1100B 11932D
out 42,al ;寫入低位元組計數值 1001 1100
mov al,ah
out 42,al ;寫入高位元組計數值 0010 1110
mov al,81 ;8255的A口為方式0輸出,B口為方式0輸出,C口下部輸入 1000 0001
out 63,al ;寫方式控制字
call first ;調用first子程序,賦計數初值
begi:hlt 延時等待
sti ;開中斷
mov ah,01
int 16 ;檢測是否按了鍵盤
jz begi
mov ah,00 ;讀鍵值
int 16
cmp al,0d ;是否按了回車
jnz A1
mov si,4000
not [si+04] ;偏移地址為4004的內存單元內容取反
jmp begi
A1:cmp al,1b ;是否按了ESC鍵
jnz A2
call first ;重新賦初值,相當於清零
A2:jmp begi
中斷程序:
irq7:call disp ;調用disp子程序,用來在數碼管顯示數據
mov si,4000
cmp [si+04],00 ;判斷是否按了第2次回車鍵
je A4
call addn ;調用addn子程序,用來計數
A4:mov al,20
out 20,al
cli ;關中斷
iret ;返回
addn程序:
addn:mov si,4000
add [si+03],01 ;百分之一秒加1
cmp [si+03],0a ;判斷是否大於10
jz A5
jmp A9
A5:mov [si+03],00
Add [si+02],01 ;十分之一秒加1
cmp [si+02],0a ;判斷是否大於10
jz A6
jmp A9
A6:mov [si+02],00
add [si+01],01 ;秒位加1
cmp [si+01],0a ;判斷是否大於10
jz A7
jmp A9
A7:mov [si+01],00
add [si],01 ;十秒位加1
cmp [si],06 ;判斷是否大於6
jz A8
jmp A9
A8:mov [si],00 ;大於60:00重新開始
A9: ret
賦初值程序:
first:mov si,4000
mov al,00
mov [si],al
mov [si+01],al
mov [si+02],al
mov [si+03],al
mov [si+04],al
ret
顯示程序:
disp:push ax ;保存AX
mov si,4000 ;指向數據緩沖區
mov dl,f7 ;1111 0111 指向數碼管
mov al,dl ;al=1111 0111
again:out 60,al ;寫埠A
mov al,[si]
mov bx,4100 ;指向數碼緩沖區 bx=0100 0001 0000 0000
and ax,00ff ; ax=0000 0000 al
add bx,ax ;得到顯示代碼 bx=0100 0001 al
mov al,[bx]
out 61,al ;寫埠B
call dally :調用延時程序dally
inc si
mov al,dl
test al,01
jz out
ror al,1 ;指向下一個數碼管
mov dl,al
jmp again
out: pop ax ;彈出AX
ret
dally:push cx ;延時程序
push ax
mov cx,0010
t1 :mov ax,0010
t2 dec ax
jnz t2
loop t1
pop ax
pop cx
ret
數碼緩沖區:
0000:4000 3f,06,5b4f,66,6d,7d,07,7f,6f
二、 設計思想
電子秒錶要實現的功能:用鍵盤中斷來控制整個程序,按一下回車鍵啟動電子秒錶,再按一下暫停,按一下ESC鍵清零,用七段數碼管顯示時間。整個程序涉及到8255、8253與8259三個晶元。8253的OUT2,CLK2分別連接8259的IRQ7與PCLK,8253的GATE2連接正5伏電壓,採用計數器2每隔0.01秒產生一次中斷並且計數,寫入以偏移地址4000H開始的4個內存單元,然後利用8255將內存單元的數據輸出到七段數碼管。由於鍵盤中斷優先於8259的7號中斷,所以程序只有在按一下回車鍵才啟動電子秒錶,再按一下暫停,按一下ESC鍵清零,如果超出了60秒,整個程序自動重新開始。
三、 所用晶元工作原理
8255:介面電路在CPU和I/O設備之間起著信號的變換和傳輸的作用。 任何介面電路與CPU之間的信息傳輸方式都是並行的,即CPU與介面電路之間以數據位元組/字為單位傳送信息。介面電路與I/O設備之間的信息傳送方式,有並行和串列兩種,相應的介面電路稱為並行介面和串列介面。
並行介面是在多根數據線上,以數據位元組/字與I/O設備交換信息。在輸入過程中,輸入設備把數據送給介面,並且使狀態線「輸入准備好」有效。介面把數據存放在「輸入緩沖寄存器」中,同時使「輸入回答」線有效,作為對外設的響應。外設在收到這個回答信號後,就撤消數據和「輸入准備好」信號。數據到達介面中後,介面會在「狀態寄存器」中設置輸入准備好標志,或者向CPU發一個中斷請求。CPU可用查詢方式或中斷方式從介面中讀取數據。介面中的數據被讀取後,介面會自動清除狀態寄存器中的標志,且撤消對CPU的中斷請求。
在輸出過程中,每當輸出寄存器可以接收數據,介面就會將狀態寄存器中「輸出准備好」狀態置1或向CPU發一個中斷請求,CPU可用查詢或中斷方式向介面輸出數據。當CPU輸出的數據到達介面後,介面會清除「輸出准備好」狀態,把數據送往外設,並向外設發一個「數據輸出准備好」信號。外設受到驅動後,便接收數據,並向介面電路發一個「輸出回答」信號,介面收到該回答信號後,又將狀態寄存器中「輸出准備好」置位,以便CPU輸出下一個數據。
8253:對CLK信號進行「減1計數」。首先CPU把「控制字」,寫入「控制寄存器」,把「計數初始值」寫入「初值寄存器」,然後, 定時/計數器按控制字要求計數。計數從「計數初始值 開始,每當CLK信號出現一次,計數值減1,當計數值減為0時,從OUT端輸出規定的信號(具體形式與工作模式有關)。當CLK信號出現時,計數值是否減1(即是否計數),受到「門控信號」GATE的影響,一般,僅當GATE有效時,才減1.門控信號GATE如何影響計數操作,以及輸出端OUT在各種情況下輸出的信號形式與定時/計數器的工作模式有關。
8259:1. IR線上提出了中斷請求的中斷源,即出現請求,IRR中斷請求寄存器(共有8位D7~D0)對應於連接在IR0~IR7線上的外設的中斷請求,哪一根輸入線有請求,哪一根輸入線就置1。
2. 若OCW1(IMR中斷屏蔽寄存器)未使該中斷請求屏蔽(對應位為0時不屏蔽),該請求被送入PR(優先權分析器)比較。否則,不送入PR比較。
3. PR把新進入的請求與ISR(服務中寄存器)中正在被處理的中斷進行比較。如果新進入的請求優先順序較低,則8259不向CPU提出請求。如果新進入的請求優先順序較高,則8259使INT引腳輸出高電平,向CPU提出請求。
4. 如果CPU內部的標志寄存器中的IF(中斷允許標志)為0,CPU不響應該請求。若IF=1,CPU在執行完當前指令後,從CPU的INTA引腳上向8259發出兩個負脈沖。
5.第一個 INTA負脈沖到達8259時,8259完成以下三項工作:
a.使IRR(中斷請求寄存器)的鎖存功能失效。這樣一來,在IR7~IR0上的請求信號就不會被8259接收。直到第二個INTA負脈沖到達8259時,才又使IRR的鎖存功能有效。
b.使ISR(服務中寄存器)中的相應位置1。
c.使IRR中的相應位清0。
6.第二個INTA負脈沖到達8259時,8259完成以下工作:
a.將中斷類型碼(ICW2中的值)送到數據匯流排上,CPU將其保存在「內部暫存器」中。
b.如果ICW4(它設定級中斷聯方式之特定完全嵌套方式,將在8259的工作方式中詳述ICW4)中設置了中斷自動結束方式,則將ISR的相應位清0。
㈢ 西門子PLC的 ATCH中斷指令使用
中斷連接指令(ATCH)使中斷事件(EVNT)與中斷程序號碼(INT)相聯系,並啟動中斷事件。根據指定事件優先順序組,PLC按照先來先服務的順序對中斷提供服務。
任何時刻只能激活一個用戶中斷。其它中斷處於激活狀態時,CPU發出中斷暫時入隊,等待以後處理。如果發生的中斷數目過多,隊列無法處理,則設定隊列溢出狀態位。當隊空時,重置這些位。
中斷程序必須由三部分構成:中斷程序標號(即中斷事件的編號)、中斷程序指令和無條件返回指令。在中斷程序中不能使用DISI、ENI、HDEF、L SCR和END指令。
(3)中斷觸發指令怎麼編程擴展閱讀:
中斷優先順序
給中斷源指定處理的次序就是給中斷源確定中斷優先順序。中斷按以下固定的優先順序順序執行:通信(最高優先順序)、I/O中斷和定時中斷(最低優先順序)。在上述3個優先順序范圍內,CPU按照先來先服務的原則處理中斷,任何時刻只能執行一個用戶中斷程序。
如果發生中斷過於頻繁,使中斷產生的速率比可處理的速率快,或中斷被DISI指令禁止,中斷隊列溢出狀態位被置1。只應在中斷程序中使用這些位,因為當隊列變空或返回主程序時,這些位會被復位。
㈣ 單片機中斷初始化程序 編程
void INT_init()//初始化
{
IT0 = 0;//外部中斷0低電平觸發
IT1 = 1;//外部中斷1低電平觸發
PX0 = 1;//外部中斷0分配高優先順序
PX1=0;
IE = 0x85;//使能全局中斷,外部中斷0,外部中斷1
}
void EX_INT0() interrupt 0//外部中斷0
{
//添加自己的功能代碼
IE0=0;//清零中斷標志位
}
void EX_INT1() interrupt 2//外部中斷1
{
//添加自己的功能代碼
IE1=0;
}
㈤ 怎樣用C語言編寫一個DOS下的中斷服務程序
DOS中斷中斷屬於匯編層面的內容,可以用asm內聯實現:
在windows visual c++下用__asm關鍵字。
在gcc下用__asm__宏即可。
示例(vc):
#include<stdio.h>
intmain()
{
__asmint3h;
return0;
}
這樣就可以在C裡面寫入匯編代碼了。
__asm關鍵字用於調用內聯匯編程序,並且可在 C 或 C++ 語句合法時出現。它不能單獨出現。必須後跟匯編指令、一組在大括弧中的命令、或者至少一對空大括弧。術語 「__asm塊」在此處指任何命令或命令組,不管是否在大括弧內。
如果不與大括弧一起使用,則__asm關鍵字表示此行的其餘部分是一條匯編語言語句。如果與大括弧一起使用,則該關鍵字表示大括弧之間的每一行都是一條匯編語言語句。為了與早期版本兼容,_asm是__asm的同義詞。
由於__asm關鍵字是語句分隔符,因此您可以將程序集指令放在同一行中。
在 Visual C++ 2005 之前,指令
__asm int 3
不會導致在使用/clr編譯時生成本機代碼;編譯器會將該指令轉換為 CLR 中斷指令。
__asm int 3現在將導致為函數生成本機代碼。如果您希望函數導致代碼中出現斷點,還希望將函數編譯為 MSIL,請使用__debugbreak。