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

📄 up51s011.c

📁 X5045读写演示程序 先用字节写入: 写入11H到地址55H (字节写入) 读取55H
💻 C
字号:
/*******************************************************************************
*                                                                              *
*    File       : uP51s011.C                                                   *
*    Date       : 2004-9-5                                                     *
*    Version    : 1.0                                                          *
*                                                                              *
*    Author     : kevin           kevin@dz51.com                               *
*    Company    : Http://www.dz51.com                                          *
*                                                                              *
********************************************************************************
*    Descriptoon:                                                              *
*                 X5045读写演示程序(J3短路2-3脚)                               *
*                                                                              *
*            程序运行首先把字节0x11H到x5045地址55H (字节写入),然后读出地址55H *
*    的数据送给P0口,可以看到P0口8个发光管对应的数据。                         *
*  (LD8---LD1分别对应0B00010001,0x11H)                                       *
*                                                                              *
*   然后进行页写入0X22H/0X33H/0X44H到X5045的地址0X1F0/1/2H,然后读出送P0口     *
*                                                                              *
* 注意:由于读写X5045的I/O口和编程芯片的I/O口是复用的,所以实验本程序的时候不  *
* 要读器件,否则只能下次上电程序读写X5045才能够正常!!!                      *

*******************************************************************************/
#include <reg51.h>
#include <intrins.h>


sbit	CS = P1^2;	
sbit	SCK = P1^3;	
sbit	SI = P1^4;	
sbit	SO = P1^5;	

#define	WREN_INST	0x06		// 写入使能指令(WREN)
#define	WRDI_INST	0x04		// 写入禁止指令(WRDI)
#define	WRSR_INST	0x01		// 写入状态寄存器指令(WRSR)
#define	RDSR_INST	0x05		// 读取状态寄存器指令(RDSR)
#define	WRITE_INST	0x02		// 写入存储器指令(WRITE)
#define	READ_INST	0x03		// 读取存储器指令(READ)
                        
#define	BYTE_ADDR	0x55		// 字节模式写入地址
#define	BYTE_DATA	0x11		// 字节模式写入数据

#define	PAGE_ADDR	0x1F0		// 页写入模式地址
#define	PAGE_DATA1	0x22		// 页模式写入第一个数据
#define	PAGE_DATA2	0x33		// 页模式写入第二个数据
#define	PAGE_DATA3	0x44		// 页模式写入第三个数据

#define	STATUS_REG	0x00		// 要写入到状态寄存器的值
	
#define	MAX_POLL	0x99		// 最在查询次数m	number	of	polls


void wren_cmd();	
void wrsr_cmd();	
void wren_cmd();
void wrdi_cmd();	
void byte_write();	
unsigned char byte_read();		
void page_write();	
unsigned char sequ_read();	
void rst_wdog();
void outbyt(unsigned char write_data);
unsigned char inbyt();
void wip_poll();	
void delay();

//********************************************************************************************
main()
{                  	  
  unsigned char temp=0;
	EA = 0;			// 
	SO = 1;
	SI = 1;
	SCK = 0;
	CS = 1;

	//------------
	wren_cmd();		// 使能写入
	wrsr_cmd();		// 写入00H到状态寄存器
	wren_cmd();		// 使能写入
	byte_write();	// 写入11H到地址55H (字节写入)
	temp=byte_read();// 读取地址55H处的数据(字节读取)
	P0=temp;
	delay(); //延时
	wren_cmd();		// 使能写入
	page_write();		// 页写入22H/33H/44H到地址1F0/1/2H
	temp=sequ_read();		// 连续读取地址1F0/1/2H
	P0=temp;
	delay();//延时
	rst_wdog();		// 清除看门狗
	wrdi_cmd();

    temp=0xa5;
	P0=temp;
	CS = 1;
	
 	while(1);
}
//********************************************************************************************
//* 写入使能指令
//* 传入参数: 无
//* 返回值: 无

void wren_cmd()
{
	SCK = 0;			
	CS = 0;           
	outbyt(WREN_INST);			// 传送写入使能指令
	SCK = 0;		
	CS = 1;		
}            		
	
//********************************************************************************************
//* 写入禁止指令
//* 传入参数: 无
//* 返回值: 无
void wrdi_cmd()
{
	SCK = 0;			
	CS = 0;			          
	outbyt(WRDI_INST);			// 传送写入禁止指令
	SCK = 0;		
	CS = 1;		
}
	
//********************************************************************************************
//* 写入数据到状态寄存器
//* 传入参数: 无
//* 返回值: 无

void wrsr_cmd()
{
	SCK = 0;			
	CS = 0;			
	outbyt(WRSR_INST);			// 传送状态寄存器写入指令
	outbyt(STATUS_REG);			// 传送要写入的数据
	SCK = 0;			
	CS = 1;			
	wip_poll();				// 检测写入进度
}

//********************************************************************************************
//* 读取状态寄存器
//* 传入参数: 无
//* 返回值: 状态寄存器值

unsigned char rdsr_cmd()
{
	unsigned char status;
	SCK = 0;			
	CS = 0;			  	
	outbyt(RDSR_INST);			// 传送状态寄存器读取指令
	status = inbyt();				// 读取状态寄存器
	SCK = 0;			
	CS = 1;	
	return status;		
}

//********************************************************************************************
//* 单一字节写入
//* 传入参数: 无
//* 返回值: 无

void byte_write()
{
	unsigned int addr;
	addr = BYTE_ADDR;		// 设置要写入的地址
	SCK = 0;			
	CS = 0;
	if(addr & 0x100)
	{
		outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
	}
	else
	{
		outbyt(WRITE_INST);	// 传送写入指令和地址最高位"0"
	}		 		  
	outbyt((unsigned char)addr);		// 传送地址低字节   	  
	outbyt(BYTE_DATA);		// 传送数据字节
	SCK = 0;			
	CS = 1;			
	wip_poll();			// 检测写入进度
}
	
//********************************************************************************************
//* 单一字节读取
//* 传入参数: 无
//* 返回值: 读取的字节

unsigned char byte_read()
{
	unsigned int addr; 
	unsigned char read_data;
	
	addr = BYTE_ADDR;		// 设置要读取的地址
	SCK = 0;			
	CS = 0;
	if(addr & 0x100)
	{
		outbyt(READ_INST | 0x08);// 传送读取指令和地址最高位"1"
	}
	else
	{
		outbyt(READ_INST);	// 传送读取指令和地址最高位"0"
	}		 		  
	outbyt((unsigned char)addr);		// 传送地址低字节 			
	read_data = inbyt();		// 读取字节
	SCK = 0;			
	CS = 1;			
	
	return read_data;
}

//********************************************************************************************
//* 页写入
//* 传入参数: 无
//* 返回值: 无

void page_write()
{
	unsigned int addr;
	addr = PAGE_ADDR;		// 设置要写入的地址
	SCK = 0;			
	CS = 0;
	if(addr & 0x100)
	{
		outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
	}
	else
	{
		outbyt(WRITE_INST);	// 传送写入指令和地址最高位"0"
	}		 		  
	outbyt((unsigned char)addr);		// 传送地址低字节   	             
	outbyt(PAGE_DATA1);		// 传送第一个字节数据             
	outbyt(PAGE_DATA2);		// 传送第二个字节数据          
	outbyt(PAGE_DATA3);		// 传送第三个字节数据
	SCK = 0;			
	CS = 1;			
	wip_poll();			// 检测写入进度
}
	
//********************************************************************************************
//* 连续读取3个字节
//* 传入参数: 无
//* 返回值: 最后一次读取的字节

unsigned char sequ_read()
{
	unsigned int addr; 
	unsigned char read_data;

	addr = PAGE_ADDR;		// 设置第一个字节的地址
	SCK = 0;			
	CS = 0;
	if(addr & 0x100)
	{
		outbyt(READ_INST | 0x08); //传送读取指令和地址最高位"1"
	}
	else
	{
		outbyt(READ_INST);	// 传送读取指令和地址最高位"0"
	}		 		  
	outbyt((unsigned char)addr);		// 传送地址低字节 			

	inbyt();			// 读取第一个字节
	inbyt();			// 读取第二个字节
	read_data = inbyt();		// 读取第三个字节
	
	SCK = 0;			
	CS = 1;	
	
	return read_data;		
}
	
//********************************************************************************************
//* 复位看门狗定时器
//* 传入参数: 无
//* 返回值: 无

void rst_wdog()
{
	CS = 0;
	_nop_();
	_nop_();	
	CS = 1;			
}
	
//********************************************************************************************
//* 写入进度查询 
//* 传入参数: 无
//* 返回值: 无

void wip_poll()
{
	unsigned char i;		// 设置最大的查询次数
	
	//// 如果WIP位为'1'并且未达到最大查询次数, 则继续查询
	//// 如果WIP位为'0', 则写入周期完成, 返回
	for(i = 0; i < MAX_POLL; i++)
	{
		if(rdsr_cmd() & 0x01)		// 读取状态寄存器
		{
			continue;
		}
		return;
	}
}


//********************************************************************************************
//* 传送字节数据到EEPROM, 高位在前
//* 传入参数: write_data --- 要传送的字节
//* 返回值: 无

void outbyt(unsigned char write_data)
{
	unsigned char i;
	for(i = 0; i < 8; i++)
	{
		SCK = 0;
		SI = (bit)(write_data & 0x80); //传送一个位到SI
		write_data <<= 1;
		SCK = 1;
	}
	SI = 0;
}
	
//********************************************************************************************
//* 从EEPROM接收数据, 高位在前
//* 传入参数: 无
//* 返回值: A --- 接收到的字节

unsigned char inbyt()
{
	
	unsigned char i;
	unsigned char read_data;
	for(i = 0; i < 8; i++)
	{
		SCK = 0;
		read_data <<= 1;
		SCK = 1;
		read_data |= (unsigned char)SO;
	}
	return read_data;
}//********************************************************************************************
void delay()
{
  unsigned int i,j;
  for(i=0;i<200;i++)
    for(j=0;j<1000;j++)
	  ;
}

⌨️ 快捷键说明

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