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

📄 x5045(2).c

📁 单片机应用系统(光盘内容)
💻 C
字号:
#include <reg51.h>
#define  uchar unsigned char
#define  WRSRb 0X01 		//写状态寄存器指令;
#define  WRITEb 0X02 		//写数据指令;
#define  READb 0X03 		//读数据指令;
#define  WRDIb 0X04 		//禁止写操作指令;
#define  RDSRb 0X05 		//读状态寄存器指令;
#define  WRENb 0X06 		//允许写操作指令;
#define  WAIT_TIM 200  		//等待时间常数;
sbit  SO     =P2^0;			//串行数据输出端
sbit  SI     =P2^1;			//串行数据输入端
sbit  SCK    =P2^2;			//串行时钟端
sbit  CS     =P2^3;			//片选端
void RstWDT();   			//复位看门狗
void  wren_cmd(void);   	//允许写操作指令函数;
void  wrdi_cmd(void);		//禁止写操作指令函数;
void  write(uchar dt);   	//写一个字节数据函数;
uchar  read(void);    		//读一个字节数据函数;
uchar  read_state(void);  	//读状态控制字函数;
void  write_state(uchar dt);//写状态控制字函数;
void  read_nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr);	//读n个字节数据函数;
void  write_nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr);	//写n个字节数据函数;
void  wait_end(uchar run_times);//等待函数;
//函数定义;
void RstWDT()				//复位看门狗
{
    CS=0;
    CS=1;
}

//在写数据到x5045前 写入允许写操作指令字;
void wren_cmd(void)			//向X5045写入允许写操作指令字;
{
	CS=1;					//
	SCK=0;					//
	CS=0;					//片选有效
	write(WRENb);			//写入允许写操作指令字
	CS=1;					//片选无效
	SCK=0;
}

void wrdi_cmd(void)		//向X5045写入禁止写操作指令字;
{
	CS=1;					//
	SCK=0;					//
	CS=0;					//片选有效
	write(WRDIb);			//写入禁止写操作指令字
	CS=1;					//片选无效
	SCK=0;
}

//make clk for send data
void write(uchar dt)		//向X5045写入一个字节数据
{	
	uchar i;
	for(i=0;i<8;i++)		//8位
	{  
		SCK=0; 
		SI=(bit)(dt&0x80);	//先发高位
		SCK=1;				//上升沿锁存
		dt=dt<<1;			//左移
	}
	SI=0;
}
 //make clk for receive data
uchar read(void)			//从X5045读一个字节数据;
{	
	uchar i;
	uchar dt=0;				//清0
	SO=1;
	for(i=0;i<8;i++)		//8位
	{
		SCK=1;          
		SCK=0;    
		dt=dt<<1;			//左移
		if(SO)dt++;			//数据线为1 则数据加1 为0不处理
	}
	return dt;
}
//5045状态寄存器读出程序
//X5045状态控制字:
//BIT: 7 6 5 4 3 2 1 0 
//     x   x   WD1 WD0 BL1 BL0 WEL WIP
//WIP:0---正在写操作;
//    1---写操作完成;
//WEL:0---写使能锁存器复位;
//    1---写使能锁存器置位;
//BL1 BL0:        
//   00--不保护;
//   01--保护:01H--180H--1FFH;
//   10--保护:100H--1FFH;
//   11--保护:000H--1FFH;
//WD1 WD0:        
//   00--1.4秒;
//   01--600毫秒;
//   10--200毫秒;
//   11--禁止看门狗;
//read state word from x5045;
uchar read_state(void)
{ //从X5045读状态控制字;
	uchar dt;
	wren_cmd();				//向X5045写入允许写操作指令字;
	CS=1;
	SCK=0;
	CS=0;
	write(RDSRb);			//写读状态寄存器指令
	dt=read();				//读状态寄存器
	SCK=0;
	CS=1;
	return dt;
}
//write state word to x5045 before do somthing; 
void write_state(uchar dt)	//向X5045写状态控制字;
{	
	wren_cmd();				//向X5045写入允许写操作指令字
	CS=1;
	SCK=0;
	CS=0;
	write(WRSRb);			//写读状态寄存器指令
	write(dt);				//写状态寄存器
	SCK=0;
	CS=1;
	wait_end(WAIT_TIM);
}
//read n uchars from x5045;
void read_nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//读n个字节数据函数;
/*bit bA8,//选择EPROM上半部分/下半部分
uchar adr_L,//从EPROM中什么地址开始读;
uchar n, //要读的字节数;
uchar *adr)//所读的数据从什么地址开始存放;*/
{ 	//从X5045读n个字节数据;
	uchar  i ;  
	CS=1;
	SCK=0;
	CS=0;
	write(bA8?READb|0x08:READb);//选择EPROM上半/下半部分
	write(adr_L);			//写EPROM中地址;
	for(i=0;i<n;i++)		//要读n个字节;
	{
		*adr=read();		//读数据
		adr++;				//地址调整
	}
	SCK=0;
	CS=1;
}
//write n uchars to x5045;//向X5045写n个字节数据;
void write_nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//写n个字节数据函数;
/*bit bA8,//选择EPROM上半部分/下半部分;
uchar adr_L,//从EPROM中什么地址开始写;
uchar n,//要写的字节数;
uchar *adr)//从什么地址开始取数据写;*/
{	
	uchar  i ;
	EA=0;
	wren_cmd();				//向X5045写入允许写操作指令字
	CS=1;
	SCK=0;
	CS=0;
	write(bA8?WRITEb|0x08:WRITEb);//选择EPROM上半/下半部分
	write(adr_L);			//写EPROM中地址;
	for(i=0;i<n;i++)		//要写n个字节;
	{
		write(*adr);		//写数据
		adr++;				//地址调整
	}
	SCK=0;
	CS=1;
	wait_end(WAIT_TIM);		//写等待时间
	EA=1;
}
// wait for be sure to complete 
void wait_end(uchar run_times)//等待向X5045写操作完成;
{	
	register uchar dt=0;
	while(run_times--)
	{
		dt=read_state();	//读状态
		if(dt&0x01==0)break;
	}
}

⌨️ 快捷键说明

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