找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5115|回复: 0
打印 上一主题 下一主题
收起左侧

51hei板子配的无线解码

[复制链接]
跳转到指定楼层
楼主
ID:12816 发表于 2011-2-13 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表