?? 9r.asm
字號:
; *************************************
; * *
; * 遙 控 接 收 解 碼 *
; * 采用AT89C2051 *
; * *
; *************************************
;
; P1.0-P1.1為電機前后驅動,P1.2-P1.3為左右轉彎驅動,P1.4為自動駕駛指示,
; 編碼輸入從P3.1和p3.2(int0)口,P3.0和P3.5分別為前后紅外線探頭,在自動
; 駕駛時以控制小汔車前進倒退。
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
ORG 0000H ;程序執行開始地址
LJMP START ;跳至START執行
ORG 0003H ;外中斷0中斷入口地址
LJMP INTEX0 ;跳至INTEX0中斷服務程序
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0023H ;串行口中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回(不開中斷)
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
CLEARMEMIO: CLR A ;清A
MOV P1,A ;P1口置0
DEC A ;A為#0FFH
MOV P3,A ;P3口置1
SETB P1.4 ;關自動駕駛指示燈
CLR 00H ;自動駕駛標志位清0
CLEARMEM: MOV IE,#00H ;關所有中斷
SETB EX0 ;開外中斷
SETB EA ;開總中斷允許
RET ;返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;上電初始化
MAIN: JB 00H,AUTO2 ;00H位標志為1轉自動駕駛
LJMP MAIN ;主程序循環
NOP ;PC值出錯處理
NOP
LJMP START ;重新上電啟動
AUTO2: LJMP AUTO ;至自動駕駛程序
;******************************
; ;
; 中斷接收程序 ;
; ;
;******************************
INTEX0: CLR EX0 ;關中斷
JNB P3.1,READ1 ;P3.1為0轉READ1
READOUTT0: SETB EX0 ;干擾,中斷退出
RETI ;中斷返回
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P3.1,HARD11 ;P3.1為高電平時轉HARD11
INC DPTR ;低電平脈沖寬度時間計數
NOP ;空操作延時
NOP
AJMP HARD1 ;跳回循環(周期約為8微秒)
HARD11: MOV A,DPH ;取DPTR高8位計數值
JZ READOUTT0 ;若為0,則脈寬不足3毫秒退出中斷
CLR A ;脈寬大于2MS,是第一個肪沖
READ11: INC A ;脈沖計數加1
READ12: JNB P3.1,READ12 ;低電平等待,
MOV R1,#06H ;高電平脈寬判斷用
READ13: JNB P3.1,READ11 ;低電平轉READ11(脈沖計數)
LCALL DELAY ;延時512微秒
DJNZ R1,READ13 ;高電平脈寬小于3MS,轉READ13循環
DEC A ;高電平脈寬大于3MS,計數結束,A減1
DEC A ;再減1
JZ FUN0 ;收到2個肪沖,執行前進功能
DEC A
JZ FUN1 ;收到3個肪沖,執行后退功能
DEC A
JZ FUN2 ;收到4個肪沖,執行左轉功能
DEC A
JZ FUN3 ;收到5個肪沖,執行右轉功能
DEC A
JZ FUN4 ;收到6個肪沖,執行自動駕駛功能
DEC A
JZ FUN5 ;收到7個肪沖,執行轉彎復位功能
DEC A
JZ FUN6 ;收到8個肪沖,執行停車功能
NOP ;出錯處理
NOP ;
LJMP READOUTT0 ;退出
FUN0: SETB P1.0 ;前進狀態
LJMP READOUTT0 ;
FUN1: SETB P1.1 ;后退狀態
LJMP READOUTT0 ;
FUN2: SETB P1.2 ;左轉彎狀態
LJMP READOUTT0 ;
FUN3: SETB P1.3 ;右轉彎狀態
LJMP READOUTT0 ;
FUN4: CPL 00H ;自動駕駛標志取反
JB 00H,AUTO1 ;00H=1進入自動駕駛
CLR P1.0 ;00H=0時進入遙控駕駛,停車操作
CLR P1.1 ;停車操作
CLR P1.2 ;停車操作
CLR P1.3 ;停車操作
SETB P1.4 ;關自動駕駛燈
LJMP READOUTT0 ;中斷退出
AUTO1: CLR P1.4 ;進入自動駕駛,開自動駕駛指示燈
SETB EX0 ;開中斷
RETI ;中斷返回
AUTO: JNB P3.0,BL ;自動駕駛控制程序,前有障礙轉BL
SETB P1.0 ;前面無障礙,前進狀態
CLR P1.1 ;前面無障礙,前進狀態
CLR P1.2 ;前面無障礙,前進狀態
CLR P1.3 ;前面無障礙,前進狀態
JNB 00H,OUT1 ;標志為0轉OUT1(轉遙控)
AJMP AUTO ;為1轉AUTO循環
BL: CLR P1.0 ;前面有障礙,后退并左轉處理
SETB P1.1 ;置后退狀態
SETB P1.2 ;左轉狀態
CLR P1.3 ;
JNB 00H,OUT1 ;標志為0轉OUT1(轉遙控)
JNB P3.5,AUTO ;后面有障礙物轉AUTO(前進處理)
AJMP BL ;后無障礙轉BL繼續后退循環
OUT1: CLR P1.0 ;自動駕駛退出程序,關閉驅動及轉向電機
CLR P1.1 ;
CLR P1.2 ;
CLR P1.3 ;
SETB P1.4 ;關自動駕駛指示燈
LJMP MAIN ;轉回主程序
FUN5: CLR P1.2 ;轉彎停止程序
CLR P1.3 ;
LJMP READOUTT0 ;退出中斷
FUN6: CLR P1.0 ;遙控停車程序,關閉驅動及轉向電機
CLR P1.1 ;
CLR P1.2 ;
CLR P1.3 ;
LJMP READOUTT0 ;中斷退出
;*************************************
;* *
;* 延時程序( 255 X 2 = 513 us) *
;* *
;*************************************
DELAY: MOV R0,#0FFH ;
DELAY1: DJNZ R0,DELAY1 ;
RET ;
;
;
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -