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.raoushi.com/bbs/) | Powered by Discuz! X3.1 |