📄 main.src
字号:
; .\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 + -