⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmon.asm

📁 motorola HC908SR12芯片编程4
💻 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 + -