⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 withpc.src

📁 8051编程实例完全手册中的全部程序。相信能给大家带来很多方便
💻 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    
; //以上语句定义从机回复通讯握手信号
; #define MACHINECOMM_DATAHEAD 	0x5a 
; //以上语句定义数据包的头
; #define MACHINECOMM_DATAEND 	0xa5 
; //以上语句定义数据包的尾
; 
; #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?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)//如果接收到主机端发送过来的握手信号
			; 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;//如果已经收到六个数据,则认为是收到一个数据包
			; SOURCE LINE # 99
	MOV  	A,count?042
	CJNE 	A,#05H,?C0007
; 	}//接收一个数据包
			; 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);//如果数据包正确,则返回一个数据包;
			; 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;              //定义串口为高优先级中断
			; 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;		//波特率设置 : 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++)	//按发送数据的长度来发送数据
			; 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;	//发送数据
			; SOURCE LINE # 139
	MOV  	SBUF,A
?C0017:
; 		while(TI==0);	//发送数据完毕时,TI会自动置高
			; SOURCE LINE # 140
	JNB  	TI,?C0017
?C0018:
; 		TI=0;		//发送数据完毕,将TI清零,准备下一次发送
			; 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
; //串口中断优先级为1
; {
; 	LampComm=TRUE;
			; SOURCE LINE # 150
	SETB 	P0_0
; 	if(RI)		//如果收到数据则进行下面的操作
			; SOURCE LINE # 151
	JNB  	RI,?C0020
; 	{
			; SOURCE LINE # 152
; 		ACC=SBUF;		//将串行通信的缓存中的数据存入寄存器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中的数据存入变量rcvdata
			; SOURCE LINE # 156
	MOV  	rcvdata,A
; 			EvRcv=TRUE;	//将已经接收到数据的标志位置高
			; 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -