用51单片机软件模拟SPI串行通信(仿真通过)

/*====================================================================================
文件描述:由于51单片机内部没有SPI总线通信资源,所以使用51单片机模拟SPI通信时序来实现  SPI通信功能在该文

              件中定义了时钟线、数据输入、输出,及片选线。
修改日期:2012-4-2
作   者:田进军
联系方式:QQ:980306051,欢迎有这方面的爱好者联系交流
   共同学习,一起进步。
版权申明:该代码可能由你任意修改,不涉及侵权。
===================================================================================*/
#ifndef _SPI_H_
#define _SPI_H_

#define uchar unsigned char
#define uint  unsigned int

sbit SPI_SCK = P3^2;
sbit SPI_SI = P3^3;
sbit SPI_SO = P3^4;
sbit SPI_CS = P3^5;


void Data_Send(uint Sdata); //数据传送函数,方便调用
uint Data_Rece(void);  //数据接收函数,方便调用
void Write_Enable(void); //写使能函数
void Write_Disable(void); //写禁止函数
void Byte_Write(uchar Addr,uint Wdata); //字节写函数
void Page_Write(uchar Addr,uint *s); //页写函数
uint Byte_Read(uchar Addr);    //读数据函数

uint read_data;

extern void main(void)
{
        lcd_init(); //LCD初始化
        SPI_CS = 0;
       _nop_();
        Write_Enable();//写使能函数
       _nop_();
       Byte_Write(0x00,0x80);//字节写函数
        _nop_() ;
       P0 = Byte_Read(0x00);//读数据函数
        lcd_display(read_data, 0);
       while(1);
}
   
extern  void Data_Send(uint Sdata)//数据传送函数,方便调用
{
 uint i;
 for(i=8; i>0; i--)
 {
  SPI_SCK = 0; //上升沿发送数据
  _nop_();
  if(Sdata&0x80)//判断高位是否为1
   SPI_SO = 1;
  else
   SPI_SO = 0;
  _nop_();
  SPI_SCK = 1;
  Sdata <<= 1;   
 }
}
extern uint Data_Rece(void)//数据接收函数,方便调用
{
 uint i;
 uint Temp_data;
 for(i=8; i>0; i--)
 {
  SPI_SCK = 1;//下降沿接收数据
  _nop_();
  if(SPI_SI)
   Temp_data |= 0x01;
  _nop_();
  SPI_SCK = 0;
  Temp_data <<= 1;
 }

 return Temp_data;
}

extern void Write_Enable(void)//写使能函数
{
 SPI_CS = 0;
 _nop_();
 Data_Send(0x06);//发送写使能指令//0000 01100
 _nop_();
 SPI_CS = 1;
}

extern void Write_Disable(void)//写禁止函数
{
 SPI_CS = 0;
 _nop_();
 Data_Send(0x04);//发送写禁指令
 _nop_();
 SPI_CS = 1;
}

extern void Byte_Write(uchar Addr,uint Wdata)//字节写函数
{
 SPI_CS = 0;
 _nop_();
 Data_Send(0x02);//发送写数据止指令
 Data_Send(Addr);
 Data_Send(Wdata);
 _nop_();
 SPI_CS = 1;
// lcd_display(Wdata, 1);
}

extern void Page_Write(uchar Addr,uchar *s)//页写函数
{
 SPI_CS = 0;
 _nop_();
 Data_Send(0x02);//发送写数据指令
 Data_Send(Addr);
 Data_Send(*s++);
 _nop_();
 SPI_CS = 1;
}

extern uint Byte_Read(uchar Addr)//读数据函数
{
 uint Rdata;
 SPI_CS = 0;
 _nop_();
 Data_Send(0x03);//发送读数据指令
 Data_Send(Addr);
 Rdata = Data_Rece();
 _nop_();
 SPI_CS = 1;
 
 return Rdata;
}

#endif

 

posted @ 2013-03-17 16:57  天涯海角路  阅读(1953)  评论(0)    收藏  举报