?? withpc.src
字號:
; withPC.SRC generated from: withPC.c
$NOMOD51
NAME WITHPC
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?WITHPC SEGMENT CODE
?DT?main?WITHPC SEGMENT DATA OVERLAYABLE
?PR?initial?WITHPC SEGMENT CODE
?PR?_send?WITHPC SEGMENT CODE
?DT?_send?WITHPC SEGMENT DATA OVERLAYABLE
?PR?Rcv_INT?WITHPC SEGMENT CODE
?PR?_delay?WITHPC SEGMENT CODE
?C_INITSEG SEGMENT CODE
?BI?WITHPC SEGMENT BIT
?DT?WITHPC 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?WITHPC
?_send?BYTE:
temp?244: DS 3
j?245: DS 2
RSEG ?DT?main?WITHPC
?main?BYTE:
datacomm?040: DS 6
datarecv?041: DS 6
count?042: DS 1
datahand?043: DS 1
RSEG ?BI?WITHPC
EvRcv: DBIT 1
RSEG ?DT?WITHPC
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 TRUE 1
; #define FALSE 0
;
; #define LampComm P0_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
; //以上語句定義從機回復(fù)通訊握手信號
; #define MACHINECOMM_DATAHEAD 0x5a
; //以上語句定義數(shù)據(jù)包的頭
; #define MACHINECOMM_DATAEND 0xa5
; //以上語句定義數(shù)據(jù)包的尾
;
; #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; //是否收到串行數(shù)據(jù)的標(biāo)志位
;
; unsigned char rcvdata=0; //從串口存儲接收的變量
; void send(char *temp,int j); //發(fā)送子程序
; void initial(void); //初始化子程序
; void delay(short i); //延時子程序
;
; void main(void)
RSEG ?PR?main?WITHPC
main:
USING 0
; SOURCE LINE # 65
; {
; SOURCE LINE # 66
; unsigned char datacomm[6],datarecv[6];
; unsigned char count=0,datahand;
; SOURCE LINE # 68
CLR A
MOV count?042,A
; datahand=MACHINECOMM_RET;
; SOURCE LINE # 69
MOV datahand?043,#088H
; datacomm[0]=MACHINECOMM_DATAHEAD;
; SOURCE LINE # 70
MOV datacomm?040,#05AH
; datacomm[5]=MACHINECOMM_DATAEND;
; SOURCE LINE # 71
MOV datacomm?040+05H,#0A5H
; datacomm[1]='w';
; SOURCE LINE # 72
MOV datacomm?040+01H,#077H
; datacomm[2]='o';
; SOURCE LINE # 73
MOV datacomm?040+02H,#06FH
; datacomm[3]='r';
; SOURCE LINE # 74
MOV datacomm?040+03H,#072H
; datacomm[4]='k';
; SOURCE LINE # 75
MOV datacomm?040+04H,#06BH
; initial();
; SOURCE LINE # 76
LCALL initial
; SelectComm6=1;//選擇與PC機進行通信。
; SOURCE LINE # 77
SETB P0_6
?C0001:
; while(1)
; SOURCE LINE # 78
; {
; SOURCE LINE # 79
; if(EvRcv)//如果接收到主機端發(fā)送過來的握手信號
; SOURCE LINE # 80
JNB EvRcv,?C0003
; {
; SOURCE LINE # 81
; if(rcvdata==MACHINECOMM_OK)
; SOURCE LINE # 82
MOV A,rcvdata
CJNE A,#011H,?C0004
; { LampComm=TRUE;
; SOURCE LINE # 83
SETB P0_0
; delay(DELAY_VALUE);
; SOURCE LINE # 84
MOV R7,#03H
MOV R6,#00H
LCALL _delay
; LampComm=FALSE;
; SOURCE LINE # 85
CLR P0_0
; } //指示燈閃爍
; SOURCE LINE # 86
?C0004:
; EvRcv=FALSE;
; SOURCE LINE # 87
CLR EvRcv
; break;//退出等待
; SOURCE LINE # 88
SJMP ?C0007
; }
; SOURCE LINE # 89
?C0003:
; send(&datahand,1);//返回一個握手信號
; SOURCE LINE # 90
MOV R3,#00H
MOV R2,#HIGH (datahand?043)
MOV R1,#LOW (datahand?043)
MOV R5,#01H
MOV R4,#00H
LCALL _send
; break;
; SOURCE LINE # 91
; }
; SOURCE LINE # 92
; for(;;){while(1)
; SOURCE LINE # 93
?C0007:
; {if(EvRcv){
; SOURCE LINE # 94
JNB EvRcv,?C0009
; datarecv[count]=rcvdata;
; SOURCE LINE # 95
MOV A,#LOW (datarecv?041)
ADD A,count?042
MOV R0,A
MOV @R0,rcvdata
; count++;
; SOURCE LINE # 96
INC count?042
; EvRcv=FALSE;
; SOURCE LINE # 97
CLR EvRcv
; }
; SOURCE LINE # 98
?C0009:
; if(count==5)break;//如果已經(jīng)收到六個數(shù)據(jù),則認(rèn)為是收到一個數(shù)據(jù)包
; SOURCE LINE # 99
MOV A,count?042
CJNE A,#05H,?C0007
; }//接收一個數(shù)據(jù)包
; SOURCE LINE # 100
?C0008:
; if(datarecv[0]==MACHINECOMM_DATAHEAD&&datarecv[5]==MACHINECOMM_DATAEND)
; SOURCE LINE # 101
MOV A,datarecv?041
CJNE A,#05AH,?C0007
MOV A,datarecv?041+05H
CJNE A,#0A5H,?C0007
; send(datacomm,6);//如果數(shù)據(jù)包正確,則返回一個數(shù)據(jù)包;
; SOURCE LINE # 102
MOV R3,#00H
MOV R2,#HIGH (datacomm?040)
MOV R1,#LOW (datacomm?040)
MOV R5,#06H
MOV R4,#00H
LCALL _send
; }
; SOURCE LINE # 103
SJMP ?C0007
; END OF main
; }
;
; void initial() //初始化子程序
RSEG ?PR?initial?WITHPC
initial:
; SOURCE LINE # 106
; {
; SOURCE LINE # 107
; IP=0x10; //定義串口為高優(yōu)先級中斷
; SOURCE LINE # 108
MOV IP,#010H
; IE=0x97; //允許串口、中斷0、1、定時器0
; SOURCE LINE # 109
MOV IE,#097H
; TCON=0x05;
; SOURCE LINE # 110
MOV TCON,#05H
;
; TMOD=0x21; //定時器1為自動裝入(auto-load)方式
; SOURCE LINE # 112
MOV TMOD,#021H
; PCON=0; //SMOD(PCON.7)=1時,波特率翻倍.//smod=1 (晶振為11.0592M時為0)
; SOURCE LINE # 113
CLR A
MOV PCON,A
;
; SCON=0xD0; //串行口工作方式 : 9位UART, 波特率可變
; SOURCE LINE # 115
MOV SCON,#0D0H
; TH1=0xf3;
; SOURCE LINE # 116
MOV TH1,#0F3H
; TL1=0xf3; //
; SOURCE LINE # 117
MOV TL1,#0F3H
; PCON=0x80|PCON; //SMOD=1; //波特率設(shè)置 : 9600 baud(E8--24MHZ)
; SOURCE LINE # 118
ORL PCON,#080H
; //SMOD=0=4.8kbps
; //th1=tl1=fd,smod=0 ,=19.2kbps
; TR1=1; //啟動定時器1
; SOURCE LINE # 121
SETB TR1
; SelectComm1=0;
; SOURCE LINE # 122
CLR P0_1
; SelectComm2=0;
; SOURCE LINE # 123
CLR P0_2
; SelectComm3=0;
; SOURCE LINE # 124
CLR P0_3
; SelectComm4=0;
; SOURCE LINE # 125
CLR P0_4
; SelectComm5=0;
; SOURCE LINE # 126
CLR P0_5
; SelectComm6=0;
; SOURCE LINE # 127
CLR P0_6
; }
; SOURCE LINE # 128
RET
; END OF initial
;
; void send(unsigned char *temp,int j)
RSEG ?PR?_send?WITHPC
_send:
USING 0
; SOURCE LINE # 130
MOV temp?244,R3
MOV temp?244+01H,R2
MOV temp?244+02H,R1
MOV j?245,R4
MOV j?245+01H,R5
; {
; SOURCE LINE # 131
; int i=0;
; SOURCE LINE # 132
;---- Variable 'i?246' assigned to Register 'R6/R7' ----
CLR A
MOV R7,A
MOV R6,A
; LampComm=TRUE;
; SOURCE LINE # 133
SETB P0_0
; EA=0;
; SOURCE LINE # 134
CLR EA
; for(i=0;i<=j-1;i++) //按發(fā)送數(shù)據(jù)的長度來發(fā)送數(shù)據(jù)
; SOURCE LINE # 135
?C0014:
MOV A,j?245+01H
ADD A,#0FFH
MOV R5,A
MOV A,j?245
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 ?C0015
; {
; SOURCE LINE # 136
; ACC=*(temp+i);
; SOURCE LINE # 137
MOV R3,temp?244
MOV R2,temp?244+01H
MOV R1,temp?244+02H
MOV DPL,R7
MOV DPH,R6
LCALL ?C?CLDOPTR
; TB8=P;
; SOURCE LINE # 138
MOV C,P
MOV TB8,C
; SBUF=ACC; //發(fā)送數(shù)據(jù)
; SOURCE LINE # 139
MOV SBUF,A
?C0017:
; while(TI==0); //發(fā)送數(shù)據(jù)完畢時,TI會自動置高
; SOURCE LINE # 140
JNB TI,?C0017
?C0018:
; TI=0; //發(fā)送數(shù)據(jù)完畢,將TI清零,準(zhǔn)備下一次發(fā)送
; SOURCE LINE # 141
CLR TI
; }
; SOURCE LINE # 142
INC R7
CJNE R7,#00H,?C0026
INC R6
?C0026:
SJMP ?C0014
?C0015:
; EA=1;
; SOURCE LINE # 143
SETB EA
; LampComm=FALSE;
; SOURCE LINE # 144
CLR P0_0
; }
; SOURCE LINE # 145
RET
; END OF _send
CSEG AT 0000BH
LJMP Rcv_INT
;
; void Rcv_INT(void) interrupt 1
RSEG ?PR?Rcv_INT?WITHPC
USING 0
Rcv_INT:
PUSH ACC
PUSH PSW
; SOURCE LINE # 147
; //串口中斷優(yōu)先級為1
; {
; LampComm=TRUE;
; SOURCE LINE # 150
SETB P0_0
; if(RI) //如果收到數(shù)據(jù)則進行下面的操作
; SOURCE LINE # 151
JNB RI,?C0020
; {
; SOURCE LINE # 152
; ACC=SBUF; //將串行通信的緩存中的數(shù)據(jù)存入寄存器A
; SOURCE LINE # 153
MOV A,SBUF
; if(P==RB8)
; SOURCE LINE # 154
MOV C,P
JNB RB8,?C0027
CPL C
?C0027:
JC ?C0021
; {
; SOURCE LINE # 155
; rcvdata=ACC; //將寄存器A中的數(shù)據(jù)存入變量rcvdata
; SOURCE LINE # 156
MOV rcvdata,A
; EvRcv=TRUE; //將已經(jīng)接收到數(shù)據(jù)的標(biāo)志位置高
; SOURCE LINE # 157
SETB EvRcv
; }
; SOURCE LINE # 158
?C0021:
; RI=0; //RI清零
; SOURCE LINE # 159
CLR RI
; }
; SOURCE LINE # 160
?C0020:
; LampComm=FALSE;
; SOURCE LINE # 161
CLR P0_0
; }
; SOURCE LINE # 162
POP PSW
POP ACC
RETI
; END OF Rcv_INT
;
; //延時子程序
; void delay(int i)
RSEG ?PR?_delay?WITHPC
_delay:
USING 0
; SOURCE LINE # 165
;---- Variable 'i?447' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 166
; int j=0;
; SOURCE LINE # 167
;---- Variable 'j?448' assigned to Register 'R2/R3' ----
CLR A
MOV R3,A
MOV R2,A
; i=i*DELAY_VALUE;
; SOURCE LINE # 168
MOV R4,A
MOV R5,#03H
LCALL ?C?IMUL
?C0023:
; while (j<i)j++;
; SOURCE LINE # 169
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 ?C0025
INC R3
CJNE R3,#00H,?C0028
INC R2
?C0028:
SJMP ?C0023
; } ; SOURCE LINE # 170
?C0025:
RET
; END OF _delay
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -