?? 10.asm
字號:
; *************************************
; * 汽車通訊控制程序 *
; * LOU RANMIAO *
; * 2001.4.24 *
; *************************************
; *****************************************************************
;* *
;* 后車信號接收 P1.0 1 40 VCC *
;* 前車信號接收 P1.1 2 39 P0.0 左轉開關(L) *
;* P1.2 3 38 P0.1 右轉開關(L) *
;* P1.3 4 37 P0.2 剎車開關(L) *
;* P1.4 5 36 P0.3 前車左轉指示 *
;* P1.5 6 35 P0.4 前車右轉指示 *
;* P1.6 7 34 P0.5 后車超車指示 *
;* P1.7 8 33 P0.6 前車剎車指示 *
;* RST 9 32 P0.7 *
;* P3.0 10 MCS-51 31 EA VDD *
;* P3.1 11 30 ALE *
;* INTEX0 P3.2 12 29 PSEN *
;* INTEX1 P3.3 13 28 P2.7 *
;* P3.4 14 27 P2.6 *
;* remoteout P3.5 15 26 P2.5 *
;* P3.6 16 25 P2.4 *
;* P3.7 17 24 P2.3 *
;* XTAL2 18 23 P2.2 *
;* XTAL1 19 22 P2.1 *
;* VSS 20 21 P2.0 *
;* *
;* *
; *****************************************************************
;
; 發送接收一體板程序
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
ORG 0000H ;程序開始地址
LJMP START ;轉START
ORG 0003H ;外中斷0中斷入口
LJMP INTEX0 ;轉INTEX0
ORG 000BH ;定時器T0中斷入口
RETI ;返回
ORG 0013H ;外中斷1入口地址
LJMP INTEX1 ;轉INTEX1
ORG 001BH ;定時器T1中斷入口
LJMP INTT1 ;轉INTT1
ORG 0023H ;串行口中斷入口
RETI ;中斷返回
ORG 002BH ;定時器T2中斷入口
RETI ;中斷返回
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
CLEARMEMIO: CLR A ;清A
DEC A ;A為#0FFH
MOV P1,A ;端口置1
MOV P2,A ;端口置1
MOV P3,A ;端口置1
CLR P3.5 ;關遙控輸出
CLEARMEM:
MOV IE,#00H ;關所有中斷
MOV IP,#01H ;外中斷0為高優先級
MOV TMOD,#22H ;8位自動重裝初值定時器
MOV TH1,#0F3H ;置13微秒定時器初值
MOV TL1,#0F3H ;
SETB EX0 ;允許外中斷0中斷
SETB EX1 ;允許外中斷1中斷
CLR ET1 ;關定時器T1中斷
SETB EA ;開總中斷允許
RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: MOV SP,#70H ;設堆棧基址為70H
LCALL CLEARMEMIO ;上電初始化
;
MAIN: LJMP KEYWORK ;跳到查鍵程序
NOP ;PC值出錯處理
NOP ;
LJMP START ;重新初始化啟動
;
;*************************************
;* *
;* T1中斷服務程序 *
;* *
;*************************************
INTT1: CPL P3.5 ;產生40kHZ信號,用作紅外線發射
RETI ;中斷返回
;
;
;*************************************
;* *
;* 掃 鍵 程 序(主程序) *
;* *
;*************************************
;
KEYWORK: SETB P0.2 ;置輸入狀態
SETB P0.0 ;置輸入狀態
SETB P0.1 ;置輸入狀態
CLR 00H ;清00H剎車標志位
JNB P0.2,KEY3 ;查剎車輸入,為0轉KEY3
KEY4: JNB P0.0,KEY0 ;查左轉輸入,為0轉KEY0
JNB P0.1,KEY1 ;查右轉輸入,為0轉KEY1
KEY5: JB 00H,KEY2 ;標志為1轉KEY2
SETB EA ;標志為0,開總中斷允許
SETB EX1 ;開外中斷1
SETB EX0 ;開外中斷0
LCALL DL10MS ;延時60毫秒
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
KEY6: SETB P0.3 ;關前車左轉提示輸出
SETB P0.4 ;關前車右轉提示輸出
SETB P0.5 ;關后車超車提示輸出
SETB P0.6 ;關前車剎車提示輸出
LJMP KEYWORK ;跳回KEYWORK循環
;
KEY3: LCALL DELAY ;延時消抖動
JB P0.2,KEY5 ;是干擾轉KEY5
SETB 00H ;剎車標志置1
LJMP KEY4 ;轉KEY4查左右轉彎按鍵
;
KEY0: LCALL DELAY ;延時消抖動
JB P0.0,KEY5 ;是干擾轉KEY5
MOV A,#02H ;發2個脈沖
LJMP REMOTE ;跳到發射程序
;
KEY1: LCALL DELAY ;延時消抖動
JB P0.1,KEY5 ;是干擾轉KEY5
MOV A,#05H ;發5個脈沖
LJMP REMOTE ;跳到發射程序
KEY2: CLR 00H ;清00H標志
MOV A,#08H ;發8個脈沖
LJMP REMOTE ;跳到發射程序
;******************************
; 前車信息接收程序(外中斷0)
;******************************
;從P1.1口接收脈沖
INTEX0: PUSH ACC ;現場保護
PUSH PSW ;
CLR EX0 ;關外中斷0
CLR EX1 ;關外中斷1
CLR EA ;關總中斷允許
JNB P1.1,READ1 ;P1.1為0轉READ1
READOUT0: POP PSW ;是干擾,中斷退出
POP ACC ;
RETI ;
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P1.1,HARD11 ;8*255=2.04ms,>2.04MS判定是起始位
INC DPTR ;低電平計數(周期為8微秒)
NOP ;
NOP
AJMP HARD1 ;低電平循環計數
HARD11: MOV A,DPH ;
JZ READOUT0 ;高8位為0,小于2.04MS,退出
CLR A ;>2.04MS判定是起始位
READ11: INC A ;脈沖數加1
READ12: JNB P1.1,READ12 ;低電平等待
MOV R1,#0AH ;高電平脈寬判斷用
READ13: JNB P1.1,READ11 ;變低電平轉READ11
LCALL DELAY ; 延時512微秒
DJNZ R1,READ13 ;延時小于10次轉READ13循環
DEC A ;高電平寬大于5MS停止接收,A減1
DEC A ;再減1
JZ FLT ;是2個脈沖,執行FLT
DEC A ;
DEC A ;
DEC A ;
JZ FRT ;是5個脈沖,執行FRT
DEC A ;
DEC A ;
DEC A ;
JZ STOP ;是8個脈沖,執行STOP
CLR PX0 ;外中斷0置低優先級
SETB PX1 ;外中斷1置高優先級
LJMP READOUT0 ;轉中斷退出
;
;******************************
; 后車信息接收程序(外中斷1)
;******************************
;接收程序原理同外中斷0,從P1.0口接收脈沖
INTEX1: PUSH ACC ;
PUSH PSW ;
CLR EX1 ;
CLR EX0 ;
CLR EA ;
JNB P1.0,READ2 ;
READOUT1: POP PSW ;
POP ACC ;
RETI ;
READ2: CLR A ;
MOV DPH,A ;
MOV DPL,A ;
HARD2: JB P1.0,HARD21 ;
INC DPTR ;
NOP ;
NOP ;
AJMP HARD2 ;
HARD21: MOV A,DPH ;
JZ READOUT1 ;
CLR A ;
READ21: INC A ;
READ22: JNB P1.0,READ22 ;
MOV R1,#0AH ;
READ23: JNB P1.0,READ21 ;
LCALL DELAY ;
DJNZ R1,READ23 ;
DEC A ;
DEC A ;
JZ BLT ;是2個脈沖,后車超車轉BLT
CLR PX1 ;外中斷0與外中斷1交換中斷優先級
SETB PX0 ;
LJMP READOUT1 ;轉中斷退出
;
FLT: CLR P0.3 ;前車左轉彎,P0.3為0
LJMP READOUT0 ;轉外中斷0中斷退出
FRT: CLR P0.4 ;前車右轉彎,P0.4為0
LJMP READOUT0 ;轉外中斷0中斷退出
BLT: CLR P0.5 ;后車超車,P0.5為0
LJMP READOUT1 ;轉外中斷1中斷退出
STOP: CLR P0.6 ;前車剎車,P0.6為0
LJMP READOUT0 ;轉外中斷0中斷退出
;
;********************************
;
; 載波發送程序
;
; *******************************
;A中數據為發射的脈沖個數
REMOTE: CLR EX0 ;關外中斷0
CLR EX1 ;關外中斷1
MOV R1,A ;發射脈沖個數入R1
LJMP OUT3 ;第一位脈沖處理
OUT: MOV R0,#02H ;1毫秒脈沖控制
OUT1: SETB ET1 ;開定時T1中斷(40KHZ紅外調制用)
SETB TR1 ;開啟T1
LCALL DELAY ; 延時513微秒 6(2)*0.5=3MS(1MS)
DJNZ R0,OUT1 ;總延時值不到轉OUT1再循環
MOV R0,#02H ;賦1毫秒脈寬定時值
OUT2: CLR TR1 ;關T1
CLR ET1 ;關T1中斷
CLR P3.5 ;關紅外線輸出
LCALL DELAY ; 延時513微秒
DJNZ R0,OUT2 ;總延時(1MS)不到轉OUT2再延時
DJNZ R1,OUT ;脈沖未發完,轉OUT再發
LCALL DL10MS ;脈沖發完延時10毫秒(幀間隔)
LJMP KEY5 ;脈沖發送結束跳到KEY5
OUT3: MOV R0,#06H ;3毫秒脈寬控制
LJMP OUT1 ;轉OUT1紅外線發射
;
;
;*************************************
;* *
;* 延時 249 * 2+2 = 500 us *
;* *
;*************************************
DELAY: MOV R7,#0F9H
DELAY1: DJNZ R7,DELAY1
RET
;
;*************************************
;* *
;* 延時10 ms *
;* *
;*************************************
DL10MS: MOV R6,#14H
DL10MS1: LCALL DELAY
DJNZ R6,DL10MS1
RET
;
;
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -