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

📄 ex8-6a.asm

📁 《增强型8051单片机实用开发技术》例程代码
💻 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 + -