📄 slave2.asm
字号:
;----------------------------------
; 单片机与单片机通信实例(从机2)
;功能:通过串口接收主机的控制信号,然后通过数模转换输出模拟信号
;-----------------------------------
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 Timer1_Init ; 进行定时器T1的初始化
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
DA_Operation:
;-------------------------
; DAC0832的操作
; 电压控制值存放在ACC中
;-------------------------
CLR P3.6 ; 将WR设为低
MOV DPTR,#0EFFFH ; 选中片选信号
MOVX @DPTR,A ; 输出控制电压
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,#02,Out_ISR ; 判断是否为从机2的命令帧
CLR SM2 ; 把SM2清零
CLR ES ; 禁止串口中断
CLR RI ; 软件清除串口接收中断标志
NOP
Serial_RX_WAIT: ; 等待下一个字节数据的接收
JNB RI,Serial_RX_WAIT
MOV A,SBUF ; 将接收到的数据写入A
CALL DA_Operation ; 模拟输出
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 + -