《51单片机应用开发桉例精选》源代码及图片下载
源代码在线查看: com.lst
A51 MACRO ASSEMBLER COM 06/23/2007 10:33:35 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN com.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE com.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 单片机与PC通信实例
3 ;功能:从PC机串口端接收13个字节的数据,然后将接收到的数据加上
4 ; "Serial Port OK!"的后缀后,发送给PC作为应答
5 ;-----------------------------------
0000 6 ORG 0000H
0000 8023 7 JMP START ; 程序开始
0023 8 ORG 0023H
0023 8073 9 JMP Serial_RX_ISR ; 串口中断向量
10
0025 11 START:
0025 758160 12 MOV SP,#60H ; 将堆栈位置设为60H
0028 116E 13 CALL Init ; 进行串口及相关寄存器的初始化
002A 752F30 14 MOV 2FH,#30H ; 将收发缓存区的首地址写入20h
15
002D 793D 16 MOV R1,#3DH
002F 7753 17 MOV @R1,#53H ; 'S'的ASCII码写入发送缓存的对应空间(下同)
0031 09 18 INC R1
0032 7765 19 MOV @R1,#65H ; 'e'
0034 09 20 INC R1
0035 7772 21 MOV @R1,#72H ; 'r'
0037 09 22 INC R1
0038 7769 23 MOV @R1,#69H ; 'i'
003A 09 24 INC R1
003B 7761 25 MOV @R1,#61H ; 'a'
003D 09 26 INC R1
003E 776C 27 MOV @R1,#6CH ; 'l'
0040 09 28 INC R1
0041 7714 29 MOV @R1,#20 ; 空格的ASCII码
0043 09 30 INC R1
0044 7750 31 MOV @R1,#50H ; 'P'
0046 09 32 INC R1
0047 776F 33 MOV @R1,#6FH ; 'o'
0049 09 34 INC R1
004A 7772 35 MOV @R1,#72H ; 'r'
004C 09 36 INC R1
004D 7774 37 MOV @R1,#74H ; 't'
004F 09 38 INC R1
0050 7720 39 MOV @R1,#20H ; 空格的ASCII码
0052 09 40 INC R1
0053 774F 41 MOV @R1,#4FH ; 'O'
0055 09 42 INC R1
0056 774B 43 MOV @R1,#4BH ; 'K'
0058 09 44 INC R1
0059 7721 45 MOV @R1,#21H ; '!'
005B 00 46 NOP
005C 00 47 NOP
005D 00 48 NOP
49
005E 50 MainLoop:
51 ;-----------------------
52 ; 主循环:查询接收是否完成,并进行发送
53 ;-----------------------
005E E52F 54 MOV A,2FH ; 读入当前的缓存地址
0060 B43DFB 55 CJNE A,#3DH,MainLoop ; 当前缓存地址为3DH说明串口已完成13个字节数据的接收
0063 7BFF 56 MOV R3,#0FFH
0065 57 Delay:
0065 DBFE 58 DJNZ R3,Delay ; 延时
A51 MACRO ASSEMBLER COM 06/23/2007 10:33:35 PAGE 2
0067 1187 59 CALL Serial_TX ; 调用串口发送函数
0069 752F30 60 MOV 2FH,#30H ; 将缓存地址重新设为初始地址,准备下一个循环的接收
006C 80F0 61 JMP MainLoop
62
006E 63 Init:
64 ;---------------------------------
65 ; 程序初始化,包括串口、定时器T1、中断的初始化
66 ;---------------------------------
006E 759890 67 MOV SCON,#10010000B ; 串口控制寄存器初始化
0071 438780 68 ORL PCON,#10000000B ; 把SMOD位置1
0074 D2AF 69 SETB EA ; 中断允许总控制位使能
0076 D2AC 70 SETB ES ; 串口中断使能
0078 D2BC 71 SETB PS ; 把串口中断设为高优先级
007A 117D 72 CALL Timer1_Init ; 进行定时器T1的初始化
007C 22 73 RET
74
007D 75 Timer1_Init:
76 ;-------------------------
77 ; 定时器T1作为串口的波特率发生器
78 ; (2^SMOD)*fosc/32*12*(256-th1)=57600
79 ;-------------------------
007D 758920 80 MOV TMOD,#00100000B ; 定时器T1工作在方式2
0080 758840 81 MOV TCON,#01000000B ; 定时器T1使能
0083 758DFF 82 MOV TH1,#0FFH ; 设定定时器T1的初始值
0086 22 83 RET
84
0087 85 Serial_TX:
86 ;-----------------------
87 ; 串口发送,采用查询的方式
88 ;-----------------------
0087 7930 89 MOV R1,#30H ; 发送数据的缓存区起始位置为30h
0089 7A1C 90 MOV R2,#1CH ; 一次发送28字节数据
008B 91 Serial_TX_LOOP:
008B E7 92 MOV A,@R1 ; 将要发送的数据写入A
008C F599 93 MOV SBUF,a ; 将一个字节写入串口缓存中
008E 94 Serial_TX_WAIT:
008E 3099FD 95 JNB TI,Serial_TX_WAIT ; 等待该字节数据发送完成
0091 00 96 NOP
0092 C299 97 CLR TI ; 软件清除串口发送中断标志位
0094 09 98 INC R1 ; 缓存区地址加1
0095 DAF0 99 DJNZ R2,Serial_TX ; 判断是否所有数据均已发送
0097 22 100 RET
101
0098 102 Serial_RX_ISR:
103 ;-----------------------------------
104 ; 串口接收中断服务程序,需要在程序开始时在2FH处写入缓存区首地址
105 ;-----------------------------------
0098 C0D0 106 PUSH PSW ; 程序状态字压栈
009A C001 107 PUSH 1 ; R1压栈
108
009C A299 109 MOV C,TI ; 判断是否为接收中断
009E C299 110 CLR TI
00A0 4009 111 JC ISR_OUT
112
00A2 A92F 113 MOV R1,2FH ; 缓存区地址存于2FH
00A4 A799 114 MOV @R1,SBUF ; 将接收数据写入缓存区
00A6 C298 115 CLR RI ; 软件清除串口接收中断标志
00A8 09 116 INC R1
00A9 892F 117 MOV 2FH,R1 ; 缓存区地址加1
00AB 118 ISR_OUT:
00AB D001 119 POP 1 ; R1 出栈
00AD D0D0 120 POP PSW ; 程序状态字出栈
00AF 32 121 RETI
122
123 END
A51 MACRO ASSEMBLER COM 06/23/2007 10:33:35 PAGE 3
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
DELAY. . . . . . . C ADDR 0065H A
EA . . . . . . . . B ADDR 00A8H.7 A
ES . . . . . . . . B ADDR 00A8H.4 A
INIT . . . . . . . C ADDR 006EH A
ISR_OUT. . . . . . C ADDR 00ABH A
MAINLOOP . . . . . C ADDR 005EH 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 0098H A
SERIAL_TX. . . . . C ADDR 0087H A
SERIAL_TX_LOOP . . C ADDR 008BH A
SERIAL_TX_WAIT . . C ADDR 008EH A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 0025H A
TCON . . . . . . . D ADDR 0088H A
TH1. . . . . . . . D ADDR 008DH A
TI . . . . . . . . B ADDR 0098H.1 A
TIMER1_INIT. . . . C ADDR 007DH A
TMOD . . . . . . . D ADDR 0089H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)