×
单片机 > 单片机程序设计 > 详情

Proteus仿真51单片机的SPI通信程序

发布时间:2020-12-31 发布时间:
|

仿真原理图如下
 

实验现象 会有数码管1到8的显示   从机跟随主机

单片机源程序如下:
#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

/*-----函数声明-----*/
void delay5us();
void delay();
void SpiSend(uchar dat1);
uchar SpiReceive();


/*-----主函数(主机)-----*//
void main()
{        
                unsigned char i; 
                P2 = 8;
    while(1)
    {
                        for(i = 0; i<10 ;i++)
                        {
                                        P2 = i;
                                        SpiSend(i);
                                        delay();
                        }

    }
        ;//空语句        
}

/*-----5微秒延时函数-----*/
void delay5us()
{
        _nop_();
}

/*-----延时函数-----*/
void delay()
{
        uchar i=1000,j=1000;
        while(i--)
        while(j--);

}


/*-----CPHA=0;CPOL=1 模式2-----*/
/*-----SPI发送函数-----*/
/*-----上升沿发送-----*/
void SpiSend(uchar dat1)
{
        uchar i;
        for (i=0; i<8; ++i)//8bit,一位一位写
        {
                SCK = 0;
                if (dat1 & 0x80)//判断当前最高位为1还是0
                {
                        SDO = 1;                
                }
                else
                {
                        SDO = 0;
                }
                SCK = 1;//上升沿发送数据
                dat1 <<= 1;
                delay5us();                
        }
}

/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar SpiReceive()
{
        uchar i, dat0;
        dat0 = 0x00;//dat0初始化 
        for (i=0; i<8; ++i)//8bit,一位一位读
        {
                dat0<<=1;
        while(SCK == 1);    
        while(SCK == 0);//下降沿读取数据       
        dat0 |= SDI;         
        }
        return (dat0);//收到数据(返回值)dat0
}




# 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

/*-----函数声明-----*/
void delay5us();
void SpiSend(uchar dat1);
uchar SpiReceive();

/*-----主函数(从机)-----*/
void main()
{        
        //UARTInit();
         while(1)
    {
                P2 = SpiReceive();// 循环接收数据
    }
        ;//空语句        
}

/*-----5微秒延时函数-----*/
void delay5us()
{
        _nop_();
}

/*-----CPHA=0;CPOL=1 模式2-----*/
/*-----SPI发送函数-----*/
/*-----上升沿发送-----*/
void SpiSend(uchar dat1)
{
        uchar i;
        for (i=0; i<8; ++i)//8bit,一位一位写
        {
                SCK = 0;
                if (dat1 & 0x80)//判断当前最高位为1还是0
                {
                        SDO = 1;                
                }
                else
                {
                        SDO = 0;
                }
                SCK = 1;//上升沿发送数据
                dat1 <<= 1;
                delay5us();                
        }
}

/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar SpiReceive()
{
        uchar i, dat0;
        dat0 = 0x00;//dat0初始化 
        for (i=0; i<8; ++i)//8bit,一位一位读
        {
                dat0<<=1;
        while(SCK == 1);    
        while(SCK == 0);//下降沿读取数据       
        dat0 |= SDI;         
        }
        return (dat0);//收到数据(返回值)dat0
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2