?? 8.asm
字號:
;*************************************
;* *
;* 自 動 往 返 小 汽 車 *
;* 2001年9月 *
;*************************************
;
;
;
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
;
ORG 0000H ;程序執(zhí)行起始地址
LJMP START ;跳至START
ORG 0003H ;外中斷0入口
LJMP INTEX0 ;跳至INTEX0中斷服務(wù)程序
ORG 000BH ;定時器T0中斷入口
RETI ;中斷返回
ORG 0013H ;外中斷1入口
LJMP INTEX1 ;跳至INTEX1中斷服務(wù)程序
ORG 001BH ;定時器T1中斷入口
LJMP INTT1 ;跳至INTT1中斷服務(wù)程序
ORG 0023H ;串口中斷入口
RETI ;中斷返回
ORG 002BH ;定時器T2中斷入口
RETI ;中斷返回
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
CLEARMEMIO: MOV R0, #70H ;清70H-76H顯示單元
MOV R7, #07H ;循環(huán)次數(shù)
ML0: MOV @R0, #00H ;清0
INC R0 ;下一地址
DJNZ R7, ML0 ;未完再循環(huán)
MOV TMOD,#10H ;T1為16位定時器
MOV R4,#14H ;1秒定時用(50毫秒20次)
MOV TL1,#0B0H ;50毫秒定時用初值
MOV TH1,#3CH ;
MOV 20H,#00H ;清0操作
MOV 21H,#00H ;
MOV 22H,#00H ;
MOV 23H,#00H ;
MOV 24H,#00H ;
CLR 30H ;清停車標志
SETB ET1 ;開T1中斷
SETB EX1 ;開外中斷1
SETB IT1 ;外中斷1采用邊沿觸發(fā)
SETB IT0 ;外中斷0優(yōu)先級為1(最高)
SETB EX0 ;開外中斷0
SETB EA ;開總中斷允許
SETB TR1 ;開啟定時器T1
RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
;
START: LCALL CLEARMEMIO ;上電初始化
SETB P1.6 ;選擇7.5V輸出
CLR P1.7 ;選擇7.5V輸出
SETB P3.7 ;前進狀態(tài)
CLR P3.6 ;前進狀態(tài)
CLR P1.0 ;電機供電開始
MAIN: LCALL DISP ;LED顯示一次
LJMP MAIN ;轉(zhuǎn)MAIN循環(huán)
NOP ;PC值出錯處理
NOP
LJMP START ;重新初始化
;
;*************************************
;* *
;*外中斷0服務(wù)程序,用作跑道位置處理 *
;* 23H作跑道計數(shù)器 *
;*************************************
INTEX0: PUSH ACC ;堆棧保護
PUSH PSW ;
CLR EX0 ;關(guān)中斷
LCALL DISP ;LED顯示一次(延時抗干擾)
JB P3.2,IN0RET ;P3.2為1退出(干擾)
INC 23H ;跑道計數(shù)器加1
MOV A,23H ;數(shù)據(jù)入A
CJNE A,#06H,JUDGE1 ;不是第6道轉(zhuǎn)JUDGE1
LCALL STOP ;是第6道,停車
LJMP IN0RET ;轉(zhuǎn)中斷退出
JUDGE1: CJNE A,#03H,JUDGE2 ;不是第3道轉(zhuǎn)JUDGE2
LCALL STOPSLOW ;是第3道,變慢車
LJMP IN0RET ;轉(zhuǎn)中斷退出
JUDGE2: CJNE A,#04H,JUDGE3 ;不是第4道轉(zhuǎn)JUDGE3
LCALL FAST ;是第4道,變快車
LJMP IN0RET ;轉(zhuǎn)中斷退出
JUDGE3: CJNE A,#05H,IN0RET ;不是第5道轉(zhuǎn)INORET退出
LCALL STOPSLOW ;是第5道,變慢車
IN0RET: CLR IE0 ;清外中斷0中斷標志
POP PSW ;恢復(fù)現(xiàn)場
POP ACC ;
LCALL DL7MS ;延時7毫秒(抗干擾)
SETB EX0 ;開外中斷0
RETI ;中斷返回
;
;************************************
;* 慢車控制子程序 *
;************************************
STOPSLOW: CLR P1.6 ;關(guān)7.5V電源
CPL P3.6 ;反向驅(qū)動(剎車)
CPL P3.7 ;反向驅(qū)動
LCALL DS50MS ;剎車時間(可根據(jù)試車情況調(diào)整)
LCALL DS50MS ;
LCALL DS50MS ;
CPL P3.6 ;正向驅(qū)動
CPL P3.7 ;正向驅(qū)動
SETB P1.7 ;開4.3V電源
RET ;返回
;
;************************************
;* 快車控制子程序 *
;************************************
FAST: CLR P1.7 ; 關(guān)4.3V電源
SETB P1.6 ; 開7.5V電源
RET ;返回
;
;************************************
;* 停車控制程序 *
;************************************
STOP: MOV 23H,#00H ;跑道計數(shù)單元清0
CPL P3.6 ;反向驅(qū)動(剎車)
CPL P3.7 ;反向驅(qū)動(剎車)
LCALL DS50MS ;剎車時間
LCALL DS50MS ;剎車時間(可調(diào)整)
SETB P1.0 ;關(guān)電機電源
SETB PT1 ;定時器T1為高優(yōu)先級
LCALL DS10S ;停車10秒
CLR PT1 ;恢復(fù)T1為低優(yōu)先級
SETB P1.6 ;開7.5V電源(高速)
CLR P1.7 ;關(guān)4.3V
CLR P1.0 ;電機電源開
CPL 30H ;停車點位置判斷標志取反
JB 30H,STREN ;為1(中途停車)轉(zhuǎn)STREN
LCALL CLR00 ;是終點,調(diào)復(fù)0程序
STREN: RET ;返回
;
;*********************************
;* 計時清0程序 *
;*********************************
CLR00: MOV 70H,#00H ;計時單元清0
MOV 71H,#00H ;計時單元清0
MOV 72H,#00H ;計時單元清0
MOV 73H,#00H ;計時單元清0
RET ;返回
;
;*************************************
;* *
;* 外中斷1程序,里程計數(shù)用 *
;* 20H、21H、22H、24H作計數(shù)器 *
;*************************************
INTEX1: PUSH ACC ;堆棧保護
PUSH PSW ;
CLR EX1 ;關(guān)外中斷1
INC 20H ;圈加1
LLLL: MOV A,20H ;判斷是否滿6圈
CJNE A,#06H,LLL ;不滿6圈轉(zhuǎn)LLL退出
MOV 20H,#00H ;滿6圈清0進位(6圈為1米)
INC 21H ;上位加1
MOV A,21H ;判斷是否滿10
CJNE A,#0AH,LLL ;不滿10轉(zhuǎn)LLL
MOV 21H,#00H ; 滿10清0進1位
INC 22H ; 高位加1
MOV A,22H ; 判斷是否滿10
CJNE A,#0AH,LLL ; 不滿10轉(zhuǎn)LLL
MOV 22H,#00H ; 滿10清0進1位
INC 24H ; 高位加1
MOV A,24H ; 判斷是否滿10
CJNE A,#0AH,LLL ; 不滿10轉(zhuǎn)LLL
MOV 24H,#00H ; 滿10清0
LLL: MOV 74H,21H ; 將里程數(shù)移入顯示單元(個位)
MOV 75H,22H ; 將里程數(shù)移入顯示單元(十位)
MOV 76H,24H ; 將里程數(shù)移入顯示單元(百位)
IN1RET: POP PSW ;恢復(fù)堆棧
POP ACC ;
SETB EX1 ;開外中斷1
RETI ;中斷返回
;
;*************************************
;* 時間計時器程序 *
;* (T1定時中斷服務(wù)程序) *
;* *
;*************************************
INTT1: PUSH ACC ;堆棧保護
PUSH PSW ;
MOV TL1,#0B0H ;賦50毫秒定時初值
MOV TH1,#3CH ;
DEC R4 ;減1
MOV A,R4 ;
JNZ RETT0 ;不為0轉(zhuǎn)RETT0
MOV R4,#14H ;為0(1秒到)重賦初值
MOV R0,#71H ;地址指向71H
ACALL ADD1 ;加1秒操作
MOV A,R3 ;
CLR C ;
CJNE A,#60H,CC ;是否為60秒?
CC: JC RETT0 ;小于60轉(zhuǎn)RETT0
ACALL CLR0 ;大于或等于60清0
MOV R0,#73H ;指向分計時地址單元
ACALL ADD1 ;分加1
MOV A,R3 ;
CLR C ;
CJNE A,#60H,CCC ;是否為60分?
CCC: JC RETT0 ;小于60轉(zhuǎn)RETT0
ACALL CLR0 ;大于或等于60分計時單元清0
RETT0: POP PSW ;恢復(fù)堆棧
POP ACC ;
RETI ;中斷返回
;
;;;;;;;;;;;;;; ;;;;
; 加1操作程序 ;
;;;;;;;;;;;;;; ;;;;
ADD1: MOV A,@R0 ;取計數(shù)值
DEC R0 ;指向低一個地址
SWAP A ;計數(shù)值高低四位交換
ORL A,@R0 ;相或組合成一個數(shù)據(jù)
ADD A,#01H ;加1
DA A ;十進制調(diào)整
MOV R3,A ;暫存R3內(nèi)
ANL A,#0FH ;高四位變0
MOV @R0,A ;放回低地址
MOV A,R3 ;取回R3內(nèi)數(shù)據(jù)
INC R0 ;地址加1
SWAP A ;高低四位交換
ANL A,#0FH ;高四位為0
MOV @R0,A ;放回原地址
RET ;返回
;
;;;;;;;;;;;;;
; 清0程序 ;
;;;;;;;;;;;;;
CLR0: CLR A ;清A
MOV @R0,A ;對應(yīng)地址單元清0
DEC R0 ;指向低一地址
MOV @R0,A ;清0
RET ;返回
;
;
;;;;;;;;;;;;;
; 顯示程序 ;
;;;;;;;;;;;;;
DISP: MOV R1,#70H ;顯示數(shù)據(jù)首址
MOV R5,#0FEH ;掃描字
PLAY: MOV A,R5 ;掃描字入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數(shù)據(jù)
MOV DPTR,#TAB ;取段碼表首址
MOVC A,@A+DPTR ; 查數(shù)據(jù)對應(yīng)段碼
MOV P0,A ;段碼從P0口輸出
LCALL DL1MS ;點亮1毫秒
INC R1 ;指向下顯示數(shù)地址
MOV A,R5 ;掃描字入A
JNB ACC.6,ENDOUT ;ACC.6=0轉(zhuǎn)ENDOUT結(jié)束
RL A ;循環(huán)左移
MOV R5,A ;放回A
AJMP PLAY ;轉(zhuǎn)PLAY再顯示
ENDOUT: MOV P2,#0FFH ;顯示結(jié)束處理。P2口置1
RET ;子程序結(jié)束
;
;LED共陰段碼表(0-9)
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;
;1毫秒延時程序
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
;延時程序,用調(diào)用顯示程序?qū)崿F(xiàn),可使LED顯示穩(wěn)定
DS50MS: LCALL DISP ;(7毫秒)
LCALL DISP
LCALL DISP
DS20MS: LCALL DISP
LCALL DISP
LCALL DISP
RET
;
;10秒延時程序,用調(diào)用顯示程序?qū)崿F(xiàn),可使LED顯示不熄滅
DS10S: MOV R2,#08H ;(8*11*16*7=9956毫秒)
TI0: MOV R0,#0B0H
TI1: LCALL DISP
DJNZ R0,TI1
DJNZ R2,TI0
RET
;7毫秒延時程序,跑道計數(shù)器抗干擾用
DL7MS: SETB PX1 ;外中斷1置高優(yōu)先級
MOV R2,#0EH ;賦定時值
DL11: LCALL DISP ;調(diào)用顯示程序
DJNZ R2,DL11 ;循環(huán)
CLR PX1 ;外中斷1恢復(fù)低優(yōu)先級
RET ;返回
;
END ;程序結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -