单片机通过网卡和php通信,两个单片机之间使用SPI通信的存在的问题

//头文件

# 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值