📄 tmon.asm
字号:
;用11.0592MHz晶体,将D口闪烁的程序送RAM,并运行 OK
;
RXD =p1.0
TXD =p1.0
DlCnt =25h
TiBuf =26h
RiBuf =27H
TiLen =28h
TiData =29h
RiLen =2AH
mCommd =2bh
mADDrH =2Ch
mADDrL =2dH
DataNum =2EH
org 0
main: ljmp m1
org 0003h
ljmp m1 ;int0入口
org 00bh
ljmp Main ;t0入口
org 0013h
ljmp main ;int1入口
org 1bh
ljmp Main ;t1入口
org 23h
ljmp Main ;串口入口 ;
org 30h
m1: mov sp,#0E1h
mov psw,#0
mov r2,#0B0h
mov r0,#22h
m1_1: mov @r0,#0F0h
inc r0
djnz r2,m1_1
MOV 20H,#0
m2: MOV TiBuf,#0FFH
mov R2,#8
m2_1: lcall pTiSub
DJNZ R2,M2_1
LCAll Dl11Bit
MOV mAddrH,#01
MOV mAddrL,#10h
MOV DataNum,#25
LCALL SendData
LCALL Dl11Bit
MOV mAddrH,#01h
MOV mAddrL,#10h
MOV R1,#30H
MOV DataNum,#25
LCALL Receiv
; lcall GetData ;OK
; LCALl ReadSP ;OK
MOV DPTR,#DATAX
MOV mAddrH,#00
MOV mAddrL,#0FEH
MOV DataNum,#1
LCALL SendDX
LCALL Dl11Bit
lcall dl1ms
MOV TiBuf,#28h ;RUN 命令
LCALL pTiSUB
m3_2: lcall dl20ms
nop
sjmp m3_2
;发送数据表到HC908. OK
;入:mAddrH/L=HC908的首地址,SendNum=数据个数(>1),数据存于DataTab定义的表中
SendData:MOV DPTR,#DataTab
SendDX: SETB TXD
JNB RXD,$
MOV mCommd,#49h ;"Write Memory"命令
MOV R2,#3
MOV R0,#mCommd
SendD_1: MOV TiBuf,@r0
INC R0
LCALL pTiSub
JNZ SendErr
DJNZ R2,SendD_1
CLR A
MOVC A,@A+DPTR
mov TiBuf,a
INC DPTR
LCALL pTiSub
; sjmp SendD_3
SendD_2: LCALL Dl11Bit
MOV TiBuf,#19h ;Index Write 命令
LCALL pTiSub
CLR A
MOVC A,@A+DPTR
mov TiBuf,a
INC DPTR
LCALL pTiSub
SendD_3: DJNZ DataNum,SendD_2
RET
SendErr: nop ;出错
sjmp SendErr
;HC908SR12的指令码(每隔0.5秒左右D口取一次反)
DataTab: DB 6Eh,0FFh, 07h,6Eh, 05h,62h, 6Eh,0C8h
DB 61h, 6Eh,0FAh,60h, 3Bh,60h,0FDh, 3Bh
DB 61h,0F7h, 3Bh,62h,0F1h,33h, 03h, 20h,0EAh
;以上HC908码的指令为:
; MOV #$FF,DDRD ;D口作为输出
;M0: MOV #5,RW2
;M1: MOV #200t,RW1
;M2: MOV #250t,RW0
;M3: DBNZ RW0,M3 ;5T/3T; 此循环约500us
; DBNZ RW1,M2 ;此循环约0.5x200=100ms
; DBNZ RW2,M1
; COM PTD ;D口取反
; BRA M0
DATAX: DB 01h,10h
;从HC908读数据串,存于R1所指的单元.用 Read 命令. OK
;入:mAddrH/L=HC908的首地址,DataNum=数据个数
Receiv: MOV mCommD,#4Ah ;"Read Memory"命令
Receiv1: MOV R2,#3
MOV R0,#mCommd
Receiv2: MOV TiBuf,@r0
INC R0
LCALL pTiSub
DJNZ R2,Receiv2
LCALL pRiSub
MOV @R1,RiBuf
INC R1
LCALL Dl11Bit
MOV a,mAddrL
ADD A,#1
MOV mAddrL,a
CLR A
ADDC a,mAddrH
MOV mAddrH,a
DJNZ DataNum,Receiv1
RET
;从HC908读数据串,存于R1所指的单元. 用Index Read 命令. OK
;入:mAddrH/L=HC908的首地址,DataNum=数据个数/2(>1)
GetData: MOV mCommD,#4Ah ;"Read Memory"命令
MOV R2,#3
MOV R0,#mCommd
GetD_1: MOV TiBuf,@r0
INC R0
LCALL pTiSub
DJNZ R2,GetD_1
LCALL pRiSub
MOV @R1,RiBuf
INC R1
LCALL Dl1BitT
GetD_2: MOV TiBuf,#1Ah ;Index Read 命令
LCALL pTiSub
LCALl pRiSub
MOV @R1,RiBuf
INC R1
LCALl pRiSub
MOV @R1,RiBuf
INC R1
DJNZ DataNum,GetD_2
LCALL Dl11Bit
RET
;读堆栈: SP+1 的高位存于30H,低位存于31H. OK
ReadSP: MOV TiBuf,#0Ch ;Read Stack命令
LCALL pTiSub
Lcall pRiSub
MOV R1,#30h
MOV @R1,RiBuf
INC R1
Lcall pRiSub
MOV @R1,RiBuf
RET
;发送TiBuf中的数据,并接收返回的数据存于RiBuf.
;返回:若发送的数据=接收数据 则A=0
pTiSub: MOV TiLen,#10
MOV A,TiBuf
CLR C
pTi_1: MOV TXD,C ;每一位的时间为92.2us
MOV DLCnt,#38
pTi_2: DJNZ DlCnt,PTi_2
nop
SETB C
RRC A
DJNZ TiLen,Pti_1
SETB TXD
nop
lcall pRiSub
mov a,TiBuf
CLR C
SUBB a,RiBuf
pTi_R: RET
;接收一个数据存于RiBuf
pRiSub: MOV RiLen,#9
JB RXD,$
pRi_1: MOV DLCnt,#18
pRi_2: DJNZ DlCnt,$ ;每位的时间为92.3us
MOV C,RXD
RRC A
nop
MOV DLCnt,#20
DJNZ DlCnt,$
DJNZ RiLen,pRi_1
MOV RiBuf,A
MOV DLCnt,#50
pRi_3: DJNZ DlCnt,PRi_3
reti
DL1BitT: MOV r7,#48
Dl1bit1: DJNZ R7,$
RET
DL11Bit: MOV r6,#11
Dl11b_1: LCALL Dl1bitT
DJNZ R6,Dl11b_1
RET
dl20ms: mov r6,#19
dl20m_1: lcall dl1ms
djnz r6,dl20m_1
dl1ms: mov r7,#250
dl1ms_1: nop
nop
djnz r7,dl1ms_1
dl4us: ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -