X5045是一種集看門狗、電壓監(jiān)控和串行EEPROM 三種功能于一身的可編程控制電路.特別適合應(yīng)用在需要少量存儲器,并對電路板空間需求較高場合,
X5045具有電壓監(jiān)控功能,可以保護系統(tǒng)免受低電壓的影響,當電源電壓降到允許范圍(4.2V)以下時,系統(tǒng)將復(fù)位,直到電源電壓返回到穩(wěn)定值為止。X5045的存儲器與CPU 通過串行通信方式接口(SPI),可以存放512個字節(jié)數(shù)據(jù).可擦寫100萬次,數(shù)據(jù)可保存100年.
下圖是X5045與具有手動復(fù)位的8051微控制器的連接
	
	 
	
注意:圖上的芯片寫著是X5043,實際上這是X5045的接法
下邊是51讀寫x5045存儲器的程序
	//x5045和51的連接方法
	sbit CS = P1^0;
	sbit SO = P1^3;
	sbit SI = P1^1;
	sbit SCK = P1^2;
	//定義寄存器指令
	#define WREN 0x06 // 寫入使能指令(WREN)
	#define WRDI 0x04 // 寫入禁止指令(WRDI)
	#define WRSR 0x01 // 寫入狀態(tài)寄存器指令(WRSR)
	#define RDSR 0x05 // 讀取狀態(tài)寄存器指令(RDSR)
	#define WRITE 0x02 // 寫入存儲器指令(WRITE)
	#define READ 0x03 // 讀取存儲器指令(READ)
	                      
	#define STATUS_REG 0x00 // 要寫入到狀態(tài)寄存器的值
	#define MAX_POLL 0x99 // 最在查詢次數(shù)m number of
	
	void outbyte(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;
	}
	unsigned char inbyte()
	{
	      unsigned char i;
	      unsigned char read_data=0;
	for(i = 0; i < 8; i++)
	      {
	         SCK = 0;
	         read_data <<= 1;
	         SCK = 1;
	         read_data |= (unsigned char)SO;
	      }
	      return read_data;
	}
	void wren_cmd()
	{
	
	      CS = 0;          
	      outbyt(WREN); // 傳送寫入使能指令
	      CS = 1;
	}            
	void wrdi_cmd()
	{
	     CS = 0;          
	     outbyt(WRDI); // 傳送寫入禁止指令
	     CS = 1;
	}
	unsigned char rdsr_cmd()
	{
	       unsigned char status;
	       CS = 0;   
	       outbyt(RDSR); // 傳送狀態(tài)寄存器讀取指令
	       status = inbyt(); // 讀取狀態(tài)寄存
	       CS = 1;
	       return status;
	}
	void wip_poll()
	{
	   unsigned char i; // 設(shè)置最大的查詢次數(shù)
	//// 如果WIP位為'1'并且未達到最大查詢次數(shù), 則繼續(xù)查詢
	//// 如果WIP位為'0', 則寫入周期完成, 返回
	   for(i = 0; i < MAX_POLL; i++)
	   {
	      if(rdsr_cmd() & 0x01) // 讀取狀態(tài)寄存器
	      {
	        continue;
	      }
	      return;
	    }
	}
	void wrsr_cmd()
	{
	      CS = 0;
	      outbyt(WRSR); // 傳送狀態(tài)寄存器寫入指令
	      outbyt(STATUS_REG); // 傳送要寫入的數(shù)據(jù)
	      CS = 1;
	     wip_poll(); // 檢測寫入進度
	}
	void byte_write(unsigned int addr,unsigned char dat)
	{
	      wren_cmd();
	     CS = 0;
	      if(addr & 0x100)
	          outbyt(WRITE | 0x08); //傳送寫入指令和地址最高位"1"
	      else
	           outbyt(WRITE); // 傳送寫入指令和地址最高位"0"
	     outbyt(addr); // 傳送地址低字節(jié)     
	      outbyt(dat); // 傳送數(shù)據(jù)字節(jié)  
	CS = 1;
	       wip_poll(); // 檢測寫入進度
	}
	unsigned char byte_read(unsigned int addr)
	{
	       unsigned char read_data;
	        CS = 0;  
	       if(addr & 0x100)
	            outbyt(READ | 0x08);// 傳送讀取指令和地址最高位"1"
	        else    
	          outbyt(READ); // 傳送讀取指令和地址最高位"0"
	       
outbyt(addr); // 傳送地址低字節(jié)
	read_data = inbyt(); // 讀取字節(jié)
	       CS = 1;
	        return read_data;
	}
	void rst_wdog()
	{
	    CS = 0;
	    _nop_();_nop_();
	    CS = 1;
	}
	void init_serialcomm(void)
	{   TMOD = 0x21;   // 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
	          // 定時器0工作于16位模式, 用于定時
	TH1 = 0xFD;    // 波特率9600
	      TL1 = 0xFD;
	       SCON = 0x50;   // 設(shè)定串行口工作方式
	       PCON &= 0xef;   // 波特率不倍增
	       TR1 = 1;    // 啟動定時器1
	}
	void send_char_com(unsigned char ch)
	{ //向串口發(fā)送一個字符
	   SBUF=ch;
	   while(!TI);
	   TI=0;
	}
	void main(void)
	{
	         unsigned char Temp,tdat;                  
	init_serialcomm();
	       while(1)
	      {
	           //這里演示讀出和寫入 EEPROM   
	   for (Temp=0; Temp<250; Temp++)   byte_write(Temp,Temp);
	         delay(200);
for (Temp=0; Temp<250; Temp++)
{ tdat= byte_read(Temp); send_char_com(tdat);}
}

