📄 master.lst
字号:
A51 MACRO ASSEMBLER MASTER 06/23/2007 10:55:31 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN master.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE master.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 单片机与单片机通信实例(主机)
3 ;功能:通过串口与从机与主机的通信,对从机1发出问询帧,然后接收从机1
4 ; 的脉冲数,通过简单计算得出电压控制值,通过串口发给从机2
5 ;-----------------------------------
0000 6 ORG 0000H
0000 800B 7 JMP START ; 程序开始
000B 8 ORG 000BH
000B 018E 9 JMP Timer0_ISR ; 定时器T0中断向量
10
000D 11 START:
000D 758160 12 MOV SP,#60H ; 将堆栈位置设为60H
0010 1117 13 CALL Init ; 进行串口及相关寄存器的初始化
0012 75307F 14 MOV 30H,#7FH ; 将30h设为7fh
0015 7B00 15 MOV R3,#0H ; 将触发标志位清零
16
0017 17 Init:
18 ;---------------------------------
19 ; 程序初始化,包括串口、定时器T1、中断的初始化
20 ;---------------------------------
0017 7598D0 21 MOV SCON,#11010000B ; 串口控制寄存器初始化
001A 438780 22 ORL PCON,#10000000B ; 把SMOD位置1
001D D2AF 23 SETB EA ; 中断允许总控制位使能
001F D2A9 24 SETB ET0 ; 定时器T0中断使能
0021 D2B9 25 SETB PT0 ; 把定时器T0中断设为高优先级
0023 1128 26 CALL Timer0_Init ; 进行定时器T0的初始化
0025 112F 27 CALL Timer1_Init ; 进行定时器T1的初始化
0027 22 28 RET
0028 29 Timer0_Init:
30 ;-------------------------
31 ; T0作为定时器,T0溢出一次为一个控制周期
32 ;-------------------------
0028 438901 33 ORL TMOD,#00000001B ; 定时器T0工作在方式1
002B 438810 34 ORL TCON,#00010000B ; 定时器T0使能
002E 22 35 RET
36
002F 37 Timer1_Init:
38 ;-------------------------
39 ; 定时器T1作为串口的波特率发生器
40 ; (2^SMOD)*fosc/32*12*(256-th1)=57600
41 ;-------------------------
002F 438920 42 ORL TMOD,#00100000B ; 定时器T1工作在方式2
0032 438840 43 ORL TCON,#01000000B ; 定时器T1使能
0035 758DFF 44 MOV TH1,#0FFH ; 设定定时器T1的初始值
0038 22 45 RET
0039 46 MainLoop:
0039 BB00FD 47 CJNE R3,#0,MainLoop ; 等待中断触发
003C 7901 48 MOV R1,#01H ; R1中存放地址字节
003E 7AFE 49 MOV R2,#0FEH ; R2中存放命令字节
0040 1164 50 CALL Serial_TX ; 放送给从机1命令帧
0042 00 51 NOP
0043 117D 52 CALL Serial_RX ; 等待接收从机1返回的脉冲数
53
0045 E9 54 MOV A,R1
0046 9401 55 SUBB A,#01H ; 脉冲数减256
0048 4008 56 JC UP_POWER ; 比256小则电压加大,反之则减小
004A 57 DOWN_POWER:
004A 7830 58 MOV R0,#30H ; 30h中存储电压控制值
A51 MACRO ASSEMBLER MASTER 06/23/2007 10:55:31 PAGE 2
004C E6 59 MOV A,@R0 ; 将电压控制值增加2
004D 04 60 INC A
004E 04 61 INC A
004F F6 62 MOV @R0,A ; 将电压控制值写回缓存
0050 8006 63 JMP Send_Con
0052 64 UP_POWER:
0052 7830 65 MOV R0,#30H
0054 E6 66 MOV A,@R0 ; 将电压控制值减小2
0055 14 67 DEC A
0056 14 68 DEC A
0057 F6 69 MOV @R0,A ; 将电压控制值写回缓存
0058 70 Send_Con:
0058 7902 71 MOV R1,#02H ; R1地址字节
005A 7830 72 MOV R0,#30H ; 读取电压控制值
005C E6 73 MOV A,@R0
005D FA 74 MOV R2,A ; R2中存放电压控制值
005E 1164 75 CALL Serial_TX ; 放送从机2的命令帧
0060 7B00 76 MOV R3,#0 ; 清除触发标志位
0062 80D5 77 JMP MainLoop
78
0064 79 Serial_TX:
80 ;-----------------------
81 ; 串口发送,采用查询的方式
82 ;-----------------------
0064 83 Serial_TX_LOOP1:
0064 E9 84 MOV A,R1
0065 F599 85 MOV SBUF,a ; 将一个字节写入串口缓存中
0067 D3 86 SETB C
0068 929B 87 MOV TB8,C ; 将发送的第9位置为1,此字节为地址
006A 88 Serial_TX_WAIT1:
006A 3099FD 89 JNB TI,Serial_TX_WAIT1 ; 等待该字节数据发送完成
006D 00 90 NOP
006E C299 91 CLR TI ; 软件清除串口发送中断标志位
0070 92 Serial_TX_LOOP2:
0070 EA 93 MOV A,R2
0071 F599 94 MOV SBUF,a ; 将一个字节写入串口缓存中
0073 C3 95 CLR C
0074 929B 96 MOV TB8,C ; 将发送的第9位置为0
0076 97 Serial_TX_WAIT2:
0076 3099FD 98 JNB TI,Serial_TX_WAIT2 ; 等待该字节数据发送完成
0079 00 99 NOP
007A C299 100 CLR TI ; 软件清除串口发送中断标志位
007C 22 101 RET
102
007D 103 Serial_RX:
104 ;-------------------
105 ; 串口接收,采用查询RI位的方式
106 ;-------------------
007D 107 Serial_RX_WAIT1: ; 等待下一个字节数据的接收
007D 3098FD 108 JNB RI,Serial_RX_WAIT1
0080 E599 109 MOV A,SBUF ; 将接收到的数据写入A
0082 F9 110 MOV R1,A ; 将接收的数据写入接收数据缓存区
0083 C298 111 CLR RI ; 软件清除串口接收中断标志位
0085 112 Serial_RX_WAIT2: ; 等待下一个字节数据的接收
0085 3098FD 113 JNB RI,Serial_RX_WAIT2
0088 E599 114 MOV A,SBUF ; 将接收到的数据写入A
008A FA 115 MOV R2,A ; 将接收的数据写入接收数据缓存区
008B C298 116 CLR RI
008D 22 117 RET
118
008E 119 Timer0_ISR:
008E C0D0 120 PUSH PSW
0090 0B 121 INC R3 ; 设置标志位,表示定时器T0触发
0091 D0D0 122 POP PSW
0093 32 123 RETI
124 END
A51 MACRO ASSEMBLER MASTER 06/23/2007 10:55:31 PAGE 3
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
DOWN_POWER . . . . C ADDR 004AH A
EA . . . . . . . . B ADDR 00A8H.7 A
ET0. . . . . . . . B ADDR 00A8H.1 A
INIT . . . . . . . C ADDR 0017H A
MAINLOOP . . . . . C ADDR 0039H A
PCON . . . . . . . D ADDR 0087H A
PSW. . . . . . . . D ADDR 00D0H A
PT0. . . . . . . . B ADDR 00B8H.1 A
RI . . . . . . . . B ADDR 0098H.0 A
SBUF . . . . . . . D ADDR 0099H A
SCON . . . . . . . D ADDR 0098H A
SEND_CON . . . . . C ADDR 0058H A
SERIAL_RX. . . . . C ADDR 007DH A
SERIAL_RX_WAIT1. . C ADDR 007DH A
SERIAL_RX_WAIT2. . C ADDR 0085H A
SERIAL_TX. . . . . C ADDR 0064H A
SERIAL_TX_LOOP1. . C ADDR 0064H A
SERIAL_TX_LOOP2. . C ADDR 0070H A
SERIAL_TX_WAIT1. . C ADDR 006AH A
SERIAL_TX_WAIT2. . C ADDR 0076H A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 000DH A
TB8. . . . . . . . B ADDR 0098H.3 A
TCON . . . . . . . D ADDR 0088H A
TH1. . . . . . . . D ADDR 008DH A
TI . . . . . . . . B ADDR 0098H.1 A
TIMER0_INIT. . . . C ADDR 0028H A
TIMER0_ISR . . . . C ADDR 008EH A
TIMER1_INIT. . . . C ADDR 002FH A
TMOD . . . . . . . D ADDR 0089H A
UP_POWER . . . . . C ADDR 0052H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -