程序代码

  • 格式:doc
  • 大小:48.00 KB
  • 文档页数:8

2 部分程序代码

(1)主机程序(zhuji0.asm):

ORG 0000H

AJMP START

ORG 0023H ;串行口中断向量地址

AJMP UART

/**********系统初始化***********/

ORG 0100H

START: MOV TMOD,#00100000B ;选择T1,工作在模式2,作串行口波特率发生器

ANL PCON,#01111111B ;置SMOD位为0

MOV TH1,#0F9H ;波特率=4800b/s

SETB TR1 ;激活T1

MOV SCON,#11010000B ;串行口工作在模式3,REN=1

MOV IE,#10010000B ;EA=1,ES=1

SETB SM2 ;使能多机通信

MOV 30H,#0FFH ;1#从机数据暂存器

MOV 31H,#0FFH ;2#从机数据暂存器

MOV 32H,#0FFH ;3#从机数据暂存器

MOV 40H,#0FFH ;从机地址暂存器

MOV SP,#50H

/******循环检测各从机有无数据发送过来,有,则转发至其它从机*********/

LOOP0: MOV A,P0 ;读入显示口P0,检测1#从机发送数据否?

CJNE A,30H,UART0 ;判断是否有变化?若有变,则执行发送

LCALL DELAY

SETB P3.6 ;没有变化,则不发送,保持接收状态

JMP LOOP1 ;检测P1显示口

LOOP1: MOV A,P1 ;读入显示口P1,检测2#从机发送数据否?

CJNE A,31H,UART1 ;判断是否有变化?若有变,则执行发送

LCALL DELAY

SETB P3.6 ;没有变化,则不发送,保持接收状态

JMP LOOP2 ;检测P2显示口

LOOP2: MOV A,P2 ;读入显示口P2,检测3#从机发送数据否?

CJNE A,32H,UART2 ;判断是否有变化?若有变,则执行发送

LCALL DELAY

SETB P3.6 ;没有变化,则不发送,保持接收状态

JMP LOOP0 ;循检P0显示口

;1#从机有数据发送,将数据转发至2#、3#从机

UART0: MOV 30H,A ;P0口存入新值,1#从机有数据发送过来

CLR P3.6 ;使能MAX487的DE端,处于发送状态

LCALL DELAY

SETB TB8 ;TB8=1,作为第9位发送,即发送地址字节

MOV SBUF,#02H ;发送地址字节02H,寻找2#从机

WAIT1: JBC TI,L0 ;发送完否?TI=1,发送完毕,并对TI清0

JMP WAIT1

L0: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,30H ;发送P0显示口数据

WAIT2: JBC TI,U0 ;发送完否?发送完则继续发送至3#从机

JMP WAIT2

U0: SETB TB8 ;TB8=1,作为第9位发送,即发送地址字节

CLR P3.6 ;使能MAX487的DE端,处于发送状态

MOV SBUF,#03H ;发送地址字节03H,寻找3#从机

W1: JBC TI,U1 ;发送完否?TI=1,发送完毕,并对TI清0

JMP W1

U1: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,30H ;发送P0显示口数据

W2: JBC TI,LOOP0 ;发送完否?发送完则循检P0显示口

JMP W2

;2#从机有数据发送,将数据转发至1#、3#从机

UART1: MOV 31H,A ;P1口存入新值,2#从机有数据发送过来

CLR P3.6 ;使能MAX487的DE端,处于发送状态

LCALL DELAY

SETB TB8 ;TB8=1,作为第9位发送,即发送地址

字节

MOV SBUF,#01H ;发送地址字节01H,寻找1#从机

WAIT3: JBC TI,L1 ;发送完否?TI=1,发送完毕,并对TI清0

JMP WAIT3

L1: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,31H ;发送P1显示口数据

WAIT4: JBC TI,U2 ;发送完否?发送完则继续发送至3#从机

JMP WAIT4

U2: SETB TB8 ;TB8=1,作为第9位发送,即发送地址字节

MOV SBUF,#03H ;发送地址字节03H,寻找3#从机

W3: JBC TI,U3 ;发送完否?TI=1,发送完毕,并对TI清0

JMP W3

U3: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,31H ;发送P1显示口数据

W4: JBC TI,rel0 ;发送完否?发送完则循检P0显示口

JMP W4

rel0: LJMP LOOP0

;3#从机有数据发送,将数据转发至1#、2#从机

UART2: MOV 32H,A ;P2口存入新值,3#从机有数据发送过来

CLR P3.6 ;使能MAX487的DE端,处于发送状态

LCALL DELAY

SETB TB8 ;TB8=1,作为第9位发送,即发送地址字节

MOV SBUF,#01H ;发送地址字节01H,寻找1#从机

WAIT5: JBC TI,L2 ;发送完否?TI=1,发送完毕,并对TI清0

JMP WAIT5

L2: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,32H ;发送P2显示口数据

WAIT6: JBC TI,U4 ;发送完否?发送完则继续发送至2#从机

JMP WAIT6

U4: SETB TB8 ;TB8=1,作为第9位发送,即发送地址字节

MOV SBUF,#02H ;发送地址字节02H,寻找2#从机

W5: JBC TI,U5 ;发送完否?TI=1,发送完毕,并对TI清0

JMP W5

U5: CLR TB8 ;TB8=0,准备发送数据字节

MOV SBUF,32H ;发送P2显示口数据

W6: JBC TI,rel1 ;发送完否?发送完则循检P0显示口

JMP W6

rel1: LJMP LOOP0

/********接收中断程序***********/

UART: CLR P3.6 ;使能MAX487的DE端,处于发送状态

CLR EA

PUSH ACC

PUSH PSW ;保护现场,保存ACC、PSW内容

SETB EA

JBC RI,L5 ;RI=1?,是,则接收到数据,并对RI清零

JMP RETURN ;否,则跳出中断程序

L5: JB SM2,L6 ;SM2=1?是,准备接收地址;否,准备接收数据

L4: MOV A,SBUF ;接收到的数据字节放入A

/********接收数据信息************/

MOV 33H,A ;将数据暂存于33H(RAM单元)

MOV A,40H ;读取从机地址暂存器中的地址信息

;是否是1#从机发送的数据

CJNE A,#01H,L8 ;是否是从机1#地址?

MOV A,33H ;是,则将暂存的数据信息给A

MOV P0,A ;在P0口显示

SETB SM2 ;置SM2=1,等待接收下一个地址

MOV 40H,#0FFH ;清除地址暂存器的地址信息

JMP RETURN

;是否是2#从机发送的数据

L8: CJNE A,#02H,L10 ;是否是从机2#地址?

MOV A,33H ;是,则将暂存的数据信息给A

MOV P1,A ;在P1口显示

SETB SM2 ;SM2=1,等待接收下一个地址

MOV 40H,#0FFH ;清除地址暂存器的地址信息

JMP RETURN

;是否是3#从机发送的数据

L10: CJNE A,#03H,RETURN ;是否是从机3#地址?

MOV A,33H ;是,则将暂存的数据信息给A

MOV P2,A ;在P2口显示

SETB SM2 ;SM2=1,等待接收下一个地址

MOV 40H,#0FFH ;清除地址暂存器的地址信息

JMP RETURN

/********接收地址信息***********/

L6: MOV A,SBUF ;接收到的地址字节放入A

;是否与1#从机发送的地址匹配

CJNE A,#01H,L7 ;是否是从机1#的地址?

MOV 40H,A ;是,则将该地址存入从机地址暂存器

CLR SM2 ;SM2=0,准备接收数据

JMP RETURN

;是否与2#从机发送的地址匹配

L7: CJNE A,#02H,L9 ;是否是从机2#的地址?

MOV 40H,A ;是,则将该地址存入从机地址暂存器

CLR SM2 ;SM2=0,准备接收数据

JMP RETURN

;是否与3#从机发送的地址匹配

L9: CJNE A,#03H,RETURN ;是否是从机3#的地址?

MOV 40H,A ;是,则将该地址存入从机地址暂存器

CLR SM2 ;SM2=0,准备接收数据

RETURN: CLR EA

POP PSW

POP ACC ;恢复现场,恢复ACC、PSW内容

SETB EA

RETI ;中断返回

/********延时1ms子程序**********/