📄 slave1.lst
字号:
A51 MACRO ASSEMBLER SLAVE1 06/23/2007 10:56:36 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN slave1.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE slave1.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 单片机与单片机通信实例(从机1)
3 ;功能:通过串口接收主机的询问信号,然后通过串口返回脉冲数
4 ;-----------------------------------
0000 5 ORG 0000H
0000 8023 6 JMP START ; 程序开始
0023 7 ORG 0023H
0023 803C 8 JMP Serial_RX_ISR ; 串口中断向量
9
0025 10 START:
0025 758160 11 MOV SP,#60H ; 将堆栈位置设为60H
0028 112C 12 CALL Init ; 进行串口及相关寄存器的初始化
13
002A 14 MainLoop:
15 ;-----------------------
16 ; 主循环:
17 ;-----------------------
002A 80FE 18 JMP MainLoop
19
002C 20 Init:
21 ;---------------------------------
22 ; 程序初始化,包括串口、定时器T1、中断的初始化
23 ;---------------------------------
002C 7598F0 24 MOV SCON,#11110000B ; 串口控制寄存器初始化
002F 438780 25 ORL PCON,#10000000B ; 把SMOD位置1
0032 D2AF 26 SETB EA ; 中断允许总控制位使能
0034 D2AC 27 SETB ES ; 串口中断使能
0036 D2BC 28 SETB PS ; 把串口中断设为高优先级
0038 113D 29 CALL Timer0_Init ; 进行定时器T0的初始化
003A 1144 30 CALL Timer1_Init ; 进行定时器T1的初始化
003C 22 31 RET
003D 32 Timer0_Init:
33 ;-------------------------
34 ; T0作为计数器
35 ;-------------------------
003D 438905 36 ORL TMOD,#00000101B ; 计数器T0工作在方式1
0040 438810 37 ORL TCON,#00010000B ; 计数器T0使能
0043 22 38 RET
0044 39 Timer1_Init:
40 ;-------------------------
41 ; 定时器T1作为串口的波特率发生器
42 ; (2^SMOD)*fosc/32*12*(256-th1)=57600
43 ;-------------------------
0044 438920 44 ORL TMOD,#00100000B ; 定时器T1工作在方式2
0047 438840 45 ORL TCON,#01000000B ; 定时器T1使能
004A 758DFF 46 MOV TH1,#0FFH ; 设定定时器T1的初始值
004D 22 47 RET
48
004E 49 Serial_TX:
50 ;-----------------------
51 ; 串口发送,采用查询的方式
52 ;-----------------------
004E E9 53 MOV A,R1 ; 将要发送的数据写入A
004F F599 54 MOV SBUF,a ; 将一个字节写入串口缓存中
0051 55 Serial_TX_WAIT1:
0051 3099FD 56 JNB TI,Serial_TX_WAIT1 ; 等待该字节数据发送完成
0054 00 57 NOP
0055 C299 58 CLR TI ; 软件清除串口发送中断标志位
A51 MACRO ASSEMBLER SLAVE1 06/23/2007 10:56:36 PAGE 2
59
0057 EA 60 MOV A,R2 ; 将要发送的数据写入A
0058 F599 61 MOV SBUF,a ; 将一个字节写入串口缓存中
005A 62 Serial_TX_WAIT2:
005A 3099FD 63 JNB TI,Serial_TX_WAIT2 ; 等待该字节数据发送完成
005D 00 64 NOP
005E C299 65 CLR TI ; 软件清除串口发送中断标志位
0060 22 66 RET
67
0061 68 Serial_RX_ISR:
69 ;-----------------------------------
70 ; 串口接收中断服务程序,需要在程序开始时在2FH处写入缓存区首地址
71 ;-----------------------------------
0061 C0D0 72 PUSH PSW ; 程序状态字压栈
0063 C001 73 PUSH 1 ; R1压栈
0065 C002 74 PUSH 2 ; R2压栈
75
0067 A299 76 MOV C,TI
0069 C299 77 CLR TI
006B 401E 78 JC OUT_ISR
79
006D E599 80 MOV A,SBUF
006F B40119 81 CJNE A,#01,Out_ISR ; 判断是否为从机1的命令帧
0072 C29D 82 CLR SM2 ; 把SM2清零
0074 C2AC 83 CLR ES ; 禁止串口中断
0076 C298 84 CLR RI ; 软件清除串口接收中断标志
0078 00 85 NOP
0079 86 Serial_RX_WAIT: ; 等待下一个字节数据的接收
0079 3098FD 87 JNB RI,Serial_RX_WAIT
007C E599 88 MOV A,SBUF ; 将接收到的数据写入A
007E B4FE0A 89 CJNE A,#0FEH,Out_ISR
0081 E58C 90 MOV A,TH0
0083 F9 91 MOV R1,A ; 计数器高位放入R1
0084 E58A 92 MOV A,TL0
0086 FA 93 MOV R2,A ; 计数器低位放入R2
0087 114E 94 CALL Serial_TX ; 应答主机
0089 D29D 95 SETB SM2 ; SM2置1
008B 96 Out_ISR:
008B C298 97 CLR RI ; 软件清除串口接收中断标志位
008D D002 98 POP 2 ; R2 出栈
008F D001 99 POP 1 ; R1 出栈
0091 D0D0 100 POP PSW ; 程序状态字出栈
0093 32 101 RETI
102
103 END
A51 MACRO ASSEMBLER SLAVE1 06/23/2007 10:56:36 PAGE 3
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
EA . . . . . . . . B ADDR 00A8H.7 A
ES . . . . . . . . B ADDR 00A8H.4 A
INIT . . . . . . . C ADDR 002CH A
MAINLOOP . . . . . C ADDR 002AH A
OUT_ISR. . . . . . C ADDR 008BH A
PCON . . . . . . . D ADDR 0087H A
PS . . . . . . . . B ADDR 00B8H.4 A
PSW. . . . . . . . D ADDR 00D0H A
RI . . . . . . . . B ADDR 0098H.0 A
SBUF . . . . . . . D ADDR 0099H A
SCON . . . . . . . D ADDR 0098H A
SERIAL_RX_ISR. . . C ADDR 0061H A
SERIAL_RX_WAIT . . C ADDR 0079H A
SERIAL_TX. . . . . C ADDR 004EH A
SERIAL_TX_WAIT1. . C ADDR 0051H A
SERIAL_TX_WAIT2. . C ADDR 005AH A
SM2. . . . . . . . B ADDR 0098H.5 A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 0025H A
TCON . . . . . . . D ADDR 0088H A
TH0. . . . . . . . D ADDR 008CH A
TH1. . . . . . . . D ADDR 008DH A
TI . . . . . . . . B ADDR 0098H.1 A
TIMER0_INIT. . . . C ADDR 003DH A
TIMER1_INIT. . . . C ADDR 0044H A
TL0. . . . . . . . D ADDR 008AH A
TMOD . . . . . . . D ADDR 0089H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -