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