📄 master.asm
字号:
;----------------------------------
; 单片机与单片机通信实例(主机)
;功能:通过串口与从机与主机的通信,对从机1发出问询帧,然后接收从机1
; 的脉冲数,通过简单计算得出电压控制值,通过串口发给从机2
;-----------------------------------
ORG 0000H
JMP START ; 程序开始
ORG 000BH
JMP Timer0_ISR ; 定时器T0中断向量
START:
MOV SP,#60H ; 将堆栈位置设为60H
CALL Init ; 进行串口及相关寄存器的初始化
MOV 30H,#7FH ; 将30h设为7fh
MOV R3,#0H ; 将触发标志位清零
Init:
;---------------------------------
; 程序初始化,包括串口、定时器T1、中断的初始化
;---------------------------------
MOV SCON,#11010000B ; 串口控制寄存器初始化
ORL PCON,#10000000B ; 把SMOD位置1
SETB EA ; 中断允许总控制位使能
SETB ET0 ; 定时器T0中断使能
SETB PT0 ; 把定时器T0中断设为高优先级
CALL Timer0_Init ; 进行定时器T0的初始化
CALL Timer1_Init ; 进行定时器T1的初始化
RET
Timer0_Init:
;-------------------------
; T0作为定时器,T0溢出一次为一个控制周期
;-------------------------
ORL TMOD,#00000001B ; 定时器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
MainLoop:
CJNE R3,#0,MainLoop ; 等待中断触发
MOV R1,#01H ; R1中存放地址字节
MOV R2,#0FEH ; R2中存放命令字节
CALL Serial_TX ; 放送给从机1命令帧
NOP
CALL Serial_RX ; 等待接收从机1返回的脉冲数
MOV A,R1
SUBB A,#01H ; 脉冲数减256
JC UP_POWER ; 比256小则电压加大,反之则减小
DOWN_POWER:
MOV R0,#30H ; 30h中存储电压控制值
MOV A,@R0 ; 将电压控制值增加2
INC A
INC A
MOV @R0,A ; 将电压控制值写回缓存
JMP Send_Con
UP_POWER:
MOV R0,#30H
MOV A,@R0 ; 将电压控制值减小2
DEC A
DEC A
MOV @R0,A ; 将电压控制值写回缓存
Send_Con:
MOV R1,#02H ; R1地址字节
MOV R0,#30H ; 读取电压控制值
MOV A,@R0
MOV R2,A ; R2中存放电压控制值
CALL Serial_TX ; 放送从机2的命令帧
MOV R3,#0 ; 清除触发标志位
JMP MainLoop
Serial_TX:
;-----------------------
; 串口发送,采用查询的方式
;-----------------------
Serial_TX_LOOP1:
MOV A,R1
MOV SBUF,a ; 将一个字节写入串口缓存中
SETB C
MOV TB8,C ; 将发送的第9位置为1,此字节为地址
Serial_TX_WAIT1:
JNB TI,Serial_TX_WAIT1 ; 等待该字节数据发送完成
NOP
CLR TI ; 软件清除串口发送中断标志位
Serial_TX_LOOP2:
MOV A,R2
MOV SBUF,a ; 将一个字节写入串口缓存中
CLR C
MOV TB8,C ; 将发送的第9位置为0
Serial_TX_WAIT2:
JNB TI,Serial_TX_WAIT2 ; 等待该字节数据发送完成
NOP
CLR TI ; 软件清除串口发送中断标志位
RET
Serial_RX:
;-------------------
; 串口接收,采用查询RI位的方式
;-------------------
Serial_RX_WAIT1: ; 等待下一个字节数据的接收
JNB RI,Serial_RX_WAIT1
MOV A,SBUF ; 将接收到的数据写入A
MOV R1,A ; 将接收的数据写入接收数据缓存区
CLR RI ; 软件清除串口接收中断标志位
Serial_RX_WAIT2: ; 等待下一个字节数据的接收
JNB RI,Serial_RX_WAIT2
MOV A,SBUF ; 将接收到的数据写入A
MOV R2,A ; 将接收的数据写入接收数据缓存区
CLR RI
RET
Timer0_ISR:
PUSH PSW
INC R3 ; 设置标志位,表示定时器T0触发
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -