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

📄 89c51communication.txt

📁 实现两片基于89c51的功能块之间的通信
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        DJNZ R6, C1
        NOP
        NOP
        DJNZ R5, C0
        RET



;------------------
DELAY02: MOV  R6, #6
D52:     MOV  R7, #18h
D62:     DJNZ R7, D62
        DJNZ R6, D52
        RET
clear_screen:setb	RESET
	setb	PSB
	CLR	RW
      	LCALL INITIL	;调用系统初始化程序
        MOV A, #0CH	;开显示,关游标
        LCALL INPUT
        LCALL DELAY01
  	    MOV A, #01H			;DDRAM清零,DDRAM地址计数器到00H
        LCALL INPUT
        LCALL DELAY01
        ret
DEADD:  PUSH	DPH		;地址转换子程序
	PUSH	DPL
	PUSH	A
	MOV	DPTR,#LINE_ADD	;LINE-ADD为地址表指针
	MOV	A,FIRST_LIN
	MOVC	A,@A+DPTR
	ADD	A,FIRST_ADD
	MOV	START_ADD,A
	POP	A
	POP	DPL
	POP	DPH
	RET
LINE_ADD:
	DB  	00H,80H,90H,88H,98H,00H
INITIL: LCALL DELAY			;延时
					;首先选择基本指令集
        MOV A, #30H			;30---基本指令操作
        LCALL  INPUT
        LCALL  DELAY01


        MOV A, #01H			;指令#01H为:清除屏幕文字,把地址指针指向00H单元
        LCALL  INPUT			;
        LCALL  DELAY01

        MOV A, #06H			;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
        LCALL  INPUT
        LCALL  DELAY01
        RET
RDY_NUM_DISP:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行

        MOV word_WID,#01H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	    MOV START_ADD,#00H
        RET

 NUM_DISP:
         setb	RESET
	     setb	PSB
	     CLR	RW
NQIU1:	LCALL INITIL	;调用系统初始化程序
        MOV A, #0CH	;开显示,关游标
        LCALL INPUT
        LCALL DELAY01
  	    MOV A, #01H			;DDRAM清零,DDRAM地址计数器到00H
        LCALL INPUT
        LCALL DELAY01
;-------------------------
NNUM_DISP:LCALL RDY_NUM_DISP
	    MOV R1,WORD_WID
NWORD10:	LCALL	DEADD			;调用调整地址单元子程序
	    MOV A, START_ADD			;设定DDRAM地址,显示位置地址
        LCALL INPUT
NWORD11: 				;因为要连续输入机内码高位(区码)、低位(位码)
        MOV A,NUM_SBUF			;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书

        LCALL DISPL			;DATA	INPUT
        LCALL DELAY01
        mov a,#0h
        lcall displ
        DJNZ	R1,NWORD11
        MOV	R1,WORD_WID		;调整显示长度
        INC	FIRST_LIN		;跳到下一行
        DJNZ	WORD_LIN,NWORD10
        ret
;******************************
;**********发送************
;*******************************
;************************
send:acall send_success
     acall fasongqiandao
     acall send1
     acall jieshouqiandao
     clr tr0
     MOV TL0,#0H
     MOV TH0,#0H;定时为0.6s
     jb f0,lll
     acall rom_disp
     acall long
     acall chongxinglink_disp
     clr f1
     acall rom_disp
     ajmp send_ret
lll: acall rom_disp
     acall long
     acall quweishuru
     acall long
      clr f0
     ajmp send_ret

;***********************
send1:acall long
      acall d20ms
      acall d20ms
      acall d20ms
      acall d20ms
       acall delay01
     mov sbuf,#27h
wtb:jnb ti,wtb
    clr ti
    acall delay01
   
    mov sbuf,han_counter
wtb7:jnb ti,wtb7
     clr ti
   acall delay01
    
     mov sbuf,counter
wtb1:jnb ti,wtb1
     clr ti
     mov r1,#hanzi_sbuf
loop: acall delay01
      
      mov sbuf,@r1
wt0:  jnb ti,wt0
      clr ti
      inc r1
      acall delay01
      
      mov sbuf,@r1
wt1:jnb ti,wt1
     clr ti
     inc r1
djnz han_counter,loop
      ret
send_ret:ret

send_success:MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		  ;设定字符/汉字显示起始位置为第一行
        MOV DPTR, #send_success_disp	;需要显示汉字机内码数据表
        MOV word_WID,#04H		  ;每行显示汉字个数
        MOV word_LIN,#01H		  ;显示行数
	    MOV START_ADD,#00H
        RET
quweishuru:MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV DPTR, #quweishuru_disp  ;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	    MOV START_ADD,#00H
        RET
chongxinglinK_DISP:  MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H	;设定字符/汉字显示起始位置为第一行
        MOV DPTR, #chongxin_link	;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	    MOV START_ADD,#00H
        RET
rdy_chaoshi_disp:MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV DPTR, #chaoshi_disp		;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	    MOV START_ADD,#00H
        RET
fasongqiandao:mov sbuf,#31H ;fa song qian dao  shi 0h
LINK_WT:JNB TI,LINK_WT
       CLR TI
       DJNZ R3,fasongqiandao
       MOV R3,#05H
       RET
jieshouqiandao:
               MOV R7,#07H;定时器的条用次数
               SETB tr0;开启定时器
               MOV R4,#0H
R_LINK:
       JB F1,R_RET ;定时已到,但还没有建立连接
       JNB RI,R_LINK
       CLR RI
       MOV A,SBUF
       CJNE A,#30H,jieshouqiandao
       INC R4
       CJNE R4,#05H,R_LINK
       MOV R4,#0H
R_RET:    RET
dingshiqi:mov tl0,#0h
          mov TH0,#0H

          DJNZ R7,D_RETI
          ACALL RDY_chaoshi_disp

          setb f1;超时连接的标志位
          clr f0;清连接标志位
          D_RETI: RETI
long:  mov r5,#20h
      rrr:acall d20ms
      acall d20ms
      djnz r5,rrr
      ret
;******************************
key_pc:acall rdy_pc_link ;等待微机的命令
       acall rom_disp
       acall long
       acall rdy_try_link
       acall rom_disp

        acall pc_link
        JB 20H.2 ,NEXT7


        AJMP KEY_PC;连接到连上为止
 NEXT7: acall fasongqiandao
        mov dptr,#link_success_disp
        MOV R2,#08h
pc_SEND_WORD_11:CLR A
     MOVC A,@A+DPTR
     MOV SBUF,A
pc_TWT21:JNB TI,pc_TWT21
    CLR TI
    INC DPTR

    DJNZ R2,pc_SEND_WORD_11

      AJMP KEY_RET
;----------------------------------
pc_link:acall PC_jieshouqiandao
    pwt0:    jnb ri,PWT0
             CLR RI
             MOV A,SBUF
             XRL A,#0FFH
             JNZ PC_LINK
             SETB 20H.2

             RET
 PC_jieshouqiandao:MOV R4,#0H
  WT7:  JNB RI,WT7
        CLR RI
       MOV A,SBUF
       CJNE A,#30H,PC_jieshouqiandao
       INC R4
       CJNE R4,#05H,wt7
       MOV R4,#0H
       RET
;-----------------------------
REC_PC:
       acall pc_jieshouqiandao
 PWT1:JNB RI,PWT1
     CLR RI
     MOV A,SBUF
    XRL A,#35H
    JZ  SHOUCHISHOU
    MOV A,SBUF
    XRL A,#39H
    JZ SHOUCHIFA
    ajmp rec_pc
;-------手持发  ---------------------
shouchifa: acall rdy_shouchifa_disp;手持发模式提示
           acall rom_disp
           acall shouchifahuifu
            acall fasong
            ret

;-------------------------------
shouchifahuifu:acall fasongqiandao

pcSEND_WORD1 :mov dptr,#shouchifatishi_tab
        MOV R2,#08h
pcSEND_WORD_11:CLR A
     MOVC A,@A+DPTR
     MOV SBUF,A
pcTWT21:JNB TI,pcTWT21
    CLR TI
    INC DPTR
; ACALL DELAY01
    DJNZ R2,pcSEND_WORD_11
     ret

fasong:
    mov sbuf,counter
pc_wtb7:jnb ti,pc_wtb7
     clr ti
     acall delay01
     mov sbuf,#04
pc_wtb1:jnb ti,pc_wtb1
     clr ti
     acall delay
     mov sbuf,#01
     acall delay01
    mov r1,#hanzi_sbuf
loop0:     mov sbuf,@r1
pc_wt0:  jnb ti,pc_wt0
      clr ti
      inc r1
      mov sbuf,@r1
pc_wt1:jnb ti,pc_wt1
     clr ti
     inc r1
djnz han_counter,loop0
      ret
shouchishou:acall rdy_shouchishou_disp
            acall rom_disp1
            acall shouchishouhuifu
            acall jieshou
            acall ram1_disp
            ajmp pc_rec_ret
;-------------------------------------------
shouchishouhuifu:ACALL fasongqiandao
pcSEND_WORD :mov dptr,#shouchishoutishi_tab
        MOV R2,#08h
pcSEND_WORD_1:CLR A
     MOVC A,@A+DPTR
     MOV SBUF,A
pcTWT2:JNB TI,pcTWT2
     CLR TI
     INC DPTR
     DJNZ R2,pcSEND_WORD_1
     ret
jieshou:acall pc_jieshouqiandao
wt8:     jnb ri,wt8
        clr ri
        mov rec_num,sbuf
ppwt0:jnb ri,ppwt0
         clr ri
         mov word_wid,sbuf
ppwt1:jnb ri,ppwt1
        clr ri
        mov word_lin,sbuf
pc_REC_HANZI:MOV R2,REC_NUM
          MOV R0,#HANZI_SBUF
WT31:  JNB RI,WT31
          CLR RI
          MOV @R0,SBUF
          INC R0
          DJNZ R2,WT31
acall rdy_pc_rec_hanzi
    ret
pc_rec_ret:ret
ram1_DISP:setb	RESET
	setb	PSB
	CLR	RW
WQIU1:	LCALL INITIL			;调用系统初始化程序
        MOV A, #0CH			;开显示,关游标
        LCALL INPUT
        LCALL DELAY01
  	MOV A, #01H			;DDRAM清零,DDRAM地址计数器到00H
        LCALL INPUT
        LCALL DELAY01
;-----------------
;汉字显示子程序
;---------------
WWORD_DISP:
	MOV R1,WORD_WID
WWORD10:	LCALL	DEADD		;调用调整地址单元子程序
	MOV A, START_ADD			;设定DDRAM地址,显示位置地址
        LCALL INPUT
WWORD11: CLR A				;因为要连续输入机内码高位(区码)、低位(位码)
        MOV A, @r0		       ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
        LCALL DISPL			;DATA	INPUT
        INC r0			       ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
        CLR A
        MOV A, @r0
        LCALL DISPL			;DATA	INPUT
        LCALL DELAY01
        INC r0
        DJNZ	R1,WWORD11
        MOV	R1,WORD_WID		;调整显示长度
        INC	FIRST_LIN		        ;跳到下一行
        DJNZ	WORD_LIN,WWORD10
       ret

rdy_pc_link:MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV dptr,#pc_lnk			;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	MOV START_ADD,#00H
        ret


rdy_pc_rec_hanzi:MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV R0,#hanzi_sbuf			;需要显示汉字机内码数据表
        MOV START_ADD,#00H
        ret

rdy_shouchishou_disp: MOV FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		         ;设定字符/汉字显示起始位置为第一行
        MOV dptr,#shouchishoutishi_tab		 ;需要显示汉字机内码数据表
        MOV word_WID,#04H		         ;每行显示汉字个数
        MOV word_LIN,#01H		         ;显示行数
	    MOV START_ADD,#00H
        ret

rdy_shouchifa_disp:MOV FIRST_ADD,#00H    ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		         ;设定字符/汉字显示起始位置为第一行
        MOV dptr,#shouchifatishi_tab		 ;需要显示汉字机内码数据表
        MOV word_WID,#04H		         ;每行显示汉字个数
        MOV word_LIN,#01H		         ;显示行数
	    MOV START_ADD,#00H 
        ret

;*********************************
send_success_disp:db 0b7h,0a2h,0cbh,0cdh,0b3h,0c9h,0b9h,0a6h;发送成功
link_success_disp:db 0c1h,0ach,0bdh,0d3h,0b3h,0c9h,0b9h,0a6h;连接成功
CHAOSHI_DISP:DB 0b3h,0ach,0cah,0b1h,0b3h,0f6h,0b4h,0edh;超时出错
chongxin_link:DB 0d6h,0d8h,0d0h,0c2h,0c1h,0ach,0bdh,0d3h;重新连接
try_link:db 0bdh,0a8h,0c1h,0a2h,0c1h,0ach,0bdh,0d3h;建立连接
start_disp:db  0bbh,0b6h,0d3h,0adh,0cah,0b9h,0d3h,0c3h;欢迎使用
quweishuru_disp:db 0c7h,0f8h,0ceh,0bbh,0cah,0e4h,0c8h,0ebh ;区位输入
anjiantishi_disp:db 0b0h,0b4h,0c1h,0ach,0bdh,0d3h,0bch,0fch;按连接键
pc_lnk:db 0CEH,0A2H,0BBH,0FAH,0cdh,0a8h,0d0h,0c5h;微机模式
shouchishoutishi_tab:db 0CEH,0A2H,0BBH,0FAH,0B7H,0A2H,0cbh,0cdh;微机发送
shouchifatishi_tab:db 0CEH,0A2H,0BBH,0FAH,0BDH,0D3H,0CAH,0D5H ;微机接受
end
 

⌨️ 快捷键说明

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