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

📄 com.lst

📁 ------------------------ 单片机与PC通信实例 功能:从PC机串口端接收13个字节的数据
💻 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)

⌨️ 快捷键说明

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