|
目标是实现两个单片机之间使用SPI通信,两个单片机都连着上位机,目标是在串口助手上,上位机甲发送一个字符给上位机乙。
代码如下:
# include //头文件
# include //头文件
# define uchar unsigned char
# define uint unsigned int
sbit SCK = P1^0;//位定义时钟
sbit CS = P1^1;//位定义片选(使能)
sbit SDI = P1^2;//位定义Input
sbit SDO = P1^3;//位定义Output
uchar dat, dat0, dat1, b, flag;
/*-----函数声明-----*/
void delay5us(void);
void SpiInit();
void SpiSend(uchar dat1);
uchar SpiReceive();
void UARTInit();
void judge();
void receive1();
/*-----主函数-----*/
void main()
{
UARTInit();
while (1)
{
judge();//执行判断
}
}
/*-----5微秒延时函数-----*/
void delay5us(void)
{
_nop_();
}
/*-----SPI初始化函数-----*/
void SpiInit()
{
SCK = 0;
delay5us();
}
/*-----SPI发送函数-----*/
/*-----下降沿发送-----*/
void SpiSend(uchar dat1)
{
uchar i;
SCK = 1;//时序置低
delay5us();
for (i=8; i>0; i--)//8bit,一位一位写
{
SCK = 0;
if (dat1 & 0x80)//判断当前最高位为1还是0
{
SDO = 1;
}
else
{
SDO = 0;
}
delay5us();
SCK = 1;//产生时序下降沿,发送数据
delay5us();
dat1 <<= 1;
}
}
/*-----SPI接收函数-----*/
/*-----上升沿接收-----*/
uchar SpiReceive()
{
uchar i;
dat = 0x00;
SCK = 1;//时序置低
delay5us();
for (i=8; i>0; i--)//8bit,一位一位写
{
SCK = 0;
delay5us();
delay5us();
dat0 <<= 1;
dat0 |= (uchar)(SDI);
SCK = 1;//产生时序上升沿,接收数据
delay5us();
}
return dat0;//收到数据(返回值)dat0
}
/*-----串口(中断)初始化-----*/
void UARTInit()
{
EA = 1;//开启总中断
ES = 1;//打开串口中断
SM0 = 0;SM1 = 1;//串口工作方式1,8位UART波特率可变
REN = 1;//串口允许接收
TR1 = 1;//启动定时器1
TMOD |= 0X20;//定时器1,工作模式2 8位自动重装
TH1 =0XFD;
TL1 =0XFD;//设置波特率9600
}
/*-----串口中断服务函数-----*/
void UART() interrupt 4
{
if (RI)//判断是否接收完成
{
dat = SBUF;//读SUBF
flag = 1;//表明谁是主机
RI = 0;//软件清零
// REN = 0;
}
else
flag=2;
}
void judge()
{
SpiInit();
if(flag==1) //如果flag=1,那么就意味着是甲方单片机,获得的是一手数据
{ //执行的是发送数据给上位机--电脑以及发送数据给乙方单片机
SpiSend(dat);
}
if(flag==2) //如果flag!=1那么就意味着是乙方单片机,获得的是二手数据
{
SpiReceive();
receive1(); //执行的是接受数据,并且发送数据给上位机
}
}
void receive1() //乙机发送数据给上位机
{
b=SpiReceive();
ES=0;
SBUF=b;
while(!TI);
TI=0;
ES=1;
}
|
|