📄 master.src
字号:
; master.SRC generated from: master.c
$NOMOD51
NAME MASTER
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
P0_0 BIT 080H.0
P1_0 BIT 090H.0
P0_1 BIT 080H.1
P2_0 BIT 0A0H.0
P1_1 BIT 090H.1
P0_2 BIT 080H.2
P2_1 BIT 0A0H.1
P1_2 BIT 090H.2
P0_3 BIT 080H.3
P2_2 BIT 0A0H.2
P1_3 BIT 090H.3
P0_4 BIT 080H.4
P3_2 BIT 0B0H.2
P2_3 BIT 0A0H.3
P1_4 BIT 090H.4
P0_5 BIT 080H.5
P3_3 BIT 0B0H.3
P2_4 BIT 0A0H.4
P1_5 BIT 090H.5
P0_6 BIT 080H.6
RD BIT 0B0H.7
P2_5 BIT 0A0H.5
P1_6 BIT 090H.6
P0_7 BIT 080H.7
P2_6 BIT 0A0H.6
P1_7 BIT 090H.7
ES BIT 0A8H.4
P2_7 BIT 0A0H.7
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
PS BIT 0B8H.4
SP DATA 081H
OV BIT 0D0H.2
WR BIT 0B0H.6
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
REN BIT 098H.4
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?main?MASTER SEGMENT CODE
?DT?main?MASTER SEGMENT DATA OVERLAYABLE
?PR?initial?MASTER SEGMENT CODE
?PR?_send?MASTER SEGMENT CODE
?DT?_send?MASTER SEGMENT DATA OVERLAYABLE
?PR?Rcv_INT?MASTER SEGMENT CODE
?PR?_delay?MASTER SEGMENT CODE
?C_INITSEG SEGMENT CODE
?BI?MASTER SEGMENT BIT
?DT?MASTER SEGMENT DATA
EXTRN CODE (?C_STARTUP)
EXTRN CODE (?C?CLDOPTR)
EXTRN CODE (?C?IMUL)
PUBLIC rcvdata
PUBLIC EvRcv
PUBLIC _delay
PUBLIC Rcv_INT
PUBLIC _send
PUBLIC initial
PUBLIC main
RSEG ?DT?_send?MASTER
?_send?BYTE:
temp?242: DS 3
j?243: DS 2
RSEG ?DT?main?MASTER
?main?BYTE:
datacomm?040: DS 1
count?041: DS 1
RSEG ?BI?MASTER
EvRcv: DBIT 1
RSEG ?DT?MASTER
rcvdata: DS 1
RSEG ?C_INITSEG
DB 0C1H, EvRcv + 000H ; bit-init
DB 001H
DB rcvdata
DB 000H
; #pragma SRC
; #include <stdio.h>
; #include <reg51.h>
;
; #define LampComm P0_0
; #define TRUE 1
; #define FALSE 0
; //以上语句定义主机正在通讯闪灯信号
; #define SelectComm1 P0_1
; #define SelectComm2 P0_2
; #define SelectComm3 P0_3
; #define SelectComm4 P0_4
; #define SelectComm5 P0_5
; #define SelectComm6 P0_6
; //以上语句定义主机通讯的从机号
; #define MACHINECOMM_OK 0x11
; //以上语句定义主机通讯传送握手信号
; #define MACHINECOMM_RET 0x88
; //以上语句定义从机回复通讯握手信号
;
; #define DELAY_VALUE 3
;
; sbit P0_0=P0^0;
; sbit P0_1=P0^1;
; sbit P0_2=P0^2;
; sbit P0_3=P0^3;
; sbit P0_4=P0^4;
; sbit P0_5=P0^5;
; sbit P0_6=P0^6;
; sbit P0_7=P0^7;
;
; sbit P1_0=P1^0;
; sbit P1_1=P1^1;
; sbit P1_2=P1^2;
; sbit P1_3=P1^3;
; sbit P1_4=P1^4;
; sbit P1_5=P1^5;
; sbit P1_6=P1^6;
; sbit P1_7=P1^7;
;
; sbit P2_0=P2^0;
; sbit P2_1=P2^1;
; sbit P2_2=P2^2;
; sbit P2_3=P2^3;
; sbit P2_4=P2^4;
; sbit P2_5=P2^5;
; sbit P2_6=P2^6;
; sbit P2_7=P2^7;
;
; sbit P3_2=P3^2;
; sbit P3_3=P3^3;
;
;
; bit EvRcv=FALSE; //是否收到串行数据的标志位
;
; unsigned char rcvdata=0; //从串口存储接收的变量
; void send(char *temp,int j); //发送子程序
; void initial(void); //初始化子程序
; void delay(short i); //延时子程序
;
; void main(void)
RSEG ?PR?main?MASTER
main:
USING 0
; SOURCE LINE # 61
; {
; SOURCE LINE # 62
; unsigned char datacomm,count=0;
; SOURCE LINE # 63
CLR A
MOV count?041,A
; datacomm=MACHINECOMM_OK;
; SOURCE LINE # 64
MOV datacomm?040,#011H
; initial();
; SOURCE LINE # 65
LCALL initial
?C0001:
; while(1)
; SOURCE LINE # 66
; {
; SOURCE LINE # 67
; for (count=0;count<6;count++)
; SOURCE LINE # 68
CLR A
MOV count?041,A
?C0003:
; {
; SOURCE LINE # 69
; switch(count)
; SOURCE LINE # 70
MOV A,count?041
DEC A
JZ ?C0008
DEC A
JZ ?C0009
DEC A
JZ ?C0010
DEC A
JZ ?C0011
DEC A
JZ ?C0012
ADD A,#05H
JNZ ?C0006
; {
; SOURCE LINE # 71
; case 0: SelectComm1=1;
; SOURCE LINE # 72
?C0007:
SETB P0_1
; break;
; SOURCE LINE # 73
SJMP ?C0006
; case 1: SelectComm2=1;
; SOURCE LINE # 74
?C0008:
SETB P0_2
; break;
; SOURCE LINE # 75
SJMP ?C0006
; case 2: SelectComm3=1;
; SOURCE LINE # 76
?C0009:
SETB P0_3
; break;
; SOURCE LINE # 77
SJMP ?C0006
; case 3: SelectComm4=1;
; SOURCE LINE # 78
?C0010:
SETB P0_4
; break;
; SOURCE LINE # 79
SJMP ?C0006
; case 4: SelectComm5=1;
; SOURCE LINE # 80
?C0011:
SETB P0_5
; break;
; SOURCE LINE # 81
SJMP ?C0006
; case 5: SelectComm6=1;
; SOURCE LINE # 82
?C0012:
SETB P0_6
; break;
; SOURCE LINE # 83
; default:break;
; SOURCE LINE # 84
; } //根据count的不同值,选通不同的从机
; SOURCE LINE # 85
?C0006:
; send(&datacomm,1); //发送握手信号
; SOURCE LINE # 86
MOV R3,#00H
MOV R2,#HIGH (datacomm?040)
MOV R1,#LOW (datacomm?040)
MOV R5,#01H
MOV R4,#00H
LCALL _send
?C0014:
; while(1)
; SOURCE LINE # 87
; {
; SOURCE LINE # 88
; if(EvRcv)//如果接收到数据
; SOURCE LINE # 89
JNB EvRcv,?C0014
; {
; SOURCE LINE # 90
; if(rcvdata==MACHINECOMM_RET)
; SOURCE LINE # 91
MOV A,rcvdata
CJNE A,#088H,?C0017
; { LampComm=TRUE;
; SOURCE LINE # 92
SETB P0_0
; delay(DELAY_VALUE);
; SOURCE LINE # 93
MOV R7,#03H
MOV R6,#00H
LCALL _delay
; LampComm=FALSE;
; SOURCE LINE # 94
CLR P0_0
; } //指示灯闪烁
; SOURCE LINE # 95
?C0017:
; EvRcv=FALSE;
; SOURCE LINE # 96
CLR EvRcv
; break;//退出等待
; SOURCE LINE # 97
; }
; SOURCE LINE # 98
; }
; SOURCE LINE # 99
;
; }
; SOURCE LINE # 101
?C0005:
INC count?041
MOV A,count?041
CLR C
SUBB A,#06H
JC ?C0003
?C0004:
; SelectComm1=0;
; SOURCE LINE # 102
CLR P0_1
; SelectComm2=0;
; SOURCE LINE # 103
CLR P0_2
; SelectComm3=0;
; SOURCE LINE # 104
CLR P0_3
; SelectComm4=0;
; SOURCE LINE # 105
CLR P0_4
; SelectComm5=0;
; SOURCE LINE # 106
CLR P0_5
; SelectComm6=0;//再次不选通所有的从机
; SOURCE LINE # 107
CLR P0_6
; }
; SOURCE LINE # 108
SJMP ?C0001
; END OF main
; }
;
; void initial() //初始化子程序
RSEG ?PR?initial?MASTER
initial:
; SOURCE LINE # 111
; {
; SOURCE LINE # 112
; IP=0x10; //定义串口为高优先级中断
; SOURCE LINE # 113
MOV IP,#010H
; IE=0x97; //允许串口、中断0、1、定时器0
; SOURCE LINE # 114
MOV IE,#097H
; TCON=0x05;
; SOURCE LINE # 115
MOV TCON,#05H
;
; TMOD=0x21; //定时器1为自动装入(auto-load)方式
; SOURCE LINE # 117
MOV TMOD,#021H
; PCON=0; //SMOD(PCON.7)=1时,波特率翻倍.//smod=1 (晶振为11.0592M时为0)
; SOURCE LINE # 118
CLR A
MOV PCON,A
;
; SCON=0xD0; //串行口工作方式 : 9位UART, 波特率可变
; SOURCE LINE # 120
MOV SCON,#0D0H
; TH1=0xf3;
; SOURCE LINE # 121
MOV TH1,#0F3H
; TL1=0xf3; //
; SOURCE LINE # 122
MOV TL1,#0F3H
; PCON=0x80|PCON; //SMOD=1; //波特率设置 : 9600 baud(E8--24MHZ)
; SOURCE LINE # 123
ORL PCON,#080H
; //SMOD=0=4.8kbps
; //th1=tl1=fd,smod=0 ,=19.2kbps
; TR1=1; //启动定时器1
; SOURCE LINE # 126
SETB TR1
; SelectComm1=0;
; SOURCE LINE # 127
CLR P0_1
; SelectComm2=0;
; SOURCE LINE # 128
CLR P0_2
; SelectComm3=0;
; SOURCE LINE # 129
CLR P0_3
; SelectComm4=0;
; SOURCE LINE # 130
CLR P0_4
; SelectComm5=0;
; SOURCE LINE # 131
CLR P0_5
; SelectComm6=0;
; SOURCE LINE # 132
CLR P0_6
; }
; SOURCE LINE # 133
RET
; END OF initial
;
; void send(unsigned char *temp,int j)
RSEG ?PR?_send?MASTER
_send:
USING 0
; SOURCE LINE # 135
MOV temp?242,R3
MOV temp?242+01H,R2
MOV temp?242+02H,R1
MOV j?243,R4
MOV j?243+01H,R5
; {
; SOURCE LINE # 136
; int i=0;
; SOURCE LINE # 137
;---- Variable 'i?244' assigned to Register 'R6/R7' ----
CLR A
MOV R7,A
MOV R6,A
; LampComm=TRUE;
; SOURCE LINE # 138
SETB P0_0
; EA=0;
; SOURCE LINE # 139
CLR EA
; for(i=0;i<=j-1;i++) //按发送数据的长度来发送数据
; SOURCE LINE # 140
?C0020:
MOV A,j?243+01H
ADD A,#0FFH
MOV R5,A
MOV A,j?243
ADDC A,#0FFH
MOV R4,A
SETB C
MOV A,R7
SUBB A,R5
MOV A,R4
XRL A,#080H
MOV R0,A
MOV A,R6
XRL A,#080H
SUBB A,R0
JNC ?C0021
; {
; SOURCE LINE # 141
; ACC=*(temp+i);
; SOURCE LINE # 142
MOV R3,temp?242
MOV R2,temp?242+01H
MOV R1,temp?242+02H
MOV DPL,R7
MOV DPH,R6
LCALL ?C?CLDOPTR
; TB8=P;
; SOURCE LINE # 143
MOV C,P
MOV TB8,C
; SBUF=ACC; //发送数据
; SOURCE LINE # 144
MOV SBUF,A
?C0023:
; while(TI==0); //发送数据完毕时,TI会自动置高
; SOURCE LINE # 145
JNB TI,?C0023
?C0024:
; TI=0; //发送数据完毕,将TI清零,准备下一次发送
; SOURCE LINE # 146
CLR TI
; }
; SOURCE LINE # 147
INC R7
CJNE R7,#00H,?C0032
INC R6
?C0032:
SJMP ?C0020
?C0021:
; EA=1;
; SOURCE LINE # 148
SETB EA
; LampComm=FALSE;
; SOURCE LINE # 149
CLR P0_0
; }
; SOURCE LINE # 150
RET
; END OF _send
CSEG AT 0000BH
LJMP Rcv_INT
;
; void Rcv_INT(void) interrupt 1
RSEG ?PR?Rcv_INT?MASTER
USING 0
Rcv_INT:
PUSH ACC
PUSH PSW
; SOURCE LINE # 152
; //串口中断优先级为1
; {
; LampComm=TRUE;
; SOURCE LINE # 155
SETB P0_0
; if(RI) //如果收到数据则进行下面的操作
; SOURCE LINE # 156
JNB RI,?C0026
; {
; SOURCE LINE # 157
; ACC=SBUF; //将串行通信的缓存中的数据存入寄存器A
; SOURCE LINE # 158
MOV A,SBUF
; if(P==RB8)
; SOURCE LINE # 159
MOV C,P
JNB RB8,?C0033
CPL C
?C0033:
JC ?C0027
; {
; SOURCE LINE # 160
; rcvdata=ACC; //将寄存器A中的数据存入变量rcvdata
; SOURCE LINE # 161
MOV rcvdata,A
; EvRcv=TRUE; //将已经接收到数据的标志位置高
; SOURCE LINE # 162
SETB EvRcv
; }
; SOURCE LINE # 163
?C0027:
; RI=0; //RI清零
; SOURCE LINE # 164
CLR RI
; }
; SOURCE LINE # 165
?C0026:
; LampComm=FALSE;
; SOURCE LINE # 166
CLR P0_0
; }
; SOURCE LINE # 167
POP PSW
POP ACC
RETI
; END OF Rcv_INT
;
; //延时子程序
; void delay(int i)
RSEG ?PR?_delay?MASTER
_delay:
USING 0
; SOURCE LINE # 170
;---- Variable 'i?445' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 171
; int j=0;
; SOURCE LINE # 172
;---- Variable 'j?446' assigned to Register 'R2/R3' ----
CLR A
MOV R3,A
MOV R2,A
; i=i*DELAY_VALUE;
; SOURCE LINE # 173
MOV R4,A
MOV R5,#03H
LCALL ?C?IMUL
?C0029:
; while (j<i)j++;
; SOURCE LINE # 174
CLR C
MOV A,R3
SUBB A,R7
MOV A,R6
XRL A,#080H
MOV R0,A
MOV A,R2
XRL A,#080H
SUBB A,R0
JNC ?C0031
INC R3
CJNE R3,#00H,?C0034
INC R2
?C0034:
SJMP ?C0029
; } ; SOURCE LINE # 175
?C0031:
RET
; END OF _delay
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -