?? int0.asm
字號(hào):
/****************************************************************************/
/* */
/* Copyright (c) 2005, 老樹工作室 */
/* All rights reserved. */
/* */
/* Email:laoshu0902@163.com */
/* www.laoshu0902.bokee.com */
/* */
/****************************************************************************/
;+============================================================================+
;| 8051 偽指令定義 |
;+============================================================================+
WDI EQU 085H ;定義看門狗的清除標(biāo)志
count1_Stat EQU 01H ;定義外部中斷數(shù)量到時(shí)的標(biāo)志
;+============================================================================+
;| 8051 中斷處理程序入口 |
;+============================================================================+
ORG 0000H ;程序開始
LJMP main ;跳轉(zhuǎn)主程序
ORG 0003H ;外部中斷int0的中斷入口地址
LJMP EI0_ISR ;跳轉(zhuǎn)定時(shí)器INT0中斷服務(wù)子程序
;通常子程序的長(zhǎng)度要大于2個(gè)中斷之間的空間
;所以放到子程序中執(zhí)行
ORG 000BH ;定時(shí)器t0的中斷入口地址
LJMP T0_ISR ;跳轉(zhuǎn)定時(shí)器0中斷服務(wù)子程序
ORG 0013H ;外部中斷int1的中斷入口地址
LJMP EI1_ISR ;跳轉(zhuǎn)定時(shí)器INT1中斷服務(wù)子程序
ORG 0023H ;串口中斷的中斷入口地址
LJMP INTERS ;跳轉(zhuǎn)串口中斷服務(wù)子程序
;+============================================================================+
;| 8051 主程序 |
;+============================================================================+
ORG 100H ;主程序從地址100H開始執(zhí)行
;是為了避開以上這些中斷
;當(dāng)然程序可以從30H開始
;從這個(gè)地址開始主要是為了HEX文件的好閱讀
;閱讀HEX文件,使用ultraedit的最新中文版本
;+============================================================================+
;| 8051 定時(shí)器、外部中斷、串口配置 |
;+============================================================================+
main: MOV SP,#70H ;設(shè)置堆棧,以下是單片機(jī)初始化
MOV TMOD,#21H ;設(shè)置定時(shí)器1和串行接口參數(shù)9600波特率,時(shí)鐘11.0592MHz
MOV TL1,#0FDH ;定時(shí)器1參數(shù)的設(shè)置
MOV TH1,#0FDH
SETB TR1 ;啟動(dòng)定時(shí)器1中斷
MOV SCON,#50H ;啟動(dòng)串口控制寄存器
SETB ES ;啟動(dòng)串口中斷
SETB ET0 ;啟動(dòng)定時(shí)器t0中斷
CLR IT0 ;選擇外部中斷0為低電平觸發(fā)
CLR IT1 ;選擇外部中斷1為低電平觸發(fā)
SETB EX0 ;啟動(dòng)外部中斷0
; SETB EX1 ;啟動(dòng)外部中斷1
MOV TH0,#0B1H ;設(shè)置定時(shí)器0參數(shù),定時(shí)器0的中斷周期大約為2ms
MOV TL0,#0E0H
CLR RS0 ;設(shè)置寄存器區(qū)基本參數(shù)
CLR RS1
SETB TR0 ;啟動(dòng)定時(shí)器0中斷
SETB IP.4 ;設(shè)置中斷優(yōu)先級(jí),串口中斷為最高
CLR IP.1 ;設(shè)置定時(shí)器0優(yōu)先級(jí),低于串口中斷
SETB EA ;啟動(dòng)全部中斷
MOV R0,#500 ;裝數(shù)50
MOV A,#11111110B ;對(duì)A初始化,準(zhǔn)備把A的數(shù)字送到P1
;+============================================================================+
;| 8051 主流程 |
;+============================================================================+
L01: CPL WDI ;對(duì)看門狗取反
JB count1_STAT,L01 ;判斷T0_STAT是否為0,如果為0,表示1s的定時(shí)時(shí)間到,
;進(jìn)入移位操作,否則返回循環(huán)
L02: MOV P1,A
LCALL DLY4MS
RL A
MOV R0,#500 ;重新裝數(shù)50
SETB count1_Stat ;重新設(shè)置計(jì)數(shù)器中斷滿標(biāo)志位
SJMP L01
;+============================================================================+
;| 定時(shí)器0中斷服務(wù)子程序 |
;+============================================================================+
T0_ISR: CPL P1.0 ;對(duì)P1.0取反,設(shè)置定時(shí)器中斷到的標(biāo)志,在示波器上可以看到方波
MOV TH0,#0B1H ;重新設(shè)置定時(shí)器0定時(shí)參數(shù)
MOV TL0,#0E0H
SETB ET0 ;允許定時(shí)器0中斷
SETB TR0 ;啟動(dòng)定時(shí)器0
RETI ;中斷服務(wù)子程序返回,RETI是中斷子程序返回的命令代碼
;與子程序的RET不同
;+============================================================================+
;| 串口接收中斷服務(wù)子程序 |
;+============================================================================+
INTERS: CLR ES ;禁止串行中斷
JBC RI,RECINT ;判斷接收標(biāo)志為有接收數(shù)據(jù)嗎?有則將接收標(biāo)志置0
;準(zhǔn)備接收下一條數(shù)據(jù),跳轉(zhuǎn)到接收程序
SETB ES ;允許串口中斷
RETI ;如果接收標(biāo)志為沒有數(shù)據(jù),則中斷返回
RECINT: MOV A,SBUF ;發(fā)送數(shù)據(jù)
INC ACC ;將接收的數(shù)加1
LCALL SENT ;將數(shù)發(fā)出,回應(yīng)收到的數(shù)
CPL p1.1 ;做可以看到接收到數(shù)據(jù)的標(biāo)志
SETB ES ;允許串口中斷
RETI
;+============================================================================+
;| 外部中斷0服務(wù)子程序 |
;+============================================================================+
EI0_ISR:CLR EX0 ;禁止外部中斷0
; CPL P1.2
CLR count1_STAT
SETB EX0 ;啟動(dòng)外部中斷0
RETI
;+============================================================================+
;| 外部中斷1服務(wù)子程序 |
;+============================================================================+
EI1_ISR:CLR EX1 ;禁止外部中斷1
CPL P1.3
LCALL DLY4MS ;延時(shí)消抖動(dòng)
SETB EX1 ;啟動(dòng)外部中斷1
RETI
;+============================================================================+
;| 串口發(fā)送數(shù)據(jù)子程序 |
;+============================================================================+
SENT: MOV SBUF,A ;發(fā)送數(shù)據(jù)
W1: JBC TI,CON1 ;判斷發(fā)送成功嗎? (TI=1?),成功了則清楚除TI
SJMP W1 ;沒有發(fā)送成功則繼續(xù)判斷
CON1: CPL P1.4 ;發(fā)送一個(gè)數(shù)據(jù),就對(duì)P1.4取反操作
CPL WDI ;發(fā)送數(shù)據(jù)成功,對(duì)看門狗取反操作
RET ;子程序返回
;+============================================================================+
;| 延時(shí)子程序 |
;+============================================================================+
DLY4MS: MOV R6,#1FH
DLAY1: MOV R7,#0FFH
SDY: NOP
DJNZ R7,SDY
DJNZ R6,DLAY1
RET
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -