找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5639|回复: 2
收起左侧

51单片机的SPI通信程序

[复制链接]
ID:531122 发表于 2019-12-9 17:30 | 显示全部楼层 |阅读模式
原理图如下

protues接线图

protues接线图


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

单片机源程序如下:
#include <reg52.h>//头文件
#include <intrins.h>//头文件

#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 <reg52.h>//头文件
# include <intrins.h>//头文件

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

全部代码51hei下载地址,仿真工程不小心删了,大家自己画一下吧:
spi.zip (45.12 KB, 下载次数: 119)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:292427 发表于 2020-1-19 22:06 | 显示全部楼层
这是SPI的哪种模式
回复

使用道具 举报

ID:656698 发表于 2020-1-22 16:51 | 显示全部楼层
一直没明白spi是什么,这个教程应该能帮我认识一下,谢谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表