打印

51单片机IO口模拟SPI通讯的程序的指点

[复制链接]
8218|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjping0815|  楼主 | 2013-6-27 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主机发送程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>

sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P3^3;//从发/主接 数据线
sbit SPI_Clock=P3^4;//时钟线
sbit SPI_CS=P3^5;//片选线

uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);
void SendByte(uchar TXD_Data);
void Delay4us(void);

void Ini_mcs51(void)
{
        //P1ASF = B0000_0000;
    P1M1  =B0000_0000;
    P1M0  =B0000_0000;//                      1---模拟(ADC)工作状态。
    P1    =B1111_1111;//P1   8bit LED显示数据总线 与 键盘数据输入 端口。
                  
    P2M1=B0000_0000;
    P2M0=B0000_0000;
    P2  =B1111_1111;

    P3M1=B0000_0000;
    P3M0=B0000_0000;
    P3  =B1111_1111;
    //-------------
    EA  =0;
    IT0 =0;
    IT1 =0;
    PX0 =0;
    PX1 =0;
    PT0 =0;
    PT1 =0;
    PS  =0;
    TMOD = 0x11;
    TH0 = 0xec;TL0 = 0x78;
    TR0 = 1;
    TR1 = 0;
    ES = 0;
    ET0 = 1;
    ET1 = 0;
    ET2 = 0;
    EX0 = 0;
    EX1 = 0;
    EA = 0;
}//---------------------------------------------------

void Delay4us(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void SendByte(uchar TXD_Data)
{
        uchar data i;
        SPI_CS=1;//片选线0
        SPI_Clock=1;//时钟置高
        Delay4us();
        for(i=0;i<8;i++)
        {
                SPI_Clock=0;//时钟置0
                SPI_CS=0;//片选线0
                Delay4us();
                //Delay4us();
                if(TXD_Data&0x80)SPI_MOS0=1; // 若要发送的数据最高位为1则发送位1
                else             SPI_MOS0=0; // 否则传送位0
                SPI_Clock=1;//时钟置高
                Delay4us();                                                                                                                                                                                                       
                TXD_Data=TXD_Data<<1;// 数据左移一位
        }
        SPI_CS=1;//片选线1
}

void main(void)
{
        Ini_mcs51();
        while(1)
        {
                TXD_Buffer[0]=0xaa;
                SendByte(TXD_Buffer[0]);
        }
}
从机接收程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>

sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P2^4;//从发/主接 数据线
sbit SPI_Clock=P3^3;//时钟线
sbit SPI_CS=P3^4;//片选线
sbit LED=P3^7;//LED段选

//uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);
void SendByte(uchar TXD_Data);
/*
void Delay4us(void);

void Delay4us(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
} */
void Ini_mcs51(void)
{
        //P1ASF = B0000_0000;
    P1M1  =B0000_0000;
    P1M0  =B0000_0000;//                      1---模拟(ADC)工作状态。
    P1    =B1111_1111;//P1   8bit LED显示数据总线 与 键盘数据输入 端口。
                  
    P2M1=B0001_0000;
    P2M0=B0000_0000;
    P2  =B1111_1111;

    P3M1=B0000_0000;
    P3M0=B0000_0000;
    P3  =B1111_1111;
    //-------------
    EA  =0;
    IT0 =0;
    IT1 =0;
    PX0 =0;
    PX1 =0;
    PT0 =0;
    PT1 =0;
    PS  =0;
    TMOD = 0x11;
    TH0 = 0xec;TL0 = 0x78;
    TR0 = 1;
    TR1 = 0;
    ES = 0;
    ET0 = 1;
    ET1 = 0;
    ET2 = 0;
    EX0 = 0;
    EX1 = 0;
    EA = 0;
}//---------------------------------------------------
uchar ResdByte(void)
{
        uchar data i;
        uchar data RXT_data;
        uchar result=0;
        //SPI_CS=1;//片选线0
        //SPI_Clock=1;//时钟置1
        //SPI_MOS0=1;
        delayNOP();
        if((!SPI_CS)&&(!SPI_Clock))
        {
                for(i=0;i<8;i++)
                {
                        while(!SPI_Clock);
                        if(SPI_MOS0&0x01)result=1;
                        else             result=0;
                        _nop_();_nop_();
                        while(SPI_Clock);
                        RXT_data=result|(RXT_data>>1);       
                }
        }
        while(!SPI_CS);
        return RXT_data;
}
void main(void)
{
        P1=0xff;
        RXD_Buffer[0]=0xff;
        Ini_mcs51();
        while(1)
        {
                LED=0;
                RXD_Buffer[0]=ResdByte();
                P1=RXD_Buffer[0];               
        }       
}
我是按着SPI的时序图写的,
发送程序的IO口我用示波器测过是对的,
为什么接受不到数据啊,希望告诉知道啊
QQ879733025

相关帖子

沙发
ayb_ice| | 2013-6-27 14:52 | 只看该作者
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>

根本不用这样的

使用特权

评论回复
板凳
zjping0815|  楼主 | 2013-6-28 16:51 | 只看该作者
kimfufree 发表于 2013-6-28 15:42
怎么到处发贴呢?接收样版。之前的是从低位收起,这个从高位收起。

if(!SPI_CS)

大侠还是不行啊

使用特权

评论回复
地板
xiaox314| | 2013-6-28 17:14 | 只看该作者
RXT_data=result|(RXT_data>>1);        
改成
RXT_data=result|(RXT_data<<1);        
试下!!!

使用特权

评论回复
5
zjping0815|  楼主 | 2013-6-29 09:55 | 只看该作者
xiaox314 发表于 2013-6-28 17:14
RXT_data=result|(RXT_data>>1);        
改成
RXT_data=result|(RXT_data

我改过
也不行

使用特权

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

本版积分规则

12

主题

44

帖子

0

粉丝