📄 ex8-6a.asm
字号:
$INCLUDE (STC12C5A.inc) ;包含STC12C5A60S2单片机寄存器定义文件
;定义功能常量,用于控制汇编程序是主机程序还是从机程序
;MASTER EQU 1 ;汇编后的程序代码下载到主单片机中
MASTER EQU 0 ;汇编后的程序代码下载到从单片机中
;定义变量
Flags EQU 20H
SPI_Receive EQU Flags.0 ;SPI 端口收到数据标志位
SPI_buffer EQU 30H ;该变量用于保存 SPI 端口收到的数据
ORG 0000H
LJMP MAIN
ORG 004BH ;SPI中断服务程序入口
LJMP SPI_ISR
ORG 0060H
MAIN:
MOV SP, #70H ;设置堆栈指针
IF MASTER==1 ;从机不需要UART通信,不需要初始化
;初始化串口
MOV SCON, #50H ;0101,0000 8位可变波特率, 无奇偶校验
MOV TMOD, #21H ;定时器T1为自动重装模式
MOV TH1, #0F6H
MOV TL1, #0F6H
ORL AUXR,#01000000B ;T1以1T的速度计数,是普通8051的12倍
;即波特率 = 4800*12=57600
SETB TR1 ;启动定时器1
;初始化SPI
MOV SPCTL,#11111100B ;0FCH, 忽略 脚, 设为主机
;SSIG=1: 忽略 脚;SPEN=1:允许SPI工作
;DORD=1:先传送低位LSB;MSTR=1:设为主机
;CPOL=1:SPI空闲时SCLK=1,前跳变沿是下降沿,后跳变沿是上升沿
;CPHA=1:数据由SCLK前跳变沿驱动到SPI口线,SPI模块在后跳变沿采样
;SPR1,SPR0=00:主模式时SPI时钟源选择为fosc/4
ELSE
MOV SPCTL, #11101100B ;0ECH, 忽略 脚, 设为从机
;SSIG=1: 忽略 脚;SPEN=1:允许SPI工作
;DORD=1:先传送低位LSB;MSTR=0:设为从机
;CPOL=1:SPI空闲时SCLK=1,前跳变沿是下降沿,后跳变沿是上升沿
;CPHA=1:数据由SCLK前跳变沿驱动到SPI口线,SPI模块在后跳变沿采样
;SPR1,SPR0=00:主模式时SPI时钟源选择为fosc/4
ENDIF
MOV SPSTAT,#11000000B ;清0标志位SPIF和WCOL
ORL IE2, #00000010B ;ESPI(IE2.1)=1,允许SPIF产生中断
MOV Flags, #0 ;清标志字
SETB EA ;开总中断
;-----------------主循环--------------------------------
IF MASTER==1
Check_RS232:
JNB RI, Check_SPI ;判RS-232 串口中收到数据否
MOV A, SBUF ;读取RS-232串口中收到的数据送累加器A
CLR RI
;将累加器A中的数据发送到从机SPI
ANL IE2, #0FDH ;ESPI(IE2.1)=0,禁止SPIF产生中断
MOV SPDAT, A ;SPI 发送数据
SPI_Wait:
MOV A, SPSTAT ;等待 SPIF=1 即等待 SPI 发送完毕
ANL A, #80H
JZ SPI_Wait
ORL IE2, #00000010B ;ESPI(IE2.1)=1,允许SPIF产生中断
LJMP Check_RS232
Check_SPI:
JNB SPI_Receive, Check_RS232 ;判收到从SPI发回数据否
MOV A, SPI_buffer ;将从机SPI发回的数据送到累加器A
CLR SPI_Receive ;清0主单片机SPI端口收到数据标志位
;将接收到的数据从RS232串口发送到计算机
CLR TI ;清零串口发送中断标志
MOV SBUF, A
RS232_Wait:
JNB TI, RS232_Wait ;等待发送完毕
CLR TI ;清零串口发送中断标志
LJMP Check_RS232
ELSE
Check_SPI:
JNB SPI_Receive, Check_SPI ;判收是否收到主机SPI发来的数据
MOV A, SPI_buffer ;读取主单片机SPI端口发的数据
CLR SPI_Receive ;清0 从单片机SPI端口收到数据标志位
MOV SPDAT, A ;将收到数据送SPDAT, 准备下一次通讯时发回
LJMP Check_SPI
ENDIF
;----------------- SPI中断服务程序-----------------------------
SPI_ISR:
MOV SPSTAT, #11000000B ;清0 标志位SPIF和WCOL(注意:写1清零)
MOV A, SPDAT ;保存收到的数据
MOV SPI_buffer, A
SETB SPI_Receive ;设置SPI端口收到数据标志
RETI
;-----------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -