📄 ex8-6c.c
字号:
#include "stc12c5a.h" //包含STC12C5A60S2寄存器定义文件
#define MASTER 1 //作为从机程序时,将该行注释掉
bit SPI_Receive; //SPI 端口收到数据标志位
unsigned char idata SPI_buffer _at_ 0x30; //保存SPI端口收到的数据
void main(void)
{
unsigned char tmpdata,SPI_status;
#ifdef MASTER
//初始化串口
SCON=0x50; //0101,0000 8位可变波特率, 无奇偶校验
TMOD=0x21; //定时器T1为自动重装模式
TH1=0xf6;
TL1=0xf6;
AUXR= AUXR|0x40; //T1以1T的速度计数
TR1=1; //启动定时器1
//初始化SPI
SPCTL=0xfc; //详细注释与汇编语言相同
#else
SPCTL=0xec; //详细注释与汇编语言相同
#endif
SPSTAT=0xc0; //清0标志位SPIF和WCOL
IE2=IE2|0x02; //ESPI(IE2.1)=1,允许SPIF产生中断
SPI_Receive=0; //清标志字
EA=1; //开总中断
while(1) //主循环
{
#ifdef MASTER
if(RI) //判RS-232 串口中收到数据否
{
tmpdata=SBUF; //读取RS-232串口中收到的数据
RI=0;
//将数据发送到从机SPI
IE2&=0xfd; // ESPI(IE2.1)=0,禁止SPIF产生中断
SPDAT=tmpdata; //SPI 发送数据
SPI_status=0;
while(SPI_status==0)
{
SPI_status=SPSTAT; //等待SPIF=1即等待SPI发送完毕
SPI_status=SPI_status&0x80;
}
IE2|=0x02; //ESPI(IE2.1)=1,允许SPIF产生中断
continue;
}
if (SPI_Receive) //判收到从SPI发回数据否
{
SPI_Receive=0; //清0主单片机SPI端口收到数据标志位
TI=0; //清零串口发送中断标志
SBUF=SPI_buffer; //将接收到的数据从RS232串口发送到计算机
while(TI==0); //等待发送完毕
TI=0; //清零串口发送中断标志
}
#else
if (SPI_Receive) //判收是否收到主机SPI发来的数据
{
SPI_Receive=0; //清0主单片机SPI端口收到数据标志位
SPDAT=SPI_buffer; //将收到数据送SPDAT,准备下一次通讯时发回
}
#endif
}
}
void SPI_ISR(void) interrupt 9
{
SPSTAT=0xc0; //清0标志位SPIF和WCOL
SPI_buffer=SPDAT; //保存收到的数据
SPI_Receive=1; //设置SPI端口收到数据标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -