; *************************************
; * 汽车通讯控制程序 *
; * 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 ;程序结束