正好作了一個相似的東西....
315 mhz 收信入 89c2051 的 p32, 解碼後由 p31 送出, 9600 n 8 1, 給 palm 顯示.
2 表示懸空,....
; tasobugr.asm , receive decoder and transmit
; may 18 2006, 89c2051+ 11.0592 mhz
;
;-----------------------------------------------------------
;
; p30-- /rx,
; p31-- /tx, --- to host
; p32-- /hdq, --- input for 315 m data
;
; p33-- /rs232 indicator
; p34--
; p35--led indicator /seeking 2 stream
; p37--
;
;----------------------------------------------------------------
tdn reg 20h ;
tdn1 reg 21h
;
tmp0 reg 30h
tmp1 reg 31h
;
buf1 reg 40h ;store 1st stream data
;
buf2 reg 50h ;store 2nd data
;
;-----------------------------------------------------------
;
org 0
jmp lab00
;
;org 0bh
;jmp tint
;
;org 23h
;jmp sint
;
lab00 mov sp,#60h
mov a,#0ffh
mov p1,a
mov p3,a
;
call dly01
;
;--------------------------------------
setbd mov tmod,#22h ;timer1 : 8-bit autoreload (mode 2)
mov th1,#-3 ;set 9600 baud = 11.059m/12/ 3/32
setb tr1 ;turn timer1 on
;mov ie,#10010000b ;enable serial port interrupt
mov scon,#01010000b ;serial mode1 : 8,n,1 uart
; ;enable receiver (ren=1)
nop
mov th0,#-12 ;timer 0 mode 2, 8 bit reload
clr tr0 ;11.0592/12/12= 13 us
;
mov ie,#10010000b ;enable es int, disable et0
; ;et0 enable only at rxhby: read hdq byte
;--------------------------------
;
loopx setb p3.5
call wstat
call wstat ;wait 2 sync (>3.3ms)
clr p3.5
;
mov r0,#buf1 ;analysis 1st stream
mov r2,#12
loopx2 call get2p ;receive 2 pulse
jnc loopx1
jmp loopx ;fail
;
loopx1 mov a,b
mov @r0,a
inc r0
djnz r2,loopx2
;----------------
call wstat ;
;
mov r0,#buf2 ;analysis 2nd stream
mov r2,#12
loopx3 call get2p ;receive 2 pulse
jnc loopx4
jmp loopx ;fail
;
loopx4 mov a,b
mov @r0,a
inc r0
djnz r2,loopx3
;
setb p3.5
;------------------
; ; check both stream data
mov r0,#buf1
mov r1,#buf2
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 ;check fail, goto find new stream
;
;
;--------------------------------------------------
; (send out addr then keycode)
;tx stream data : $aaaaaaaaaaaa-kkkk! <cr><lf>
; a, k = Ɔ' Ƈ'ƈ' Ɖ', take 17ms
;-------------------------------------------------
txdata mov a,#'$'
call trans
mov r2,#8
mov r0,#buf1
;
txnxd mov a,@r0
anl a,#3
call convd
;
loopx6 call trans
inc r0
djnz r2,txnxd
;
mov a,#'-'
call trans
;
mov r2,#4
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,#Ɔ'
ret
conv1 cjne a,#3,conv2
mov a,#Ƈ'
ret
conv2 cjne a,#1,conv3
mov a,#ƈ'
ret
conv3 mov a,#Ɖ'
ret
;
;------------------------------
wstat nop ;wait for stream slot >3ms
mov r4,#33
wstat1 jb p3.2,wstat ;find stream
call dly100u
djnz r4,wstat1
;
wstat2 jnb p3.2,wstat2
ret ;find start of new stream
;
;-------------------------------
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" --> Ƌ' '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,$ ;wait,until ti = 1
clr ti ;clear ti
ret
;
;-----------------------------------------------
; delay loop
;-----------------------------------------------
dly01 mov r6,#100 ;0.1 sec 100/1ms = 100
jmp dd1
dly50m mov r6,#50
jmp dd1
dly40m mov r6,#40
jmp dd1
dly20m mov r6,#20
jmp dd1
dly8m mov r6,#8
jmp dd1
dly5m mov r6,#5
jmp dd1
;dly3m mov r6,#3
; jmp dd1
;
dly10m mov r6,#10 ;
dd1 call dlyt
djnz r6,dd1
;cpl p1.7 ;wd
ret
;
dly1m nop
dlyt mov r5,#230 ;6mhz/12=2.0us
dlyt1 nop ;11.0592m= 1.085u
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
;