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

📄 1.asm

📁 基于soc芯片的无线遥控器程序。芯片为福星晓成的pl3105
💻 ASM
字号:
CKCON    EQU     8EH            ; 读RAM时钟周期,看门狗控制器
WDI      EQU     8FH            ; 喂狗的寄存器
ALU_MOD  EQU     PSW.1          ;8/16位模式选择 =0 是8位模式
TCON0    EQU     88H
TCON1    EQU     0C8H
EIE      EQU     0A9H           ;扩展中断寄存器  int2
PLM_RST  EQU     91H            ;载波复位寄存器
PLM_SSC  BIT     0D8H.0         ;载波通信使能位
PLM_RS   BIT     0F8H.0         ;载波状态标志
T_END    BIT     40H        ;28H.0 载波40位1发完标志
ZB_OK    BIT     41H
telzb_ok   bit    42h
ORG 0000H
LJMP START
ORG 0003H
;LJMP TEL
RETI
NOP
NOP
org 000bh
    reti
    nop
    nop
org 0013h
 ljmp  WX
 
     nop
    nop
org 001bh
    reti
    nop
    nop
org 0023h
    reti
    nop
    nop
org 002bh
    reti
    nop
    nop
org 0033h
    reti
    nop
    nop
ORG 003BH

LJMP ZB
NOP
NOP
ORG 0050H
START: nop
       nop
       CLR PSW.3
       CLR PSW.4                ;用第一组通用寄存器
       MOV CKCON,#00111000B     ;看门狗周期832mS,RAM时钟周期4
       MOV P0,#0FFH
       MOV P1,#0FFH
       MOV P2,#0FFH
       MOV P3,#0FFH
  ;初始化
       MOV R0,#3EH           ;存0x09
       MOV @R0,#09H
       INC R0
       MOV @R0,#0AFH
       MOV R0,#41H            ;41H和42H存结束位0F00H
       MOV @R0,#0FH
       INC R0
       MOV @R0,#00H
        ANL 22H,#00H          ;清标志位
        ANL 23H,#00H
        ANL 24H,#00H




       MOV R0,#45H            ;发射测试数据
       MOV @R0,#36H
       INC R0
       MOV @R0,#0C3H          ;46H存测试反馈数据
       MOV R3,#0AH            ; ;请47H~50H
       MOV A,#00H
   QL: INC R0
       MOV @R0,A
       DJNZ R3,QL
       MOV 40H,A               ;40H存ZB发送数据
      ; MOV R3,#5               ;振铃检测用  5次振铃有效
       MOV R6,#28H             ;64 bit 1

       MOV R1,#4AH
    mov r2,#09H       ;载波发送次数
    mov r4,#05h
    mov r5,#05h
    mov r3,#05h
                               ;47H~49H存ZB收数据  3次
   			       ;50H存TEL接收数据     处理好的
;RAM分配 			       ;4AH~4EH存TEL接收数据    未处理
;——————————————————————————————————————————
 ;RAM  3EH   3FH    40H       41H      42H      45H      47H~49H
;——————————————————————————————————————————
;DATA  0x09  0xaf  ZB发数据  ZB结束   ZB结束    ZB测试发  ZB接收数据
;        同步桢              位0x0f   位0x00   数据0x36     3次
;——————————————————————————————————————————
;RAM    4AH        4BH         4CH        4DH         4EH          50H
;——————————————————————————————————————————
;DATA  TEL接收   TEL接收地址   TEL接收    TEL接收    TEL接收     处理后的含地址和
;    地址标志*   数据1 or 2  数据标志#  数据5 or 9  结束标志7  开关状态的TEL接收数据

;——————————————————————————————————————————

       CLR ALU_MOD            ;8位模式

       CLR 30H             ;30H 作为电话控制信息更新标志   26H.0
       CLR T_END           ;64bit 1 发完标志 40H  28H.0
       clr 35h
       SETB ZB_OK
       MOV IE,#81H
       MOV EIE,#01H
MOV TCON0,#00000001B    ;边沿触发
       MOV TCON1,#00000001B
     SETB PLM_SSC             ;使能载波通信
      CLR PLM_RS              ;设为收态
   mov 40h,#15h
  mov 2ch,#00h       ;60h singn


      MAIN:nop
          nop
          nop
   fh:    MOV WDI,#0A1H


       jnb ZB_OK,fh
         ;SETB P3.1

         clr PLM_SSC
           LCALL DELAY1
           CLR ZB_OK
         MOV R6,#28H             ;64 bit 1
     jb 60h,sec2
       DJNZ R2,XH
      setb 60h               ;标志,用的不好

 sec2:   jb 61h,sec3
    djnz r3,pre_19
      setb 61h               ;标志,用的不好
      ;ljmp  MAIN
sec3:   jb 62h,sec4
      djnz r4,pre_25
      setb 62h               ;标志,用的不好
      ;ljmp  MAIN
sec4: djnz r5,pre_29


       CLR PLM_SSC       ;发完,则停载波
       clr ea        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/////////////////////////////////////
       mov r2,#09h          ;载波发送次数
       mov r3,#05h
       mov r4,#05h
       mov r5,#05h

       ljmp  MAIN1       ;MAIN1中开载波中断和电话中断
XH: SETB PLM_SSC
 SETB PLM_SSC

      SETB  PLM_RS
          ;CLR P3.1
          LJMP MAIN
pre_19:SETB PLM_SSC
 SETB PLM_SSC

      SETB  PLM_RS
   mov 40h,#19h
          ;CLR P3.1
          LJMP MAIN

pre_25:SETB PLM_SSC
 SETB PLM_SSC

      SETB  PLM_RS
   mov 40h,#19h
          ;CLR P3.1
          LJMP MAIN

pre_29:SETB PLM_SSC
 SETB PLM_SSC

      SETB  PLM_RS
   mov 40h,#29h
          ;CLR P3.1
         LJMP MAIN

 MAIN1:nop
       nop
       MOV WDI,#0A1H
       ;CLR P3.0                 ;指示程序位置
       MOV IE,#86H             ;开int0
       MOV EIE,#00000001B      ;开int2
dengdai:MOV WDI,#0A1H
        MOV IE,#86H             ;开int0
        MOV EIE,#00000001B      ;开int2
            jnb 30h,dengdai             ; if 30h=1,enable zb;!=1,wait for int
   pp:  MOV WDI,#0A1H
        jnb telzb_ok,pp
           ;SETB P3.4
            clr PLM_SSC
            LCALL DELAY1
           clr telzb_ok
            ;CLR 30h
         MOV R6,#40H             ;64 bit 1
         DJNZ R2,telzbxh
       CLR PLM_SSC       ;发完,则停载波
       clr ea        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/////////////////////////////////////
       mov r2,#05h          ;载波发送次数
     clr 30h
             setb telzb_ok
       ljmp  MAIN1       ;MAIN1中开载波中断和电话中断


telzbxh:SETB PLM_SSC
      SETB PLM_SSC
     SETB  PLM_RS
      SETB  PLM_RS
          ;CLR P3.4
          LJMP MAIN1




  ZB:  nop
       nop

     CLR EA
     CLR EA
  mov ie,#00h
    clr p3.0
        MOV WDI,#0A1H          ;foot dog
        MOV PLM_RST,#0A2H       ;91H
        MOV PLM_RST,#0A2H      ;91H
        MOV PLM_RST,#0A2H      ;91H
        MOV PLM_RST,#0A2H      ;91H
        MOV PLM_RST,#0A2H      ;91H
        MOV PLM_RST,#0A2H      ;91H
        SETB PLM_SSC
        SETB PLM_SSC
        SETB PLM_SSC
        SETB PLM_SSC
        SETB PLM_RS
        SETB PLM_RS
        SETB PLM_RS
        SETB PLM_RS




     MOV WDI,#0A1H           ;foot dog




	                         ;ZB时已关掉TEL中断  关总中断有用吗?

       JB PLM_RS,TRANS
ZB_OUT:nop
       nop
    setb p3.0
       SETB EA                 ;开中断
       mov tcon1,#00000001b    ;清中断申请标志
       NOP
       NOP
       NOP
       RETI

TRANS:
       nop
       nop
     ;jnb 30h,ZB_OUT
       MOV PLM_RST,#0A2H      ;91H
        SETB PLM_RS            ;0F8H.0
       JB T_END,ZBF_1
       SETB P3.7               ;发64bit 1
       DJNZ R6,ZB_OUT
       MOV R6,#08h
       MOV R0,#3EH
       MOV A,@R0               ;0x09  to  A
       MOV R7,A
       SETB T_END

       LJMP ZB_OUT
ZBF_1:
       nop
       nop
      JB 10H,ZBF_2             ;10H为0x09发完标志
      LCALL CYCLE_F
      DJNZ R6,ZB_OUT
      SETB 10H
      MOV R6,#08H
      INC R0
      MOV A,@R0               ;r0=3fh
      MOV R7,A
      LJMP ZB_OUT
ZBF_2:JB 11H,ZBF_3            ;11H为0xaf发完标志
      LCALL CYCLE_F
      DJNZ R6,ZB_OUT
      SETB 11H
      MOV R6,#08H
      INC R0                   ; r0=40h,存载波发送数据
      MOV A,@R0
      MOV R7,A

      LJMP ZB_OUT
ZBF_3:JB 12H,ZBF_4
      LCALL CYCLE_F
      DJNZ R6,ZB_OUT
      MOV R6,#08H
      SETB 12H
      MOV R6,#08h
      inc r0                   ;r0=41h   end bit1 0x0f
      MOV A,@R0
      MOV R7,A
      LJMP ZB_OUT
ZBF_4:JB 13H,ZBF_4_2           ;发结束位0x0f
      LCALL CYCLE_F
      DJNZ R6,ZB_OUT
      SETB 13H
      MOV R6,#08H
      INC R0                    ;end bit2 0x00
      MOV A,@R0
      MOV R7,A
     ljmp  ZB_OUT
ZBF_4_2:JB 14H,ZBF_W            ;发结束位0x00
        LCALL CYCLE_F
	DJNZ R6,ZB_OUT
	SETB 14H
AA:	LJMP ZB_OUT

   ljmp ZB_OUT
ZBF_W:  MOV R6,#28H          ;64bit 1
        ANL 22H,#00H          ;清标志位
        ANL 23H,#00H
        ANL 24H,#00H
           setb  ZB_OK
        CLR T_END
        CLR PLM_RS
        ;clr 30h              ;清控制信息更新标志
    setb telzb_ok
        LJMP ZB_OUT

WX:  MOV WDI,#0A1H
     CLR EA
     MOV A,P0
     ANL A,#0FH
    mov c,acc.3
    mov p3.0,c
    mov c,acc.2
    mov p3.1,c
    mov c,acc.1
    mov p3.4,c
    mov c,acc.0
    mov p3.5,c
    call delay1
PRE: JNB P3.3,PRE
     MOV A,P0
     ANL A,#0FH
     XRL A,#05
     JNZ D9
     MOV A,#15H
     MOV 40H,A
     LJMP WX_END
D9: MOV A,#19H
    MOV 40H,A
    
WX_END: SETB EA
     RETI 
     



TEL:    MOV WDI,#0A1H           ;喂狗
        ;clr p3.4                ;电话接收过程中亮,接收完毕,灭
    ;setb p3.0
        mov EIE,#00H            ;关int2,保险些
        mov EIE,#00H            ;关int2,保险些
        mov EIE,#00H            ;关int2,保险些
        mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
        mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
        mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
        mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
        ;DJNZ R3,GJ_pre
   ZJ:  CLR P2.0                ;摘机
        ;clr p3.5                ;测试
   DTMF:MOV WDI,#0A1H           ;喂狗
        ;setb p0.6
       ; jnb p1.3,GJ_pre             ;查忙音
        JNB P0.5, DTMF          ;看解码是否完成
   JM:  MOV WDI,#0A1H           ;喂狗
        MOV IE,#00H             ;关int1
        ;SETB P2.4
       ;clr p0.6                ;end decode sign
     nop
     nop
     nop
     nop
     nop
     nop
     nop
     nop
        MOV A,P0                ;读数据
	ANL A,#0FH
	MOV @R1,A
    mov c,acc.3
    mov p3.0,c
    mov c,acc.2
    mov p3.1,c
    mov c,acc.1
    mov p2.4,c
    mov c,acc.0
    mov p3.5,c
	JB 20H,ADR1_1           ;20H为ADR0 * 收到标志
   ADR0:MOV WDI,#0A1H         ;喂狗
        XRL A,#0BH
        JNZ ERR                 ;不为*则判是否为0
	SETB 20H
	INC R1
	LJMP DTMF_PRE
 ADR1_1:MOV WDI,#0A1H           ;喂狗
       JB 21H,DAT0
        XRL A,#01H              ;地址不为1则看是否为2
	JNZ ADR1_2
	SETB 21H
	INC R1
	LJMP DTMF_PRE
;GJ_pre:
       ; ljmp GJ
 ADR1_2:MOV A,@R1
        XRL A,#02H
	JNZ ERR                ;不为2,则看是否为0
	SETB 21H
	INC R1
	LJMP DTMF_PRE
 DAT0: MOV WDI,#0A1H           ;喂狗
      JB 22H,DAT1_5
      XRL A,#03H               ;是否为3
      JNZ ERR
      SETB 22H
      INC R1
      LJMP DTMF_PRE
 DAT1_5:MOV WDI,#0A1H           ;喂狗
        JB 23H,ENDD
        XRL A,#05H             ;操作不为5,看是否为9
	JNZ DAT1_9
	SETB 23H
	INC R1
	LJMP DTMF_PRE
 DAT1_9:MOV A,@R1
        XRL A,#09H
	JNZ ERR                ;操作不为9,看是否为0
	SETB 23H
	INC R1
	LJMP DTMF_PRE

 ENDD:  MOV WDI,#0A1H           ;喂狗
        XRL A,#07H
        JNZ ERR                   ;结束位为7,正确    处理数据
        MOV A,4BH                 ;处理数据,将4BH、4DH合并放于50H
        SWAP A
	ADD A,4DH
	MOV 50H,A
        MOV 40H,50H              ;将数据放于40H,以便载波发
       MOV A,40H
    CJNE A,#15H,S19
     ;CLR P3.0
 S19:CJNE A,#19H,S25
    ; CLR P3.1
 S25:CJNE A,#25H,S29
     ;CLR P3.5
 S29: CJNE A,#29H,SCW
      ; CLR P0.6

 SCW: ;;CLR P2.5
        setb 30h                 ;置控制信息更新标志
        setb 30h
        setb 30h


         NOP
         NOP
        LJMP GJ
 ERR: MOV WDI,#0A1H
      ;clr p0.6                    ;指示有错误
       MOV A,@R1               ;判是否为0,为0则以前接收数据不算,
      XRL A,#0AH               ;重新开始接收,不为0则数据错误,
      JNZ  GJ                  ;挂机
      ANL 24H,#00H             ;为0,则清标志,初始化
      MOV R1,#4AH                   ;40H中内容
      LJMP DTMF_PRE                 ;1号开       0x15
                                    ;1号关       0x19
                                    ;2号开       0x25
				    ;2号关       0x29
  GJ: MOV WDI,#0A1H
      ;clr p3.0
     ;SETB P3.4
     ANL 24H,#00H                 ;清标志,初始化
     MOV R1, #4AH
     ;LCALL DELAY2
     ;setb p2.0
     ;setb p2.0
     ;setb p2.0
     ;setb p2.0
                  ;clr p2.5
    ;setb p3.1
    ;setb p3.5
    ;setb p2.5
    ;setb p0.6
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; setb telzb_ok
         clr PLM_SSC
       ;SETB P2.5
                    lcall DELAY2
       mov tcon0,#00000001b       ;清中断标志
       MOV TCON1,#00000001B
         mov ie,#86h
         mov ie,#86h
         mov ie,#86h
         mov ie,#86h
         MOV EIE,#00000001B      ;开int2
         MOV EIE,#00000001B      ;开int2
         MOV EIE,#00000001B      ;开int2
  ;clr  p0.6
         nop
         nop
         nop
         nop
         nop
         RETI

DTMF_PRE:;CLR P2.4
         MOV WDI,#0A1H
	 jb p3.3,DTMF_PRE
	 LJMP DTMF


DELAY1:  MOV PLM_RST,#0A2H      ;91H
         MOV	60h,#0FFH		;设定延时时间为1秒左右
          MOV	61h,#0FH		;
WAIT1:    MOV     62h,#0FFH		;
  wp1:    MOV PLM_RST,#0A2H      ;91H
         MOV   	WDI,#0A1h		;
         DJNZ   62h,wp1			;
	 DJNZ    60h,WAIT1		;
         MOV     60h,#0FFH
	 DJNZ    61h,WAIT1
         MOV   	WDI,#0A1h
         MOV PLM_RST,#0A2H      ;91H
          RET

DELAY2:  MOV   	WDI,#0A1h
         MOV	60h,#0FFH		;设定延时时间为1秒左右
         MOV	61h,#0FH		;
WAIT2:    MOV     62h,#0FFH		;
  wp2:    MOV PLM_RST,#0A2H      ;91H
         MOV   	WDI,#0A1h		;
         DJNZ   62h,wp2			;
	 DJNZ    60h,WAIT2		;
         MOV     60h,#0FFH
	 DJNZ    61h,WAIT2
         MOV   	WDI,#0A1h
         MOV PLM_RST,#0A2H      ;91H
          RET

CYCLE_F:MOV A,R7
        RLC A
	MOV P3.7,C
	MOV R7,A
	RET
   END

























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -