程序代码
- 格式: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子程序**********/