|
我是一個(gè)初入單片機(jī)的萌新,想嘗試軟件模擬SPI協(xié)議進(jìn)行51單片機(jī)之間的互相通信,但一直未能成功接收,嘗試過(guò)排除程序代碼、仿真搭建、串口設(shè)置之類的錯(cuò)誤,但依然未能解決,所以想來(lái)論壇上求助各位,希望能有大佬解答,非常感謝。
Snipaste_2021-04-05_23-33-27.png (165.81 KB, 下載次數(shù): 38)
下載附件
proteus仿真
2021-4-5 23:34 上傳
代碼如下:
/*********
想要實(shí)現(xiàn)的功能:通過(guò)串口助手A發(fā)送數(shù)據(jù)給單片機(jī)A,單片機(jī)A將該數(shù)據(jù)發(fā)送給單片機(jī)B,
單片機(jī)B在接收到數(shù)據(jù)后將其發(fā)送給串口助手B;反之亦然
*********/
#include<reg51.h>
#include<intrins.h>
sbit SCK=P2^5;
sbit SDI=P2^6;
sbit SDO=P2^7;
void Delay5us()
{
_nop_();
_nop_();
}
void SPI_write(unsigned char DATA0) //SPI發(fā)送
{
int i;
for(i=0;i<8;i++)
{
SCK=0;
if(DATA0&0x80)
{
SDO=1;
}
else
{
SDO=0;
}
SCK=1;
DATA0<<=1;
Delay5us();
}
}
unsigned char SPI_read() //SPI接收
{
unsigned char DATA1=0x00;
int i;
for(i=0;i<8;i++)
{
DATA1<<=1;
while(SCK==1);
while(SCK==0);
DATA1|=SDI;
}
return DATA1;
}
void UART_init() //串口初始化,波特率9600
{
PCON=0x80;
SCON=0x50;
TMOD=0x20;
TL1=0xfa;
TH1=0xfa;
TR1=1;
ES=1;
EA=1;
}
void UART() interrupt 4
{
if(RI==1)
{
RI=0;
SPI_write(SBUF);
}
while(TI==0);
TI=0;
}
void main()
{
UART_init();
while(1);
{
SBUF=SPI_read();
}
}
虛擬串口由VSPD生成兩對(duì):COM1和COM2 COM3和COM4
在proteus中,串口部件P1與COM2連通,串口部件P2與COM4聯(lián)通
兩個(gè)串口助手中,其中一個(gè)串口助手與COM1連通,另一個(gè)則與COM3連通
|
|