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

📄 main9356a.c

📁 中颖单片机SH88F516例程
💻 C
字号:
/*************************************************************************************************
说明;SPI使用EEPROM存储芯片93C56A,256X8bit=2K的存储空间.在使用SPI通讯时通常使用端口进行仿真,为了符合
使用需要,本程序同样使用了端口进行仿真,当然也可以直接使用88F516自带的SPI总线进行通讯.
串口1用于观测93C56A的读写数据正确与否?写入成功接收到数据R,写入失败接收到数据E,读取成功接收到数据r,
读取失败接收到数据e.
要求:打开拨码开关J6的5,6,7,8,打开拨码开关J4
*************************************************************************************************/

#include <sh88f516.h>
#include <INTRINS.H>	//for use 51 instruction

sbit cs_93=P1^4;
sbit di_93=P1^5;
sbit do_93=P1^6;
sbit sk_93=P1^7;

void UART1SendChar(unsigned char value)
{
	IEN1 &= 0xFB;               //ES1=0;		
	SBUF1=value;			    //写SBUF1,激活发送
	while(TI1==0);  			//等待转换结束
	TI1=0;						//清除发送标志位
	IEN1 = 0x04;                //ES1=1;		
}


/*-----------------------------------------------------
SPI93cXX系列函数调用
void high56(void)--------发送1
void low56(void) --------发送0
void wd56(unsigned char dd)	--------写8位数据,输入参数address or data
unsigned char rd56(void) --------读8位数据,返回值data
-----------------------------------------------------*/
void high56(void)
{ 
	di_93=1; 
	sk_93=1; _nop_(); 
	sk_93=0; _nop_();
}
void low56(void)
{ 
	di_93=0; 
	sk_93=1;_nop_();
	sk_93=0;_nop_();
}
void wd56(unsigned char dd)
{ 
	unsigned char i; 
	for (i=0;i<8;i++) 
	{ 
		if (dd>=0x80) high56(); 
		else low56(); 
		dd=dd<<1; 
	}
}
unsigned char rd56(void)
{ 
	unsigned char i,dd=0; 
	do_93=1; 
	for (i=0;i<8;i++) 
	{ 
		dd<<=1; 
		sk_93=1;_nop_();
		sk_93=0;_nop_(); 
		if (do_93) dd|=1; 
	} 
	return(dd);
}

/*-----------------------------------------------------
SPI93c56系列函数调用
void ewen56(void)-----------写使能
unsigned char read93c56_word(unsigned char address) ------------SPI读函数,输入参数为address,返回dat
bit write93c56_word(unsigned char address,unsigned char dat)----SPI写函数,输入参数为address,dat,写入成功返回0,失败返回1
-----------------------------------------------------*/ 
void ewen56(void)
{ 
	_nop_();
	cs_93=1;
	high56();
	low56();
	low56();
	wd56(0xc0);
	cs_93=0;
}

unsigned char read93c56_word(unsigned char address) 
{
	unsigned char dat;
	cs_93=sk_93=0;
	cs_93=1;

	high56();			//1 --start
	high56();			//1	
	low56();			//0	--10 read
	low56();			//X	--A8,
	wd56(address);		//A7--A0 
	dat=rd56();			//data

	cs_93=0;
	return(dat);
}

bit write93c56_word(unsigned char address,unsigned char dat)
{
	unsigned char e;
	unsigned char temp=address;
	e=0; 
	while (e<3) 
	{
		cs_93=sk_93=0;
		cs_93=1;
		ewen56();
		_nop_();
		cs_93=1;
		_nop_();

		high56();		  //1 --start
		low56();		  //0	
		high56();		  //1	--01 write
		low56();		  //X	--A8,
		wd56(address);	  //A7--A0 
		wd56(dat);		  //data

		cs_93=0;
		_nop_();
		cs_93=1;

		do_93=1;
		while (1) 
		{
			if (do_93==1) break;
		}
		cs_93=0;
		if (read93c56_word(temp)==dat) 
		{
			return(0);
		}
		e++;
	}
	return(1);
}



main()
{
    unsigned char i;

	CLKCON = 0x60;		   //f=osc/12

	SCON1 = 0x50; 		   //工作方式选择,此处为工作方式1
	SBRT1 = 0xFF;		   //波特率设置.工作在方式1时,BAUDRATE=(1/16)*Fsys/(32768-SBRT[1:0])   Fsys=16M
	SBRT0 = 0xF7;		   //Fsys=16M/12

	IEN1 = 0x04;			
	EA = 1;  

	for(i=0;i<200;i++)
	{
		if(write93c56_word(i,i)==0)
			UART1SendChar('R');
		else
			UART1SendChar('E');
	}
					
    while(1) 
	{

		for(i=0;i<200;i++)
		{
			if(read93c56_word(i)==i)
				UART1SendChar('r');
			else
				UART1SendChar('e');
		}
	}

}

⌨️ 快捷键说明

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