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

📄 ex8-6c.c

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