|
本帖最后由 LBQ691477940 于 2011-2-10 21:30 编辑
;使用AT89C2051解码PT2262 晶振11.0592 MHZ
;0-代表接VSS 1-代表接VDD *2代表悬空;通过串口显示出来
;晶体频率为11.0592Mhz
;本程序中的时间定位关系只适用于接3.3M振荡电阻的PT2262解码
;使用其它阻值电阻时,应将定位时间按电阻比例缩放
; P10-- 信号指示灯
; P32-- /315M DATA输入端,通常接LM358的1脚
; 解码后由 P31 送出, 9600 n 8 1, 给串口调试显示
这手不是我的,哈哈!
八位地址悬空时的控键码
;==================================================
;上原程序:
;----------------------------------------------------------------
TDN EQU 20H
TDN1 EQU 21H
TMP0 EQU 30H
TMP1 EQU 31H
BUF1 EQU 40H ;储存 1ST 数据流
BUF2 EQU 50H ;储存 2ND 据
;-----------------------------------------------------------
ORG 0000H
JMP LAB00
LAB00:
MOV SP,#60H
MOV A,#0FFH
MOV P1,A
MOV P3,A
CALL DLY01 ;调用延时100MS
;--------------------------------------------------
SETBD:
MOV TMOD,#22H ;两个定时器都设为8位自动重装初值
MOV TH1,#0FDH ;11.059MHZ 设置波特率为 9600
SETB TR1 ;
MOV SCON,#01010000B ;设定串列方式 MODE1,接收时 REN=1
NOP
MOV TH0,#0F4H ;定时器0 模式2, 8位自动重装 0.013MS
CLR TR0 ;11.0592 = 13 uS
MOV IE,#10010000B ;UART中断使能
;--------------------------------------------------
LOOPX:
SETB P1.0 ;信号指示灯
CALL WSTAT ;等待 2 同步 (>3.3MS)
CALL WSTAT ;等待 2 同步 (>3.3MS)
CLR P1.0 ;信号指示灯
MOV R0,#BUF1 ;分解 1ST 数据流
MOV R2,#12
LOOPX2:
CALL GET2P ;收到 2 脉冲
JNC LOOPX1
JMP LOOPX ;失败
LOOPX1:
MOV A,B
MOV @R0,A
INC R0
DJNZ R2,LOOPX2
CALL WSTAT ;
MOV R0,#BUF2 ;分解 2ND 数据流
MOV R2,#12
LOOPX3:
CALL GET2P ;收到 2 脉冲
JNC LOOPX4
JMP LOOPX ;失败
LOOPX4:
MOV A,B
MOV @R0,A
INC R0
DJNZ R2,LOOPX3
SETB P1.0;信号指示灯
;--------------------------------------------------
;CHECK BOTH STREAM DATA
MOV R0,#BUF1;储存 1ST 数据流
MOV R1,#BUF2;储存 2ND 据
MOV R2,#12
LOOPX51:
MOV A,@R0
ANL A,#3
MOV B,A
MOV A,@R1
ANL A,#3
CJNE A,B,LOOPX5
INC R0
INC R1
DJNZ R2,LOOPX51
JMP TXDATA
;--------------------------------------------------
LOOPX5:
JMP LOOPX ;检查 失败,重新LOOPX
;--------------------------------------------------
; (发送地址 - 键编码)
;TX 数据串 : $AAAAAAAAAAAA-KKKK!
;-------------------------------------------------
TXDATA:
MOV A,#'$' ;通过串口发送 $ 字符
CALL TRANS ;通过串口发送数据
MOV R2,#8 ;共8位地址
MOV R0,#BUF1;储存 1ST 数据流
TXNXD:
MOV A,@R0
ANL A,#3
CALL CONVD
LOOPX6:
CALL TRANS ;通过串口发送数据
INC R0
DJNZ R2,TXNXD
MOV A,#'-' ;通过串口发送 - 字符
CALL TRANS ;通过串口发送数据
MOV R2,#4 ;共1位地键值
TXNXD1:
MOV A,@R0
ANL A,#3
CALL CONVD
LOOPX7:
CALL TRANS ;通过串口发送数据
INC R0
DJNZ R2,TXNXD1
MOV A,#'!' ;通过串口发送 ! 字符
CALL TRANS ;通过串口发送数据
CALL CRLF
JMP LOOPX
;--------------------------------------------------
CONVD:
CJNE A,#0,CONV1
MOV A,#'0'
RET
CONV1:
CJNE A,#3,CONV2
MOV A,#'1'
RET
CONV2:
CJNE A,#1,CONV3
MOV A,#'2'
RET
CONV3:
MOV A,#'3'
RET
;--------------------------------------------------
WSTAT: ;等待数据流 SLOT >3MS
NOP
MOV R4,#33
WSTAT1:
JB P3.2,WSTAT ;寻找数据流
CALL DLY100U
DJNZ R4,WSTAT1
WSTAT2:
JNB P3.2,WSTAT2
RET ;重新开始寻找数据流
;--------------------------------------------------
GET2P:
CALL GET1P ;RET TMP0=HIGH TIME, TMP1=LOW TIME
JC GPERR
MOV A,TMP1
CPL A
ADD A,TMP0 ;
MOV B.1,C
CALL GET1P ;2
JC GPERR ;2
MOV A,TMP1 ;2
CPL A ;1
ADD A,TMP0 ;2
MOV B.0,C ;2
CLR C
RET
GPERR:
SETB C
RET
;--------------------------------------------------
GET1P:
MOV TDN,#0
RXHP1:
JNB P3.2,RXHP2 ;2 cycle
INC TDN ;1 ACCUMULATE HIGH TIME
MOV A,TDN ;1
ADD A,#-80 ;1 high:> 80*7*1.085>600U-->ERR
JNC RXHP1 ;2
JMP RXPERR
RXHP2:
MOV A,TDN ;1, find low,
ADD A,#-5 ;1,
JC RXHP3 ;2, HIGH MUST > 4*1.085*7 =31U
JMP RXPERR ;2,
RXHP3:
MOV TMP0,TDN ;2
MOV TDN,#0 ;2
RXLP1:
JB P3.2,RXLP2 ;2
INC TDN ;1
MOV A,TDN ;1
ADD A,#-80 ;1 LOW> 80*7*1.085>600U-->ERR
JNC RXLP1 ;2
JMP RXPERR
RXLP2:
MOV A,TDN ;1, find high
ADD A,#-5 ;1
JC RXLP3 ;2, LOW MUST >31U
JMP RXPERR ;2
RXLP3:
MOV TMP1,TDN ;2
CLR C
RET
RXPERR:
SETB C
RET
;--------------------------------------------------
TXASC:
MOV A,@R1 ;TX 2 BYTE : "5A" --> '5' 'A'
SWAP A
ANL A,#0FH
CALL HEXASC
CALL TRANS ;通过串口发送数据
MOV A,@R1
ANL A,#0FH
CALL HEXASC
CALL TRANS ;通过串口发送数据
RET
;--------------------------------------------------
HEXASC:
ADD A,#30H
CJNE A,#39H,HEXA1
RET ;39H
HEXA1:
JNC HEXA2
RET ;30..38H
HEXA2:
ADD A,#7 ;3A-->41H
RET
;--------------------------------------------------
CRLF:
MOV A,#0DH
CALL TRANS ;通过串口发送数据
MOV A,#0AH
CALL TRANS ;通过串口发送数据
RET
TRANS: ;通过串口发送数据
MOV SBUF,A ;send A from pin txd
JNB TI,$ ;等待 TI = 1
CLR TI ;清除 TI
RET
;-----------------------------------------------
; 延时
;-----------------------------------------------
DLY01: ;延时 100MS
MOV R6,#100 ;0.1 SEC 100/1MS = 100
JMP DD1
DLY50M: ;延时 50MS
MOV R6,#50
JMP DD1
DLY40M: ;延时 40MS
MOV R6,#40
JMP DD1
DLY20M: ;延时 20MS
MOV R6,#20
JMP DD1
DLY10M: ;延时 10MS
MOV R6,#10
JMP DD1
DLY8M: ;延时 8MS
MOV R6,#8
JMP DD1
DLY5M: ;延时 5MS
MOV R6,#5 ;
DD1:
CALL DLYT;基本延时 1MS
DJNZ R6,DD1
RET
;------------------------------------------------
DLY1M:
NOP
DLYT: ;基本延时 1MS
MOV R5,#230 ;11.0592M= 1.085U
DLYT1:
NOP
NOP
DJNZ R5,DLYT1 ;1.085*230*4= 1MS
RET
;------------------------------------------------
DLY100U:
MOV R5,#46
DJNZ R5,$
RET
DLY2HU:
MOV R5,#92 ;200US
DJNZ R5,$
RET
;------------------------------------------------
DLY5S:
MOV R7,#50
JMP DLYS1
DLY2S:
MOV R7,#20
JMP DLYS1
DLY02:
MOV R7,#2
JMP DLYS1
DLY05:
MOV R7,#5
JMP DLYS1
DLY1S:
MOV R7,#10
DLYS1:
CALL DLY01
DJNZ R7,DLYS1
RET
END
|
|