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; |