打印

STC单片机SPI通讯

[复制链接]
2781|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjping0815|  楼主 | 2013-6-21 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
coody| | 2013-6-21 10:40 | 只看该作者
那就随便写

使用特权

评论回复
板凳
lixianghua0428| | 2013-6-21 11:07 | 只看该作者
百度搜一大片的

使用特权

评论回复
地板
NE5532| | 2013-6-21 11:21 | 只看该作者
楼主想干什么?这事情做过的上万人。

使用特权

评论回复
评论
crazy2012 2013-12-26 09:21 回复TA
不止吧 
5
zjping0815|  楼主 | 2013-6-22 11:40 | 只看该作者
lixianghua0428 发表于 2013-6-21 11:07
百度搜一大片的

我在百度上,那些质料只说一点,
大哥能不能给我发STC单片机IO口模拟SPI实例不,
谢谢

使用特权

评论回复
6
123654789| | 2013-6-22 12:19 | 只看该作者
zjping0815 发表于 2013-6-22 11:40
我在百度上,那些质料只说一点,
大哥能不能给我发STC单片机IO口模拟SPI实例不,
谢谢 ...

你去AVR版面查找我的帖子(关于74HC595)
https://bbs.21ic.com/forum.php?mod=viewthread&tid=452134&page=1#pid2787770

使用特权

评论回复
7
流水随春去远| | 2013-6-23 01:08 | 只看该作者
做这个干吗?

使用特权

评论回复
8
zjping0815|  楼主 | 2013-6-24 09:12 | 只看该作者
lixianghua0428 发表于 2013-6-21 11:07
百度搜一大片的

我在百度上看了,按着网上的思路,可是就是通讯不了啊
能不能提供实例不

使用特权

评论回复
9
jankhyaa123| | 2013-12-25 19:11 | 只看该作者

使用特权

评论回复
10
znmcu| | 2013-12-25 19:52 | 只看该作者
问问STC的硬件SPI怎么用还像话。IO模拟有啥可问?

使用特权

评论回复
11
cnhysc| | 2013-12-25 22:03 | 只看该作者
#include "spi.h"
#include "fun.h"

/*******************************************************
                                                                          
********************************************************/

unsigned char bdata dat;                                                                                                        //dat是可位寻址的变量

sbit dat7=dat^7;
sbit dat6=dat^6;
sbit dat5=dat^5;
sbit dat4=dat^4;
sbit dat3=dat^3;
sbit dat2=dat^2;
sbit dat1=dat^1;
sbit dat0=dat^0;                                                                                                                                        //取出dat的各个位

/******************************************************************
- 功能描述:IO模拟SPI,发送一个字节
- 隶属模块:SPI模块
- 函数属性:外部,供用户调用
- 参数说明:x:要发送的字节
- 返回说明:无返回
- 注:很多情况下,SPI是需要有较高的速度的,此函数中不使用任何循环
       结构,如for(;;) while等等,并且使用了位寻址就是为了提高速度
******************************************************************/
void SPI_WriteByte(unsigned char x)
{
        /*----这种使用循环与位运算的实现方式,速度要比直接用位寻址与顺序执行方式实现慢得多
        ----因为它把大部分的时间花在了循环因子的递增、比较与位运行上了
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
                SPI_SI=x&(0x80>>i);
                SPI_SCL=0;
                SPI_SCL=1;
        }
        ----------------------------------*/

        dat=x;                                                                                                                                                                        //将x的值赋给可位寻址的变量dat,以便取出各个位

        SPI_SI=dat7;                                                                                                                                                //取出第7个位,写到数据线上
        SPI_SCL=0;
        SPI_SCL=1;                                                                                                                                                        //时钟线产生上升沿,数据被写入
       
        SPI_SI=dat6;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat5;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat4;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat3;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat2;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat1;
        SPI_SCL=0;
        SPI_SCL=1;
       
        SPI_SI=dat0;
        SPI_SCL=0;
        SPI_SCL=1;
}

/******************************************************************
- 功能描述:IO模拟SPI,读取一个字节
- 隶属模块:SPI模块
- 函数属性:外部,供用户调用
- 参数说明:无
- 返回说明:读到的字节
- 注:很多情况下,SPI是需要有较高的速度的,此函数中不使用任何循环
       结构,如for(;;) while等等,并且使用了位寻址就是为了提高速度
******************************************************************/
unsigned char SPI_ReadByte()
{  
        SPI_SO=1;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat7=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat6=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat5=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat4=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat3=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat2=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat1=SPI_SO;
       
        SPI_SCL=1;
        delay(1);
        SPI_SCL=0;
        delay(1);
        dat0=SPI_SO;
       
        return dat;
}




#ifndef  _SPI_H_
#define  _SPI_H_

/*******************************************************
********************************************************/

#include "reg51.h"

sbit SPI_SCL=P1^5;                                                                                                                                //SPI同步时钟  输出
sbit SPI_SI =P3^5;                                                                                                                                //SPI同步数据  输出
sbit SPI_SO =P1^4;                                                                                                                                //SPI同步数据  输入

void SPI_WriteByte(unsigned char x);
unsigned char SPI_ReadByte();

#endif

使用特权

评论回复
12
cnhysc| | 2013-12-25 22:05 | 只看该作者
直接发代码有点乱,发两个附件吧。

spi.rar

1.16 KB

使用特权

评论回复
13
znmcu| | 2013-12-26 00:38 | 只看该作者
这好像是我的代码呀(^_^)Y

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

44

帖子

0

粉丝