51hei板子配的无线解码通过串口显示地址和键值
;使用AT89S52解码PT2262 晶振11.0592 MHZ
;0-代表接VSS 1-代表接VDD *2代表悬空;通过串口显示出来
;晶体频率为11.0592Mhz
;本程序中的时间定位关系只适用于接3.3M振荡电阻的PT2262解码
;使用其它阻值电阻时,应将定位时间按电阻比例缩放
;-----------------------------------------------------------
;---------------------------------------------------------------- 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 ;延时 100uS 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 DD1: CALL DLYT;基本延时 1MS DJNZ R6,DD1 RET ;------------------------------------------------ DLYT: ;基本延时 1MS MOV R5,#230 ;11.0592M= 1.085U DLYT1: NOP NOP DJNZ R5,DLYT1 ;1.085*230*4= 1MS RET ;------------------------------------------------ DLY100U: ;100US MOV R5,#46 DJNZ R5,$ RET DLYS1: CALL DLY01 ;延时 100MS DJNZ R7,DLYS1 RET END
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |