⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c8051f320spi_io.c

📁 用51单片机的通用IO口模拟一个SPI接口
💻 C
字号:
/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////
#include "c8051f320.h"

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

//////////////////////////
//#define      set_sck  (P0 |=1<<0)
//#define      clr_sck  (P0 &=~(1<<0))
sbit p0_0=P0^0;
sbit p0_4=P0^4;
sbit p0_1=P0^1;
/*
#define      set_csn    (p1 |=1<<0)
#define      set_sck    (p1 |=1<<1)
#define      set_mosi    (p1 |=1<<2)
#define      set_miso    (p1 |=1<<3)
#define      clr_csn    (p1 &=~(1<<0))
#define      clr_sck    (p1 &=~(1<<1))
#define      clr_mosi    (p1 &=~(1<<2))
#define      clr_miso    (p1 &=~(1<<3))
*/

//////////////////////////


sbit CSW=P0^6;     //P0^6 select slave SPI for WRITE  
        //NSSMD0 select slave SPI for READ 
sbit LED=P1^6;
char k;
int temp_result[4];
// Peripheral specific initialization functions,
// Called from the Init_Device() function
/*void Reset_Sources_Init()
{
    int i = 0;
    VDM0CN    = 0x80;
    for (i = 0; i < 350; i++);  // Wait 100us for initialization
    RSTSRC    = 0x04;
}*/
/*
void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}
*/

void pca_init(void)
{    
	PCA0MD=0x89;   //PCA采用系统时钟,且PCA溢出中断开启
	PCA0CN=0x40;   //启动PCA计数器
	EIE1|=0x10;    //PCA中断使能
    PCA0CPM0=0x46; //频率输出模式
}
void cex0_fre_set(unsigned char time)   //频率输出为:PCA时钟频率/(2*time)
{
   PCA0CPH0=time;
}


void SPI_Init()
{
    SPI0CFG   = 0x18;//18;//0x40;//0x00;//0x40;  //master mode
    SPI0CN    = 05;//0x0D;  //CS OFF,enable SPI
    SPI0CKR   = 0xFF;  //95730Hz
}

void Port_IO_Init()
{
    // P0.0  -  SCK  (SPI0), Open-Drain,  Digital
    // P0.1  -  MISO (SPI0), Open-Drain, Digital
    // P0.4  -  MOSI (SPI0), Open-Drain,  Digital
    // P0.5  -  NSS  (SPI0), Push-Pull,  Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Push-Pull, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital
    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Push-Pull,  Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital
/*    P0MDOUT   = 0x49;//0x20;
    P1MDIN    = 0xFF;
	P1MDOUT   = 0xFF;
		
//	P0SKIP    = 0x0C;
    XBR0      = 0x02;//允许SPI
    XBR1      = 0x40;
*/
   // XBR0=0x02;              //不允许SMBus、UART,允许SPI
    XBR0=0x00;
	XBR1=0x41;              //允许交叉开关和弱上拉,CEX0连接到端口引脚
//	P0MDOUT = 0xC3;//0xC2;
    P0MDOUT = 0x00;
//	P0MDIN=0x11;

    P0SKIP=0x7F;//0x4C;//0x7F;            //配置交叉开关跳过P0.2 P0.3(晶振) P0.0 P0.1(运放)
	                        //将P0.7作为时钟输出

    P1MDIN=0xFF;
	P1MDOUT=0xFF;
	P2MDIN=0xFE;            //将P2.0配置为模拟输入
	P2SKIP=0x01;            //交叉开关跳过P2.0



}
void sysclk_init(void)
{
//    unsigned char n;
	PCA0MD=0x89;    //禁止看门狗定时器,PCA采用系统时钟,允许中断
/*	    
    OSCXCN=0x67;    //启动外部振荡器
   
	for(;n<255;n++);
	while((OSCXCN & XTLVLD_BIT)==0)   //等待外部振荡器起动
	{}
    CLKSEL=0x01;                      //选择外部振荡器作为系统时钟,可在此设置USB时钟源                                                                                                                                                                                                                	CLKSEL=0x01;                      //选择外部振荡器作为系统时钟,可在此设置USB时钟
	OSCICN=0x00;                      //禁止内部振荡器
*/
//使用内部振荡器
    //CLKSEL = 0x70;                     //USB时钟保留
	OSCXCN = 0x00;
	OSCICN = 0x83;                     //内部振荡器不分频 内部12MHz

}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
	sysclk_init();
//    PCA_Init();
//    Reset_Sources_Init();
//    SPI_Init();
    Port_IO_Init();
	pca_init();
	cex0_fre_set(5);
}
/*
void delay(uint t)
{
  uint k;
  for(k=0;k!=t;k++);
//  NOP();
}
*/
void delay(unsigned int time)  //
{

	while(time--)
	{}

}

void delay_ms(unsigned int i)
{while(i--)
delay(1000);
}


void SEND8(uchar data8)     //send 8 bits data
{
 delay(20);   //waiting > 2us
 SPIF=0;
 SPI0DAT=data8;
 SPIF=1;
 while(SPIF==0);
 delay(20);
}

void WEN8(void)    //write enable
{
 SEND8(0x02);
 SEND8(0x60);
}

void WDS8(void)    //write disable
{
 SEND8(0x02);
 SEND8(0x00);
}
/*
void WRITE8(uchar addr8,uchar data8)  //write data 
{
 uchar k=0;
 k=0x80 | addr8;
 SEND8(0x02);
 SEND8(k);
 SEND8(data8);
}
*/
uchar READ8(uchar addr8)        //read data
{
 //uchar k[5]=0;
 uchar result[5]=0;
 uchar k=0;
 uchar i;
 delay(40);
 //SEND8(0x03);
 SEND8(addr8);
 
 //SEND8(0x01);
 //for (i=0;i<=4;i++)
 //	{k[i]=SPI0DAT;}
 for(i=0;i<=4;i++)
 {result[i]=SPI0DAT;}
 k=SPI0DAT;
//RXOVRN=0;
 return(k);
}

void WRALL8(uchar data8)     //write all
{
 SEND8(0x02);
 SEND8(0x20);
 SEND8(data8);
} 
   
void CSWON(void)       //CS ON
{
 CSW=1;
 delay(20);
}

void CSWOFF(void)       //CS OFF
{
 CSW=0;
 delay(20);
}
void CSRON(void)       //CS ON
{
 NSSMD0=1;
 delay(20);
}
void CSROFF(void)       //CS OFF
{
 NSSMD0=0;
 delay(20);
}
/*
void ERAL8(void)       //Erase all
{
 SEND8(0x02);
 SEND8(0x40);
}
*/
/*
void main(void)
{
	unsigned int i;
	uchar str;

//	static uchar result=0;
	static ulong result=0;
//	bit aa;
	Init_Device();
    p0_1=1;	

	p0_0=1;

	delay_ms(1000);
	p0_1=0;
	for(i=0;i<8;i++)
 	{
		
 	//	clr_sck;
		p0_0=0;
		delay(260);
        str=p0_4;
//
	//	delay_ms(1);
	//	set_sck;
		p0_0=1;
		delay(260);
	//	delay_ms(1);
		result = result+ (str<<(7-i));
	 //	str=str<<1;

	 }
//	 p0_1=1;
//	 delay_ms(500);
//	 while(1);

}
*/

void main(void)
{
	uchar i;
	uchar str;
//	unsigned char str1;
//	static uchar result=0;
//    static uchar result=0;
unsigned char  MSB=0;
static uchar LSB=0;
static uchar SUM=0;
static uchar CR=0;
static uchar ITEM=0;
	bit stop;
	Init_Device();
	//for(i=0;i<8;i++)
	stop=0;
    p0_1=0;	

	p0_0=1;

	delay_ms(1000);
	p0_1=0;


	while(!stop)
	{

		for(i=0;i<=7;i++)
		{
			//p0_0=1;
			if(p0_0==0)
			//delay(260);
			str=p0_4;		

			//p0_0=0;
			if(p0_0==1)


			//delay(260);

			ITEM = ITEM + (str<<(7-i));				
		}
//	    MSB=result>>24;
		
		if(ITEM==0x4C)
		{
			//ITEM=result;
				//
			for(i=0;i<=7;i++)
			{
				//p0_0=1;
				if(p0_0==0)
				//delay(300);

				str=p0_4;
				//p0_0=0;
				if(p0_0==1)

				//delay(300);
				MSB = MSB + (str<<(7-i));	
			}
			//
		for(i=0;i<=7;i++)
		{
			//p0_0=1;
			if(p0_0==0)
			//delay(260);
			str=p0_4;		

			//p0_0=0;
			if(p0_0==1)


			//delay(260);

			LSB = LSB + (str<<(7-i));				
		}

		for(i=0;i<=7;i++)
		{
			//p0_0=1;
			if(p0_0==0)
			//delay(260);
			str=p0_4;		

			//p0_0=0;
			if(p0_0==1)


			//delay(260);

			SUM = SUM + (str<<(7-i));				
		}
		for(i=0;i<=7;i++)
		{
			//p0_0=1;
			if(p0_0==0)
			//delay(260);
			str=p0_4;		

			//p0_0=0;
			if(p0_0==1)


			//delay(260);

			CR = CR + (str<<(7-i));				
		}
			//	
				
		}
		if(ITEM==0x4C && CR==0x0D && ((ITEM+MSB+LSB)&0xff)==(SUM&0xff))
		stop=0;
		
		
	}
}


	//
		/*	for(i=0;i<=7;i++)
			{
				p0_0=1;
				delay(260);
				str=p0_4;

				p0_0=0;
				delay(260);
				MSB = MSB + (str<<(7-i));	
			}
			//
						//
			for(i=0;i<=7;i++)
			{
				p0_0=1;
				delay(260);
				str=p0_4;

				p0_0=0;
				delay(260);
				LSB = LSB + (str<<(7-i));	
			}
			//*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -