📄 slave1.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 + -