?? 10.asm
字號(hào):
; *************************************
; * 汽車通訊控制程序 *
; * LOU RANMIAO *
; * 2001.4.24 *
; *************************************
; *****************************************************************
;* *
;* 后車信號(hào)接收 P1.0 1 40 VCC *
;* 前車信號(hào)接收 P1.1 2 39 P0.0 左轉(zhuǎn)開關(guān)(L) *
;* P1.2 3 38 P0.1 右轉(zhuǎn)開關(guān)(L) *
;* P1.3 4 37 P0.2 剎車開關(guān)(L) *
;* P1.4 5 36 P0.3 前車左轉(zhuǎn)指示 *
;* P1.5 6 35 P0.4 前車右轉(zhuǎn)指示 *
;* 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 *
;* *
;* *
; *****************************************************************
;
; 發(fā)送接收一體板程序
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
ORG 0000H ;程序開始地址
LJMP START ;轉(zhuǎn)START
ORG 0003H ;外中斷0中斷入口
LJMP INTEX0 ;轉(zhuǎn)INTEX0
ORG 000BH ;定時(shí)器T0中斷入口
RETI ;返回
ORG 0013H ;外中斷1入口地址
LJMP INTEX1 ;轉(zhuǎn)INTEX1
ORG 001BH ;定時(shí)器T1中斷入口
LJMP INTT1 ;轉(zhuǎn)INTT1
ORG 0023H ;串行口中斷入口
RETI ;中斷返回
ORG 002BH ;定時(shí)器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 ;關(guān)遙控輸出
CLEARMEM: MOV SP,#70H ;設(shè)堆棧基址為70H
MOV IE,#00H ;關(guān)所有中斷
MOV IP,#01H ;外中斷0為高優(yōu)先級(jí)
MOV TMOD,#22H ;8位自動(dòng)重裝初值定時(shí)器
MOV TH1,#0F3H ;置13微秒定時(shí)器初值
MOV TL1,#0F3H ;
SETB EX0 ;允許外中斷0中斷
SETB EX1 ;允許外中斷1中斷
CLR ET1 ;關(guān)定時(shí)器T1中斷
SETB EA ;開總中斷允許
RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;上電初始化
;
MAIN: LJMP KEYWORK ;跳到查鍵程序
NOP ;PC值出錯(cuò)處理
NOP ;
LJMP START ;重新初始化啟動(dòng)
;
;*************************************
;* *
;* T1中斷服務(wù)程序 *
;* *
;*************************************
INTT1: CPL P3.5 ;產(chǎn)生40kHZ信號(hào),用作紅外線發(fā)射
RETI ;中斷返回
;
;
;*************************************
;* *
;* 掃 鍵 程 序(主程序) *
;* *
;*************************************
;
KEYWORK: SETB P0.2 ;置輸入狀態(tài)
SETB P0.0 ;置輸入狀態(tài)
SETB P0.1 ;置輸入狀態(tài)
CLR 00H ;清00H剎車標(biāo)志位
JNB P0.2,KEY3 ;查剎車輸入,為0轉(zhuǎn)KEY3
KEY4: JNB P0.0,KEY0 ;查左轉(zhuǎn)輸入,為0轉(zhuǎn)KEY0
JNB P0.1,KEY1 ;查右轉(zhuǎn)輸入,為0轉(zhuǎn)KEY1
KEY5: JB 00H,KEY2 ;標(biāo)志為1轉(zhuǎn)KEY2
SETB EA ;標(biāo)志為0,開總中斷允許
SETB EX1 ;開外中斷1
SETB EX0 ;開外中斷0
LCALL DL10MS ;延時(shí)60毫秒
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
LCALL DL10MS ;
KEY6: SETB P0.3 ;關(guān)前車左轉(zhuǎn)提示輸出
SETB P0.4 ;關(guān)前車右轉(zhuǎn)提示輸出
SETB P0.5 ;關(guān)后車超車提示輸出
SETB P0.6 ;關(guān)前車剎車提示輸出
LJMP KEYWORK ;跳回KEYWORK循環(huán)
;
KEY3: LCALL DELAY ;延時(shí)消抖動(dòng)
JB P0.2,KEY5 ;是干擾轉(zhuǎn)KEY5
SETB 00H ;剎車標(biāo)志置1
LJMP KEY4 ;轉(zhuǎn)KEY4查左右轉(zhuǎn)彎按鍵
;
KEY0: LCALL DELAY ;延時(shí)消抖動(dòng)
JB P0.0,KEY5 ;是干擾轉(zhuǎn)KEY5
MOV A,#02H ;發(fā)2個(gè)脈沖
LJMP REMOTE ;跳到發(fā)射程序
;
KEY1: LCALL DELAY ;延時(shí)消抖動(dòng)
JB P0.1,KEY5 ;是干擾轉(zhuǎn)KEY5
MOV A,#05H ;發(fā)5個(gè)脈沖
LJMP REMOTE ;跳到發(fā)射程序
KEY2: CLR 00H ;清00H標(biāo)志
MOV A,#08H ;發(fā)8個(gè)脈沖
LJMP REMOTE ;跳到發(fā)射程序
;******************************
; 前車信息接收程序(外中斷0)
;******************************
;從P1.1口接收脈沖
INTEX0: PUSH ACC ;現(xiàn)場(chǎng)保護(hù)
PUSH PSW ;
CLR EX0 ;關(guān)外中斷0
CLR EX1 ;關(guān)外中斷1
CLR EA ;關(guān)總中斷允許
JNB P1.1,READ1 ;P1.1為0轉(zhuǎn)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 ;低電平計(jì)數(shù)(周期為8微秒)
NOP ;
NOP
AJMP HARD1 ;低電平循環(huán)計(jì)數(shù)
HARD11: MOV A,DPH ;
JZ READOUT0 ;高8位為0,小于2.04MS,退出
CLR A ;>2.04MS判定是起始位
READ11: INC A ;脈沖數(shù)加1
READ12: JNB P1.1,READ12 ;低電平等待
MOV R1,#0AH ;高電平脈寬判斷用
READ13: JNB P1.1,READ11 ;變低電平轉(zhuǎn)READ11
LCALL DELAY ; 延時(shí)512微秒
DJNZ R1,READ13 ;延時(shí)小于10次轉(zhuǎn)READ13循環(huán)
DEC A ;高電平寬大于5MS停止接收,A減1
DEC A ;再減1
JZ FLT ;是2個(gè)脈沖,執(zhí)行FLT
DEC A ;
DEC A ;
DEC A ;
JZ FRT ;是5個(gè)脈沖,執(zhí)行FRT
DEC A ;
DEC A ;
DEC A ;
JZ STOP ;是8個(gè)脈沖,執(zhí)行STOP
CLR PX0 ;外中斷0置低優(yōu)先級(jí)
SETB PX1 ;外中斷1置高優(yōu)先級(jí)
LJMP READOUT0 ;轉(zhuǎn)中斷退出
;
;******************************
; 后車信息接收程序(外中斷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個(gè)脈沖,后車超車轉(zhuǎn)BLT
CLR PX1 ;外中斷0與外中斷1交換中斷優(yōu)先級(jí)
SETB PX0 ;
LJMP READOUT1 ;轉(zhuǎn)中斷退出
;
FLT: CLR P0.3 ;前車左轉(zhuǎn)彎,P0.3為0
LJMP READOUT0 ;轉(zhuǎn)外中斷0中斷退出
FRT: CLR P0.4 ;前車右轉(zhuǎn)彎,P0.4為0
LJMP READOUT0 ;轉(zhuǎn)外中斷0中斷退出
BLT: CLR P0.5 ;后車超車,P0.5為0
LJMP READOUT1 ;轉(zhuǎn)外中斷1中斷退出
STOP: CLR P0.6 ;前車剎車,P0.6為0
LJMP READOUT0 ;轉(zhuǎn)外中斷0中斷退出
;
;********************************
;
; 載波發(fā)送程序
;
; *******************************
;A中數(shù)據(jù)為發(fā)射的脈沖個(gè)數(shù)
REMOTE: CLR EX0 ;關(guān)外中斷0
CLR EX1 ;關(guān)外中斷1
MOV R1,A ;發(fā)射脈沖個(gè)數(shù)入R1
LJMP OUT3 ;第一位脈沖處理
OUT: MOV R0,#02H ;1毫秒脈沖控制
OUT1: SETB ET1 ;開定時(shí)T1中斷(40KHZ紅外調(diào)制用)
SETB TR1 ;開啟T1
LCALL DELAY ; 延時(shí)513微秒 6(2)*0.5=3MS(1MS)
DJNZ R0,OUT1 ;總延時(shí)值不到轉(zhuǎn)OUT1再循環(huán)
MOV R0,#02H ;賦1毫秒脈寬定時(shí)值
OUT2: CLR TR1 ;關(guān)T1
CLR ET1 ;關(guān)T1中斷
CLR P3.5 ;關(guān)紅外線輸出
LCALL DELAY ; 延時(shí)513微秒
DJNZ R0,OUT2 ;總延時(shí)(1MS)不到轉(zhuǎn)OUT2再延時(shí)
DJNZ R1,OUT ;脈沖未發(fā)完,轉(zhuǎn)OUT再發(fā)
LCALL DL10MS ;脈沖發(fā)完延時(shí)10毫秒(幀間隔)
LJMP KEY5 ;脈沖發(fā)送結(jié)束跳到KEY5
OUT3: MOV R0,#06H ;3毫秒脈寬控制
LJMP OUT1 ;轉(zhuǎn)OUT1紅外線發(fā)射
;
;
;*************************************
;* *
;* 延時(shí) 249 * 2+2 = 500 us *
;* *
;*************************************
DELAY: MOV R7,#0F9H
DELAY1: DJNZ R7,DELAY1
RET
;
;*************************************
;* *
;* 延時(shí)10 ms *
;* *
;*************************************
DL10MS: MOV R6,#14H
DL10MS1: LCALL DELAY
DJNZ R6,DL10MS1
RET
;
;
END ;程序結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -