作者:未知 来源:http://honggeng.spaces.live.com/
较完美的读取各种遥控器键值数据的S51端程序
;+++++++++++++++++++++++++++++
;系统常量定义
;+++++++++++++++++++++++++++++
ZHILING EQU P3.4 ;指令类
YDMCANSU EQU 12H ;有无引导码
CJGCANSU EQU 13H ;有无长间隔
WEIPD EQU 14H ;位判断中间值
WEICHANG EQU 15H ;位长
DQRMID EQU 10H ;当前终端号存放地址
DQRMDATA EQU 11H ;当前遥控指令存放地址
YDMB EQU 12H ;待发信号引导码倍数
YDJSMB EQU 13H ;待发信号引导结束码倍数
DJGMB EQU 14H ;待发信号短间隔码倍数
ONEB EQU 15H ;待发信号1时长倍数
ZEROB EQU 16H ;待发信号0时长倍数
XHFM EQU 17H ;反码否1为反0为不反
CJGYDMB EQU 18H ;长间隔引导码倍数
CJGMB EQU 19H ;长间隔码倍数
LFYDMB EQU 1AH ;连发引导码
LFYSMB EQU 1BH ;连发延时码
DFRMID EQU 1CH ;待发信号设备码前八位
DFRMIDF EQU 1DH ;待发信号设备码后八位
DFRMDATA EQU 1EH ;待发信号数据码前八位
DFRMDATAF EQU 1FH ;待发信号数据码后八位
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP P32
ORG 0023H
AJMP RECE
ORG 0040H
MAIN:
MOV P3,#0FFH
CLR P3.3
CLR P3.4
START:
setb ea
setb es
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F4H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F4H;预置初值(按照波特率2400BPS预置初值)
SETB TR1;启动定时器T1
CLR P3.3
;系统运行等待区,P3.3为系统运行标志位
JNB P3.3,$
CLR P3.3
MOV A,R0
CJNE A,#16H,ZLMN
AJMP CSJS
ZLMN:
CLR P3.4
CLR EA
ACALL ZHUANFA
SETB EA
AJMP START
CSJS:
SETB EX0
AJMP START
P32:
CLR EX0
MOV A,YDMCANSU
CJNE A,#01H, BSBM
JNB P3.2,$ ;等待引导码低电平结束
JB P3.2,$ ;等待引导结束码高电平结束
BSBM:
MOV R1,#20H
MOV R4,WEICHANG
SBMSJS:MOV R5,#08
SBMFJS:JNB P3.2, $
MOV R6,WEIPD
ACALL BZYS
MOV C,P3.2
JNC L1
JB P3.2,$
L1: MOV A,@R1
RLC A
MOV @R1,A
DJNZ R5,SBMFJS
INC R1
MOV @R1,#0H
DJNZ R4,SBMSJS
BCJGM:
MOV A,CJGCANSU
CJNE A,#01H, BSJM
JNB P3.2,$ ;等待长间隔引导码低电平结束
JB P3.2,$ ;等待长间隔延时码高电平结束
BSJM:
MOV R4,WEICHANG
SJMSJS:MOV R5,#08
SJMFJS:JNB P3.2, $
MOV R6,WEIPD
ACALL BZYS
MOV C,P3.2
JNC L2
JB P3.2,$
L2: MOV A,@R1
RLC A
MOV @R1,A
DJNZ R5,SJMFJS
INC R1
MOV @R1,#0H
DJNZ R4,SJMSJS
MOV R6,#0FFH
ACALL BZYS
MOV R6,#0FFH
ACALL BZYS
MOV R6,#0FFH
ACALL BZYS
MOV R6,#0FFH
ACALL BZYS
MOV P1,21H
;发送遥控数据到PC
MOV R1,#20H
MOV R4,#04
FASONG:
MOV A,@R1
ACALL SEND
INC R1
DJNZ R4,FASONG
SETB EX0
RETI
SEND:
MOV SBUF,A
JNB TI,$
CLR TI
ret
BZYS:MOV R7,#50
DJNZ R7,$
DJNZ R6,BZYS
RET
CHONGFA:
MOV R6,A
ACALL BZYS
MOV R6,A
ACALL BZYS
MOV LFYSMB,#0H
;+++++++++++++++++++++++++++++
;转发
;+++++++++++++++++++++++++++++
ZHUANFA:
;以下是准备发送
YDM:
MOV A,YDMB
JZ SBMH
MOV R7,YDMB
ACALL ONE38KHZ
MOV R7,YDMB
ACALL ONE38KHZ
YDJSM:
MOV A,YDJSMB
JZ SBMH
;SETB P3.7
MOV R6,YDJSMB
ACALL BZYS
SBMH:
MOV A,DFRMID
ACALL LF
SBML:
MOV A,XHFM
JZ CJG
MOV A,DFRMIDF
ACALL LF
CJG:
MOV A,CJGMB
JZ SJM
MOV R7,CJGYDMB
ACALL ONE38KHZ
;SETB P3.7
MOV R6,CJGMB
ACALL BZYS
SJM:
MOV A,DFRMDATA
ACALL LF
SJMF:
MOV A,XHFM
JZ XHEND
MOV A,DFRMDATAF
ACALL LF
XHEND:
MOV R7,LFYDMB
ACALL ONE38KHZ
MOV A,LFYSMB
CJNE A,#0H,CHONGFA
SETB P3.7
XHJS:
RET
;此段为串行PC控制数据入口
RECE:
CLR EA ;暂时关闭CPU的所有中断请求
CLR RI
MOV A,SBUF
MOV 0EH,A
CJNE A,#0FEH,RECEPCEND
mov a,0fh
cjne a,#00h,chu1
MOV R0,#12H
mov 0fh,#01h
ajmp chu2
chu1:cjne a,#01h, chu2
MOV 0FH,#00H
SETB P3.3
chu2:
;acall send
SETB EA
RETI
RECEPCEND:
mov a,0fh
cjne a,#01h,CHU3
MOV A,0EH
MOV @R0,A
INC R0
CHU3:
SETB EA
RETI
;-----------------------------------------
;系统共用子程序
;-----------------------------------------
ONE:MOV R6,ONEB
ACALL BZYS
AJMP OKOK
ZERO:MOV R6,ZEROB
ACALL BZYS
AJMP OKOK
LL:RLC A
CLR P3.3
MOV R6,#5
ACALL BZYS
SETB P3.3
JNC Z0
JC O1
NEXTOK:DJNZ R3,LL
RET
LF:MOV R3,#8
FF:RLC A
MOV R7,DJGMB
ACALL ONE38KHZ
JNC ZERO
JC ONE
OKOK:DJNZ R3,FF
RET
Z0:
MOV R6,#5
ACALL BZYS
AJMP NEXTOK
O1:
MOV R6,#12
ACALL BZYS
AJMP NEXTOK
;38KHZ单周期
ONE38KHZ:SETB P3.7
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR P3.7
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,ONE38KHZ
RET