ORG 0000H;
LJMP MAIN;
ORG 0023H ;如果采用中断,要设置中断入口
LJMP ReceiveOneByte ;有接收数据就执行
ORG 0050H;
MAIN:
MOV A,#0FFH;
MOV R2,#0FFH;
MOV SP,#80H;
LCALL CHU ;这是串口初始化程序,运行只要一次
;以下是主循环
PANDUAN: ;所以主程序要转移到这地方
CJNE R2,#0FEH,L1; 继电器控制
CLR P2.0;
L1:CJNE R2,#0FDH,L2;
SETB P2.0;
L2: CJNE R2,#0FCH,L3;
CLR P2.1;
L3:CJNE R2,#0FBH,L4;
SETB P2.1;
L4:CJNE R2,#0FAH,L5;
CLR P2.2;
L5:CJNE R2,#0F9H,L6;
SETB P2.2;
L6:CJNE R2,#0F8H,L7;
CLR P2.3;
L7:CJNE R2,#0F7H,L8;
SETB P2.3;
L8:CJNE R2,#0F6H,L9;
CLR P2.4;
L9:CJNE R2,#0F5H,L10;
SETB P2.4;
L10:CJNE R2,#0F4H,L11;
CLR P2.5;
L11:CJNE R2,#0F3H,L12;
SETB P2.5;
L12:CJNE R2,#0F2H,L13;
CLR P2.6;
L13:CJNE R2,#0F1H,L14;
SETB P2.6;
L14:CJNE R2,#0F0H,L15;
CLR P2.7;
L15:CJNE R2,#0EFH,L16;
SETB P2.7; 继电器控制结束
L16:CJNE R2,#0FEH,L17; 数据控制
MOV R2,#00H;
MOV DPTR,#BUF1;
LCALL LOOP;
LJMP PANDUAN ;此处是主循环返回
L17:CJNE R2,#0EDH,MAIN;
MOV R2,#00H;
MOV DPTR,#BUF2;
LCALL LOOP;
LJMP PANDUAN ;此处是主循环返回
RET;
LOOP:
MOV R0,#03H; 定义发送数量
MOV R3,#00H;
LM:
MOV A,R3;
MOVC A,@A+DPTR;
LCALL SendOneByte; 这是发送已知的3个字节
INC R3;
DJNZ R0,LM;
RET;
SendOneByte: ;这个发送程序可以不用中断
CLR ES; 发送数据
CLR TI;
MOV SBUF,A;
WAIT:
JNB TI,WAIT; 发送等待
CLR TI;
SETB ES;
RETI; ;如果不用中断就要改为RET
CHU:
MOV TMOD,#20H; 串口初始化(勿动)
MOV SCON,#50H;
MOV TH1,#0FDH;
MOV TL1,#0FDH;
MOV PCON,#00H;
SETB EA; 允许中断
SETB ES;
SETB TR1;
RETI; ;此处要改为RET
ReceiveOneByte:
CLR RI; 接收数据
PUSH ACC;
MOV A,SBUF;
MOV R2,A; 接收数据存入R2就可以了,主程序不断判断R2中的数据
;LCALL DELAY100MS; ;以下几行不要了
;LCALL PANDUAN;
;MOV R2,#00H;
POP ACC;
;WAIT1: ;这几行判断是否接收完,中断方式不要,查询方式也要放在前面
;JNB RI,WAIT1;
;CLR RI;
RETI;
DELAY100MS:
MOV R7,#23H;
DL1: MOV R6,#0AH;
DL0: MOV R5,#82H;
DJNZ R5,$;
DJNZ R6,DL0;
DJNZ R7,DL1;
RET;
BUF1: DB 01H,02H,03H; 定义数据段
BUF2: DB 0FDH,0FDH;
END; |