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

📄 com.asm

📁 ------------------------ 单片机与PC通信实例 功能:从PC机串口端接收13个字节的数据
💻 ASM
字号:
;----------------------------------
;                   单片机与PC通信实例
;功能:从PC机串口端接收13个字节的数据,然后将接收到的数据加上
;     "Serial Port OK!"的后缀后,发送给PC作为应答
;-----------------------------------
ORG 0000H
JMP START                 ; 程序开始
ORG 0023H                 
JMP Serial_RX_ISR           ; 串口中断向量

START:    
      MOV SP,#60H         ; 将堆栈位置设为60H
      CALL Init             ; 进行串口及相关寄存器的初始化
      MOV 2FH,#30H        ; 将收发缓存区的首地址写入20h
      
      MOV R1,#3DH
      MOV @R1,#53H        ; 'S'的ASCII码写入发送缓存的对应空间(下同)
      INC R1
      MOV @R1,#65H        ; 'e'
      INC R1
      MOV @R1,#72H        ; 'r'
      INC R1
      MOV @R1,#69H        ; 'i'
      INC R1
      MOV @R1,#61H        ; 'a'
      INC R1
      MOV @R1,#6CH        ; 'l'
      INC R1
      MOV @R1,#20         ; 空格的ASCII码
      INC R1
      MOV @R1,#50H        ; 'P'
      INC R1
      MOV @R1,#6FH        ; 'o'
      INC R1
      MOV @R1,#72H        ; 'r'
      INC R1
      MOV @R1,#74H        ; 't'
      INC R1
      MOV @R1,#20H        ; 空格的ASCII码
      INC R1
      MOV @R1,#4FH        ; 'O'
      INC R1
      MOV @R1,#4BH        ; 'K'
      INC R1
      MOV @R1,#21H        ; '!'
      NOP
      NOP
      NOP

MainLoop:
;-----------------------
; 主循环:查询接收是否完成,并进行发送
;-----------------------
      MOV A,2FH              ; 读入当前的缓存地址
      CJNE A,#3DH,MainLoop    ; 当前缓存地址为3DH说明串口已完成13个字节数据的接收
      MOV R3,#0FFH
Delay:
      DJNZ R3,Delay          ; 延时
      CALL Serial_TX         ; 调用串口发送函数
      MOV 2FH,#30H         ; 将缓存地址重新设为初始地址,准备下一个循环的接收
      JMP MainLoop           

Init:
;---------------------------------
;     程序初始化,包括串口、定时器T1、中断的初始化
;---------------------------------
      MOV SCON,#10010000B    ; 串口控制寄存器初始化
      ORL PCON,#10000000B    ; 把SMOD位置1
      SETB EA                 ; 中断允许总控制位使能
      SETB ES                 ; 串口中断使能
      SETB PS                 ; 把串口中断设为高优先级
      CALL Timer1_Init         ; 进行定时器T1的初始化
      RET

Timer1_Init:
;-------------------------
;     定时器T1作为串口的波特率发生器
;     (2^SMOD)*fosc/32*12*(256-th1)=57600
;-------------------------
      MOV TMOD,#00100000B   ; 定时器T1工作在方式2
      MOV TCON,#01000000B    ; 定时器T1使能
      MOV TH1,#0FFH          ; 设定定时器T1的初始值
      RET

Serial_TX:
;-----------------------
;   串口发送,采用查询的方式
;-----------------------
       MOV R1,#30H          ; 发送数据的缓存区起始位置为30h
       MOV R2,#1CH          ; 一次发送28字节数据
Serial_TX_LOOP:
       MOV A,@R1            ; 将要发送的数据写入A
       MOV SBUF,a            ; 将一个字节写入串口缓存中
Serial_TX_WAIT:
       JNB TI,Serial_TX_WAIT ; 等待该字节数据发送完成
       NOP
       CLR TI                ; 软件清除串口发送中断标志位
       INC R1                ; 缓存区地址加1
       DJNZ R2,Serial_TX      ; 判断是否所有数据均已发送
       RET

Serial_RX_ISR:
;-----------------------------------
;     串口接收中断服务程序,需要在程序开始时在2FH处写入缓存区首地址
;-----------------------------------
       PUSH PSW                   ; 程序状态字压栈
       PUSH 1                      ; R1压栈

       MOV C,TI                    ; 判断是否为接收中断
       CLR TI
       JC ISR_OUT

       MOV R1,2FH                 ; 缓存区地址存于2FH
       MOV @R1,SBUF              ; 将接收数据写入缓存区
       CLR RI                      ; 软件清除串口接收中断标志
       INC R1                   
       MOV 2FH,R1                 ; 缓存区地址加1
  ISR_OUT:
       POP 1                       ; R1 出栈
       POP PSW                    ; 程序状态字出栈
       RETI       
                
       END

⌨️ 快捷键说明

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