打印

STC单片机IO口模拟SPI程序的知道

[复制链接]
5654|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjping0815|  楼主 | 2013-6-25 17:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发送程序
#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 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=B0011_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 SendByte(uchar TXD_Data)
{
        uchar data i;
        SPI_CS=0;//片选线0
        SPI_Clock=1;//时钟置高
        for(i=0;i<8;i++)
        {
                delayNOP();
                SPI_Clock=0;//时钟置0
                if(TXD_Data&0x80)SPI_MOS0=1; // 若要发送的数据最高位为1则发送位1
                else             SPI_MOS0=0; // 否则传送位0
                delayNOP();
                SPI_Clock=1;//时钟置高
                TXD_Data=TXD_Data<<1;// 数据左移一位
        }
        SPI_CS=1;//片选线1
}

void main(void)
{
        Ini_mcs51();
        while(1)
        {
                TXD_Buffer[0]=0x55;
                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=P2^4;//主发/从接 数据线
sbit SPI_MOS1=P3^2;//从发/主接 数据线
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 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=B0011_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;
        //SPI_CS=0;//片选线0
        //SPI_Clock=1;//时钟置1
        for(i=0;i<8;i++)
        {
                if(!SPI_CS)
                {
                        delayNOP();
                        SPI_Clock=1;//时钟置1
                        if(RXT_data&0x01)SPI_MOS0=1;
                        else             SPI_MOS0=0;
                        delayNOP();
                        SPI_Clock=0;//时钟置0
                        RXT_data=RXT_data>>1;       
                }
        }
        SPI_CS=1;
        return RXT_data;
}
void main(void)
{
uchar data a;
        Ini_mcs51();
        while(1)
        {
                LED=0;
                a=ResdByte();
                P1=a;               
        }       
}
我是按着时序图写,可是我就不知道程序问题去在那里,
不管我改变TXD_Buffer[0]的直,接收P1口老是低电平,
希望高手多多指点
谢谢

相关帖子

沙发
xyz549040622| | 2013-6-26 00:17 | 只看该作者
                      else             SPI_MOS0=0;
                        delayNOP();
                        SPI_Clock=0;//时钟置0
                        RXT_data=RXT_data>>1;      
                }
else后面加括号,你后面那么多语句

使用特权

评论回复
板凳
znmcu| | 2013-6-26 08:01 | 只看该作者
很多人认为程序编译通过,功能就完成了

使用特权

评论回复
地板
airwill| | 2013-6-26 12:26 | 只看该作者
同意楼上,
殊不知, 调试和验证比写代码更重要!

使用特权

评论回复
5
3htech| | 2013-6-26 16:35 | 只看该作者
MK1628,算不上是SPI,也类似。最关键的是,你如果写对了,则显示出来。方便调试。

使用特权

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

本版积分规则

12

主题

44

帖子

0

粉丝