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

📄 x5043.c

📁 5043的通用C51程序,各个函数都经过测试,完全可用.
💻 C
字号:
/**************************************************************
X5043是上电复位,看门狗定时,电源电压监控,块锁保护的串行EEPROM
***************************************************************/
/************************调试通过******************************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define  CS  P10            /*x5043的片选*/
#define  SI  P11            /*x5043的串行输入*/ 
#define  SCK P12            /*x5043的时钟*/
#define  SO  P13            /*x5043的输出*/
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
 /******************************************************************************
向 x5043 发送命令 (8 bit) (初始:CS = 0), SCK上升沿锁存数据
******************************************************************************/
void sent_x5043(uchar n)
{
    uchar i; 
    for ( i=0x80; i>=0x01; i=i>>1 )
       {
       SCK = 0;
       _nop_();      /* SCK=0 */
       if ( ( n & i ) == 0 ) SI = 0; else SI = 1;    /* 置SI */
       SCK = 1;    /* SCK=1 */
       _nop_();
       }
}
/******************************************************************************
从 x5043 读出数据 (8 bit) (初始:CS = 0), SCK下降沿输出数据
******************************************************************************/
uchar get_x5043(void)
{
    uchar i,n;
    n=0x00;
    for ( i=0x80; i>=0x01; i=i>>1 )
       {
       SCK = 1;
       _nop_();
       SCK = 0;
       _nop_();
       if ( SO == 1 ) n = ( n | i );    
       }
   return( n );
}
/******************************************************************************
读 x5043 状态寄存器 (8 bit) 
******************************************************************************/
uchar rdsr_x5043(void)
{
    uchar n;
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
    CS=1;
    _nop_();  
    CS=0;
    sent_x5043( 0x05 );     /* RDSR => x5043 */
    n = get_x5043( );
    return( n );
}
/******************************************************************************
写 x5043 等待完成 
******************************************************************************/
void wrok_x5043(void)
{
    uchar i;
    for ( i=0; i<=99; i++ )
    {
       if ( ( rdsr_x5043() & 0x01 ) == 0x00 ) break;
    }
}
/******************************************************************************
初始化 x5043 
******************************************************************************/
void ini_x5043(uchar n)/*n为状态寄存器的值,初始化时要给予设定*/
{  
    if ( rdsr_x5043() != n )
      {
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x06 );   //写使能
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x01 );     /* WRSE => x5043 */
      sent_x5043( n );     /* n => x5043 看门狗定时, 块保护范围,  */
      wrok_x5043();
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
      }
} 
/******************************************************************************
从 x5043 读1个字节
uchar Cread_EEPROM( uint addr )
输入:    addr 地址范围 0x000-0x1FF [512B]
输出:    数据 (uchar,char)
******************************************************************************/
uchar Cread_EEPROM(uint addr)
{
    uchar n;
    n = 0x03;    /* 0000 (A8)011 READ */
    if ( ( addr & 0x0100 ) != 0 ) 
        n = ( n | 0x08 ); 
     CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止*/
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( n );         /* READ => x5043 */
    sent_x5043( (uchar)(addr) );    /* addr => x5043 */
    n = get_x5043( );         /* x5043 => n */
    return( n );
}
/******************************************************************************
向 x5043 写1个字节
void Cwrite_EEPROM( uint addr, uchar n )
输入:    addr 地址范围 0x000-0x1FF [512B]
    n 数据(uchar,char)
******************************************************************************/
void Cwrite_EEPROM( uint addr, uchar n )
{
    uchar i;
    if(Cread_EEPROM(addr)==n) 
        return;  
    i = 0x02;                               /* 0000 (A8)010 WRITE */
    if((addr & 0x0100 )!= 0)
       i=(i|0x08); 
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x06 );   
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( i );         /* WRITE => x5043 */
    sent_x5043( (uchar)(addr) );    /* addr => x5043 */
    sent_x5043( n );         /* n => x5043 */
    wrok_x5043();
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
}
void delay10ms1(uint count)
{
	uint j,k;
	while(count--!=0)
	{
            for(k=0;k<10;k++)
		for(j=0;j<75;j++) ;
		}
	}

⌨️ 快捷键说明

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