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

📄 main.src

📁 实验7 在RAM中执行程序代码 实验7 在RAM中执行程序代码 实验7 在RAM中执行程序代码
💻 SRC
📖 第 1 页 / 共 2 页
字号:
; .\main.SRC generated from: main.c
; COMPILER INVOKED BY:
;        E:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND SRC(.\main.SRC)

$NOMOD51

NAME	MAIN

K4	BIT	0B0H.5
P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
T2	BIT	090H.0
EA	BIT	0A8H.7
IE	DATA	0A8H
EXF2	BIT	0C8H.6
RD	BIT	0B0H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
RCAP2H	DATA	0CBH
PS	BIT	0B8H.4
SP	DATA	081H
T2EX	BIT	090H.1
OV	BIT	0D0H.2
RCAP2L	DATA	0CAH
C_T2	BIT	0C8H.1
WR	BIT	0B0H.6
RCLK	BIT	0C8H.5
TCLK	BIT	0C8H.4
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
CP_RL2	BIT	0C8H.0
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
ET2	BIT	0A8H.5
TF1	BIT	088H.7
TF2	BIT	0C8H.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
TH2	DATA	0CDH
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
TL2	DATA	0CCH
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
PT2	BIT	0B8H.5
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
TR2	BIT	0C8H.2
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
EXEN2	BIT	0C8H.3
BUZZER	BIT	090H.2
REN	BIT	098H.4
T2CON	DATA	0C8H
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?INT0_ISR?MAIN    SEGMENT CODE 
?PR?T0_ISR?MAIN      SEGMENT CODE 
?PR?INT1_ISR?MAIN    SEGMENT CODE 
?PR?T1_ISR?MAIN      SEGMENT CODE 
?PR?Serial_ISR?MAIN  SEGMENT CODE 
?PR?T2_ISR?MAIN      SEGMENT CODE 
?PR?UartInit?MAIN    SEGMENT CODE 
?PR?_AnalyseHEX?MAIN SEGMENT CODE 
?DT?_AnalyseHEX?MAIN SEGMENT DATA OVERLAYABLE 
?PR?Beep?MAIN        SEGMENT CODE 
?PR?_Delay?MAIN      SEGMENT CODE 
?PR?GotoRam?MAIN     SEGMENT CODE 
?PR?_GetString?MAIN  SEGMENT CODE 
?DT?_GetString?MAIN  SEGMENT DATA OVERLAYABLE 
?PR?main?MAIN        SEGMENT CODE 
?DT?main?MAIN        SEGMENT DATA OVERLAYABLE 
?CO?MAIN             SEGMENT CODE 
?ID?main?MAIN        SEGMENT IDATA OVERLAYABLE 
?PD?main?MAIN        SEGMENT XDATA INPAGE OVERLAYABLE 
	EXTRN	CODE (_toint)
	EXTRN	CODE (_isxdigit)
	EXTRN	CODE (_getkey)
	EXTRN	CODE (_printf)
	EXTRN	DATA (?_printf?BYTE)
	EXTRN	CODE (_strlen)
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	main
	PUBLIC	_GetString
	PUBLIC	GotoRam
	PUBLIC	_Delay
	PUBLIC	Beep
	PUBLIC	_AnalyseHEX
	PUBLIC	UartInit
	PUBLIC	T2_ISR
	PUBLIC	Serial_ISR
	PUBLIC	T1_ISR
	PUBLIC	INT1_ISR
	PUBLIC	T0_ISR
	PUBLIC	INT0_ISR

	RSEG  ?DT?_AnalyseHEX?MAIN
?_AnalyseHEX?BYTE:
   IntelHEX?740:   DS   1
        hex?741:   DS   1
	ORG  2
          i?742:   DS   1
          j?743:   DS   1
          t?744:   DS   1
          n?745:   DS   1
         cc?746:   DS   1
          x?747:   DS   2

	RSEG  ?DT?main?MAIN
?main?BYTE:
         n?1254:   DS   1
         i?1255:   DS   1
      addr?1256:   DS   2

	RSEG  ?DT?_GetString?MAIN
?_GetString?BYTE:
         s?1150:   DS   1
      size?1151:   DS   1
	ORG  2
         c?1152:   DS   1
         n?1153:   DS   1

	RSEG  ?ID?main?MAIN
  IntelHEX?1257:   DS   39

	RSEG  ?PD?main?MAIN
       buf?1258:   DS   76

	RSEG  ?CO?MAIN
?SC_0:
	DB  'O' ,'K' ,',' ,' ' ,'p' ,'r' ,'e' ,'s' ,'s' ,' ' 
	DB  'K' ,'4' ,' ' ,'t' ,'o' ,' ' ,'e' ,'x' ,'e' ,'c' 
	DB  'u' ,'t' ,'i' ,'n' ,'g' ,'.' ,00DH,00AH,000H

?SC_29:
	DB  'R' ,'e' ,'a' ,'d' ,'y' ,00DH,00AH,000H

; /*******************************************************************************
; 程序名称:引导程序,通过串行口加载HEX程序文件到片外RAM并运行
; 硬件接法:P1.2控制交流蜂鸣器发声
;           片外接16KB RAM,地址范围0x8000~0xBFFF
; 功能描述:通过串行口加载HEX程序文件,转换成BIN格式并保存在片外RAM中;
;           加载完毕后蜂鸣器鸣叫,并等待按下K4;
;           K4按下后,跳转到RAM去执行程序。
; *******************************************************************************/
; 
; 
; #include <REG52.h>
; #include <ABSACC.H>
; #include <ctype.h>
; #include <string.h>
; #include <stdio.h>
; 
; 
; //定义I/O端口
; sbit BUZZER = P1^2;	//交流蜂鸣器
; sbit K4 = P3^5;		//按键,按下时输入低电平
; 
; 
; //设置晶振频率
; #define MCLK		11059200L
; //设置波特率
; #define BaudRate	4800L
; 
; 
; //外部中断INT0入口
CSEG	AT	00003H
	LJMP	INT0_ISR

; void INT0_ISR() interrupt 0

	RSEG  ?PR?INT0_ISR?MAIN
	USING	0
INT0_ISR:
			; SOURCE LINE # 30
; {
; #pragma asm
; 	LJMP	0x8003
	  LJMP	0x8003
; #pragma endasm
; }
			; SOURCE LINE # 35
	RETI 	
; END OF INT0_ISR

CSEG	AT	0000BH
	LJMP	T0_ISR

; 
; //定时器T0中断入口
; void T0_ISR() interrupt 1

	RSEG  ?PR?T0_ISR?MAIN
	USING	0
T0_ISR:
			; SOURCE LINE # 38
; {
; #pragma asm
; 	LJMP	0x800B
	  LJMP	0x800B
; #pragma endasm
; }
			; SOURCE LINE # 43
	RETI 	
; END OF T0_ISR

CSEG	AT	00013H
	LJMP	INT1_ISR

; 
; //外部中断INT1入口
; void INT1_ISR() interrupt 2

	RSEG  ?PR?INT1_ISR?MAIN
	USING	0
INT1_ISR:
			; SOURCE LINE # 46
; {
; #pragma asm
; 	LJMP	0x8013
	  LJMP	0x8013
; #pragma endasm
; }
			; SOURCE LINE # 51
	RETI 	
; END OF INT1_ISR

CSEG	AT	0001BH
	LJMP	T1_ISR

; 
; //定时器T1中断入口
; void T1_ISR() interrupt 3

	RSEG  ?PR?T1_ISR?MAIN
	USING	0
T1_ISR:
			; SOURCE LINE # 54
; {
; #pragma asm
; 	LJMP	0x801B
	  LJMP	0x801B
; #pragma endasm
; }
			; SOURCE LINE # 59
	RETI 	
; END OF T1_ISR

CSEG	AT	00023H
	LJMP	Serial_ISR

; 
; //串行口收发中断入口
; void Serial_ISR() interrupt 4

	RSEG  ?PR?Serial_ISR?MAIN
	USING	0
Serial_ISR:
			; SOURCE LINE # 62
; {
; #pragma asm
; 	LJMP	0x8023
	  LJMP	0x8023
; #pragma endasm
; }
			; SOURCE LINE # 67
	RETI 	
; END OF Serial_ISR

CSEG	AT	0002BH
	LJMP	T2_ISR

; 
; //定时器T2中断入口
; void T2_ISR() interrupt 5

	RSEG  ?PR?T2_ISR?MAIN
	USING	0
T2_ISR:
			; SOURCE LINE # 70
; {
; #pragma asm
; 	LJMP	0x802B
	  LJMP	0x802B
; #pragma endasm
; }
			; SOURCE LINE # 75
	RETI 	
; END OF T2_ISR

; 
; 
; //串行口初始化
; void UartInit()

	RSEG  ?PR?UartInit?MAIN
UartInit:
			; SOURCE LINE # 79
; {
			; SOURCE LINE # 80
; //串行口设置:8位UART,允许接收,TI置位
; 	SCON = 0x52;
			; SOURCE LINE # 82
	MOV  	SCON,#052H
; //波特率加倍
; 	PCON |= 0x80;
			; SOURCE LINE # 84
	ORL  	PCON,#080H
; //设置定时器T1为8位自动重装模式
; 	TMOD &= 0x0F;
			; SOURCE LINE # 86
	ANL  	TMOD,#0FH
; 	TMOD |= 0x20;
			; SOURCE LINE # 87
	ORL  	TMOD,#020H
; //设置定时器T1的初值
; 	TH1 = 256 - ( MCLK / 12 ) / (16 * BaudRate );
			; SOURCE LINE # 89
	MOV  	TH1,#0F4H
; 	TL1 = TH1;
			; SOURCE LINE # 90
	MOV  	TL1,TH1
; //启动定时器T1
; 	TR1 = 1;
			; SOURCE LINE # 92
	SETB 	TR1
; }
			; SOURCE LINE # 93
	RET  	
; END OF UartInit

; 
; 
; //定义联合整型结构,为访问整型变量的字节部分提供了方便
; typedef union
; {
; 	unsigned int i;
; 	struct
; 	{
; 		unsigned char H;
; 		unsigned char L;
; 	}CharPart;
; }UnionInt;
; 
; 
; //定义Intel HEX记录的结构
; typedef struct
; {
; 	unsigned char ll;	//长度
; 	unsigned int aaaa;	//地址
; 	unsigned char tt;	//记录类型,0-数据,1-终止
; 	char dd[32];		//数据
; 	char cc;			//校验和
; 	unsigned int BootAddr;	//启动地址
; }CIntelHEX;
; 
; 
; /*******************************************************************************
; 函数:AnalyseHEX()
; 功能:分析一条HEX记录(把Intel HEX记录的文本转换成IntelHEX结构)
; 参数:hex[]是记录的文本一行内容
;       转换后的结果保存在IntelHEX结构中
; 返回:1-转换成功
;       0-HEX记录文本中有错误
; *******************************************************************************/
; bit AnalyseHEX(CIntelHEX idata *IntelHEX, char pdata *hex)

	RSEG  ?PR?_AnalyseHEX?MAIN
_AnalyseHEX:
	USING	0
			; SOURCE LINE # 128
	MOV  	IntelHEX?740,R7
	MOV  	hex?741,R5
; {
			; SOURCE LINE # 129
; 	unsigned char i;
; 	unsigned char j;
; 	unsigned char t;
; 	unsigned char n;
; 	unsigned char cc;
; 	UnionInt x;
; //检查冒号
; 	if ( hex[0] != ':' ) return 0;
			; SOURCE LINE # 137
	MOV  	R0,hex?741
	MOVX 	A,@R0
	XRL  	A,#03AH
	JZ   	?C0008
	CLR  	C
	RET  	
?C0008:
; //检查长度
; 	t = (toint(hex[1])<<4) + toint(hex[2]);
			; SOURCE LINE # 139
	MOV  	A,hex?741
	INC  	A
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	R6,A
	PUSH 	AR6
	MOV  	A,hex?741
	ADD  	A,#02H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	POP  	ACC
	ADD  	A,R7
	MOV  	t?744,A
; 	if ( t > 32 ) return 0;
			; SOURCE LINE # 140
	SETB 	C
	SUBB 	A,#020H
	JC   	?C0010
	RET  	
?C0010:
; 	n = 2 * t + 11;
			; SOURCE LINE # 141
	MOV  	A,t?744
	ADD  	A,ACC
	ADD  	A,#0BH
	MOV  	n?745,A
; 	if ( n != strlen(hex) ) return 0;
			; SOURCE LINE # 142
	MOV  	R1,hex?741
	MOV  	R2,#00H
	MOV  	R3,#0FEH
	LCALL	_strlen
	MOV  	A,R7
	XRL  	A,n?745
	JNZ  	?C0057
	MOV  	A,R6
?C0057:
	JZ   	?C0011
	CLR  	C
	RET  	
?C0011:
; 	IntelHEX->ll = t;
			; SOURCE LINE # 143
	MOV  	R0,IntelHEX?740
	MOV  	@R0,t?744
; 	cc = t;
			; SOURCE LINE # 144
	MOV  	cc?746,t?744
; //提取地址
; 	t = (toint(hex[3])<<4) + toint(hex[4]);
			; SOURCE LINE # 146
	MOV  	A,hex?741
	ADD  	A,#03H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	R6,A
	PUSH 	AR6
	MOV  	A,hex?741
	ADD  	A,#04H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	POP  	ACC
	ADD  	A,R7
	MOV  	t?744,A
; 	cc += t;
			; SOURCE LINE # 147
	ADD  	A,cc?746
	MOV  	cc?746,A
; 	x.CharPart.H = t;
			; SOURCE LINE # 148
	MOV  	x?747,t?744
; 	t = (toint(hex[5])<<4) + toint(hex[6]);
			; SOURCE LINE # 149
	MOV  	A,hex?741
	ADD  	A,#05H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	R6,A
	PUSH 	AR6
	MOV  	A,hex?741
	ADD  	A,#06H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	POP  	ACC
	ADD  	A,R7
	MOV  	t?744,A
; 	cc += t;
			; SOURCE LINE # 150
	ADD  	A,cc?746
	MOV  	cc?746,A
; 	x.CharPart.L = t;
			; SOURCE LINE # 151
	MOV  	x?747+01H,t?744
; 	IntelHEX->aaaa = x.i;
			; SOURCE LINE # 152
	MOV  	A,IntelHEX?740
	INC  	A
	MOV  	R0,A
	MOV  	@R0,x?747
	INC  	R0
	MOV  	@R0,x?747+01H
; //提取记录类型
; 	t = (toint(hex[7])<<4) + toint(hex[8]);
			; SOURCE LINE # 154
	MOV  	A,hex?741
	ADD  	A,#07H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	R6,A
	PUSH 	AR6
	MOV  	A,hex?741

⌨️ 快捷键说明

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