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

📄 slave1.asm

📁 c51 book very good for 51 study
💻 ASM
字号:
;----------------------------------
;                   单片机与单片机通信实例(从机1)
;功能:通过串口接收主机的询问信号,然后通过串口返回脉冲数
;-----------------------------------
ORG 0000H
JMP START                 ; 程序开始
ORG 0023H                 
JMP Serial_RX_ISR           ; 串口中断向量

START:    
      MOV SP,#60H         ; 将堆栈位置设为60H
      CALL Init             ; 进行串口及相关寄存器的初始化       

MainLoop:
;-----------------------
; 主循环:
;-----------------------
      JMP MainLoop           

Init:
;---------------------------------
;     程序初始化,包括串口、定时器T1、中断的初始化
;---------------------------------
      MOV SCON,#11110000B    ; 串口控制寄存器初始化
      ORL PCON,#10000000B    ; 把SMOD位置1
      SETB EA                 ; 中断允许总控制位使能
      SETB ES                 ; 串口中断使能
      SETB PS                 ; 把串口中断设为高优先级
      CALL Timer0_Init        ; 进行定时器T0的初始化
      CALL Timer1_Init         ; 进行定时器T1的初始化
      RET
Timer0_Init:
;-------------------------
;    T0作为计数器
;-------------------------
      ORL TMOD,#00000101B   ; 计数器T0工作在方式1
      ORL TCON,#00010000B   ; 计数器T0使能
      RET
Timer1_Init:
;-------------------------
;     定时器T1作为串口的波特率发生器
;     (2^SMOD)*fosc/32*12*(256-th1)=57600
;-------------------------
      ORL TMOD,#00100000B   ; 定时器T1工作在方式2
      ORL TCON,#01000000B    ; 定时器T1使能
      MOV TH1,#0FFH          ; 设定定时器T1的初始值
      RET

Serial_TX:
;-----------------------
;   串口发送,采用查询的方式
;-----------------------
       MOV A,R1            ; 将要发送的数据写入A
       MOV SBUF,a            ; 将一个字节写入串口缓存中
Serial_TX_WAIT1:
       JNB TI,Serial_TX_WAIT1 ; 等待该字节数据发送完成
       NOP
       CLR TI                ; 软件清除串口发送中断标志位

       MOV A,R2              ; 将要发送的数据写入A
       MOV SBUF,a            ; 将一个字节写入串口缓存中
Serial_TX_WAIT2:
       JNB TI,Serial_TX_WAIT2 ; 等待该字节数据发送完成
       NOP
       CLR TI                ; 软件清除串口发送中断标志位      
       RET

Serial_RX_ISR:
;-----------------------------------
;     串口接收中断服务程序,需要在程序开始时在2FH处写入缓存区首地址
;-----------------------------------
       PUSH PSW                   ; 程序状态字压栈
       PUSH 1                      ; R1压栈
       PUSH 2                     ; R2压栈
       
       MOV C,TI
       CLR TI
JC OUT_ISR
       
       MOV A,SBUF 
       CJNE A,#01,Out_ISR         ; 判断是否为从机1的命令帧
       CLR SM2                    ; 把SM2清零
       CLR ES                     ; 禁止串口中断
       CLR RI                      ; 软件清除串口接收中断标志
       NOP
Serial_RX_WAIT:                    ; 等待下一个字节数据的接收     
       JNB RI,Serial_RX_WAIT
       MOV A,SBUF                ; 将接收到的数据写入A
       CJNE A,#0FEH,Out_ISR
       MOV A,TH0
       MOV R1,A                   ; 计数器高位放入R1
       MOV A,TL0
       MOV R2,A                   ; 计数器低位放入R2
       CALL Serial_TX              ; 应答主机
       SETB SM2                   ; SM2置1
Out_ISR:  
       CLR RI                     ; 软件清除串口接收中断标志位
       POP 2                      ; R2 出栈
       POP 1                       ; R1 出栈
       POP PSW                    ; 程序状态字出栈
       RETI       
                
       END

⌨️ 快捷键说明

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