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

📄 89c51communication.txt

📁 实现两片基于89c51的功能块之间的通信
💻 TXT
📖 第 1 页 / 共 3 页
字号:
   程 序 清 单

****************************************************
***********从机程序清单****************************
***************************************************
****************************************************
FIRST_COL 	EQU	30H		;定义字符/汉字显示起始行
FIRST_ROW	EQU	31H		;定义字符/汉字显示起始列
WORD_WID	EQU	32H		;定义字符/汉字显示长度
WORD_LIN	EQU	33H		;定义字符/汉字显示行数
FIRST_ADD	EQU	34H 		;定义字符/汉字显示起始位置
START_ADD	EQU	35H       	;起始位置缓存单元
FIRST_LIN	EQU     36h
;**********************************************
;********************************************
;********************************************
hanzi_counter         EQU     38H  ;要发送的字节数
REC_HANZi_SBUF        EQU     80H   ;接受到的汉字存储起始单元
counter  equ  39h
RS	EQU	P3.3
RW	EQU	P3.4
E	EQU	P3.5
PSB	EQU	P3.6
RESET	EQU	P3.7
ORG 0000H
AJMP ALL_START
ORG 0050H
;------------------------------------
ALL_START:MOV EA ,#0H
MOV SCON ,#01010000B;方式2,允许接受
ANL PCON,#7FH;SMOD=0
MOV TMOD,#20H;定时器1,模式2
MOV TH1,#0E6H
MOV TL1,#0E6H;波特率为1200
SETB TR1
MOV SP,#60H
;f0=1,ram;f0=0,rom
mov r3,#05h
mov r4,#0h
;-------------------------------------


;**********************************************
START:ACALL rdy_START_DISP;启动开启显示
      acall disp
;************************************************8
MAIN:acall jieshouqiandao
wt1:jnb ri,wt1
    clr ri
    mov a,sbuf
   xrl  a,#50h
   jz link
   mov a,sbuf
   xrl a,#27h
   jz next1
   ajmp  main
next1:acall rec_hanzi
next11:acall disp

ajmp main
;-----------------------------------
;--------------------------------
REC_HANZI:jnb ri,rec_hanzi
          clr ri
          mov hanzi_counter,sbuf
    wt4:jnb ri,wt4
         clr ri
         mov counter,sbuf
         mov r2,counter
          MOV R0,#REC_HANZI_SBUF

    WT3:  JNB RI,WT3
          CLR RI
          MOV @R0,SBUF
          INC R0

          DJNZ R2,WT3
         ACALL fasongqiandao
         ACALL RDY_HANZI_DISP
          AJMP REC_RET
;-----------------------------
link:acall fasongqiandao
     acall rdy_link_success
     ajmp next11

;---------------------------------------
jieshouqiandao:MOV R4,#0H
R_LINK:JNB RI,R_LINK
       CLR RI
       MOV A,SBUF
       CJNE A,#31H,jieshouqiandao
       INC R4
       CJNE R4,#05H,R_LINK
       MOV R4,#0H
       RET
;----------------------------------------
fasongqiandao:mov sbuf,#30H ;fa song qian dao  shi 0h
LINK_WT:JNB TI,LINK_WT
        CLR TI
        ACALL DELAY01
        DJNZ R3,fasongqiandao
       MOV R3,#05H
       RET
;-----------------------------------------------------
REC_RET:RET
;*************************************************
;***************************************************8
;************显示准备*******************
rdy_link_success:MOV  FIRST_ADD,#00H  ;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV dptr,#link_success_disp			;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	MOV START_ADD,#00H
        clr f0
        RET


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

rdy_start_disp:MOV  FIRST_ADD,#00H  		;设定字符/汉字显示起始位置为第一个显示单元
        MOV FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV dptr,#start_disp		;需要显示汉字机内码数据表
        MOV word_WID,#04H		;每行显示汉字个数
        MOV word_LIN,#01H		;显示行数
	MOV START_ADD,#00H
        clr f0
        RET
;*************************************
;**************************************8
DISP:jb f0,next2
     ajmp rom_disp
 next2:ajmp ram_disp

;------------------------
ram_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,hanzi_counter
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
       acall long
       acall clear_screen

       ret

;------------数字显示--------------------------
;-------------------------

;---------------------------
;-------------------------
DISPL:  LCALL	CHK_BUSY			;P3--CONTRAL	I/O
        NOP				;P3=11111001B   RS=1	WRITE DATA
        SETB	RS
        CLR	RW
        SETB E				;E=E(I/O)
        MOV  P1, A			;P1=DATA(I/O)
        LCALL  DELAY01
        NOP
        CLR E
        NOP
        MOV     P1,#0FFH
        RET
;-----------------
 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
;-----------------
;SEARCH ADDRESS
;目的是为了转换地址单元为DDRAM地址单元,以方便
;定义显示位置
;汉字显示DDRAM位置为:第一行:80H----87H
;		 	第二行:90H----97H
;-----------------
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



;--------------------------------------
CHK_BUSY:    CLR     RS			;读忙状态子程序
        SETB    RW
        SETB    E
HEHE1:  JB      P1.7,HEHE1
        CLR     E
        RET
;--------------------------------------
;写指令子程序
;----------------------------

INPUT:  LCALL	CHK_BUSY		;以确保上一指令/数据模块已经接收处理完
					;P3--CONTRAL	I/O
        NOP				;P3=11111000B	RS=0	WRITE	INSTRUTION
        CLR 	RS
        CLR	RW
        SETB E				;E=E(I/O)
        MOV P1, A			;P1=DATA(I/O)
        LCALL  DELAY01
        NOP
        CLR E
        NOP
        MOV     P1,#0FFH
        RET
;----------------------
;DELAY TIME
;---------------------
DELAY:  MOV  R5,#03H
C0:	MOV  R6, #0FFH
C1:     MOV  R7, #0FFH
C2:     DJNZ R7, C2
        DJNZ R6, C1
        NOP
        NOP
        DJNZ R5, C0
        RET


DELAY01: MOV  R6, #6
D5:     MOV  R7, #08h
D6:     DJNZ R7, D6
        DJNZ R6, D5
        RET
;------------------
DELAY02: MOV  R6, #6
D52:     MOV  R7, #18h
D62:     DJNZ R7, D62
        DJNZ R6, D52
        RET
;---------------------------------
DISP_RET:RET
;***************************************
;*************rom_disp*************
ROM_DISP:setb	RESET
	setb	PSB
	CLR	RW
ROM_QIU1:	LCALL INITIL		;调用系统初始化程序
        MOV A, #0CH			;开显示,关游标
        LCALL INPUT
        LCALL DELAY01
  	MOV A, #01H			;DDRAM清零,DDRAM地址计数器到00H
        LCALL INPUT
        LCALL DELAY01
;-------------------------
ROM_DISP1:
	MOV R1,WORD_WID
ROM_NWORD10:	LCALL	DEADD	;调用调整地址单元子程序
	MOV A, START_ADD			;设定DDRAM地址,显示位置地址
        LCALL INPUT
ROM_NWORD11:CLR A 			;因为要连续输入机内码高位(区码)、低位(位码)
        MOVC A,@A+DPTR		;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书

        LCALL DISPL
       	CLR A		;DATA	INPUT
        INC DPTR
        movC A,@A+DPTR
        lcall displ
        LCALL DELAY01
        INC DPTR
        DJNZ	R1,ROM_NWORD11
        MOV	R1,WORD_WID		;调整显示长度
        INC	FIRST_LIN		;跳到下一行
        DJNZ	WORD_LIN,ROM_NWORD10
        CLR F0;清rom显示标志位
        acall short
        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
D20MS:mov r7,#14h
loop1:mov r6,#0ffh
loop2:nop
  nop
  djnz r6,loop2
  djnz r7,loop1
  ret
;------------------------
short:mov r5,#10h
ppp:acall d20ms
      acall d20ms
      djnz r5,ppp
      acall clear_screen
      ret
 long:mov r5,#20h
eee:acall d20ms
      acall d20ms
      djnz r5,eee
      acall clear_screen
      ret



;*************************************

start_disp:DB  0bbh,0b6h,0d3h,0adh,0cah,0b9h,0d3h,0c3h;欢迎使用
link_success_disp:db 0c1h,0ach,0bdh,0d3h,0b3h,0c9h,0b9h,0a6h;连接成功
end

****************************************************
***********主机程序清单****************************
***************************************************
****************************************************
qm_1   equ   38h
qm_2   equ   39h
wm_1   equ   3ah
wm_2   equ   3bh
jnm1_sbuf  equ  3ch
jnm2_sbuf  equ  3dh
qw_counter equ 3eh
num_sbuf equ 3fh
qw_num   equ 40h
han_counter equ  41h
counter equ  42h
stor equ 43h
rec_num equ 44h
hanzi_sbuf  equ   80h
;********************
FIRST_COL 	EQU	30H		;定义字符/汉字显示起始行
FIRST_ROW	EQU	31H		;定义字符/汉字显示起始列
WORD_WID	EQU	32H		;定义字符/汉字显示长度
WORD_LIN	EQU	33H		;定义字符/汉字显示行数
FIRST_ADD	EQU	34H 	;定义字符/汉字显示起始位置
START_ADD	EQU	35H    ;起始位置缓存单元
FIRST_LIN	EQU     36h

RS	EQU	P3.3
RW	EQU	P3.4
E	EQU	P3.5
PSB	EQU	P3.6
RESET	EQU	P3.7
ORG 0000H
AJMP all_start
org 000bh
ajmp  dingshiqi
ORG 0050H
all_start:MOV IE ,#10000010B;开定时器0的中断
MOV SCON ,#01010000B;方式2,允许接受
ANL PCON,#7FH;SMOD=0
MOV TMOD,#21H;定时器1,模2,定时器0。模式1
MOV TH1,#0E6H
MOV TL1,#0E6H;波特率为1200
setb TR1

MOV SP,#60H
mov 20h,#0h
clr f0
clr f1
MOV TL0,#0H
MOV TH0,#0H;定时为0.6s
mov r3,#05h
mov r4,#0h
mov r1,#hanzi_sbuf

mov qw_counter,#0h
mov han_counter,#0h
mov counter,#0h
;******************************
start:
lcall rdy_start_disp
lcall rom_disp1
lcall long
lcall quweishuru
lcall rom_disp1
lcall long
lcall  del


main:acall key
shanzhuan0:jnb 20h.2,shanzhuan  ; pc模式
          acall link_success

⌨️ 快捷键说明

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