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

📄 x5045程序.c

📁 用c51语言编写,在Keil uVision2 上编译通过.值得参考.x5045是带有看门狗功能的EEPROM,
💻 C
字号:
X5045读写C51程序我以调试通过
/*****************X5045读写
***http://www.newmcu.com************************************/
#include <reg52.h>
#include <intrins.h>   //_nop_();
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
/*******************************************************************************
*********
此程序也原来自网友,我把其中页写,页读删掉,修改了几个涵数变为传入的,
以便写入数具时可以用变量
次程序在2051实验板以调试通过,再次谢谢
********************************************************************************
********/
sbit CS  = P3^0;//1 
sbit SO  = P3^1;//2
sbit SI  = P3^2;//3 
sbit SCK = P3^3;//4 
sbit    led = P3^4; 
sbit    kk1 = P3^5;
sbit    kk2 = P3^7;


#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 STATUS_REG 0x00 // 要写入到状态寄存器的值 
#define MAX_POLL 0x99 // 最在查询次数m number of
polls

void wren_cmd(); // 使能写入
void wrsr_cmd(); // 写入00H到状态寄存器
void wrdi_cmd(); //写入禁止指令
void byte_write(unsigned char w_addr_1,unsigned char w_data_1); //字节写入地址,
数据
unsigned char byte_read(unsigned r_addr_1);                     //字节读取,传入
地址

void rst_wdog();   // 清除看门狗
void outbyt(unsigned char write_data);//w_8bit
unsigned char inbyt();//r_8bit
void wip_poll(); 

void delay_k(uint time_k);
uchar ppp=0;
uchar mmm=0x55;
//******************************************************************************
**************
void main(void)
{                     
EA = 0; // 
SO = 1;
SI = 1;
SCK =0;
CS = 1;
wren_cmd(); // 使能写入
wrsr_cmd(); // 写入00H到状态寄存器
while(1)
 {
  if(!kk1)
     { 
   P1=0xFF;
   ppp=P1;
       wren_cmd(); // 使能写入
   byte_write(mmm,ppp); // 写入数据到地址(字节写入)
   wrdi_cmd();     //写入禁止指令
   CS = 1;
while(!kk1)
{
 rst_wdog(); // 清除看门狗
           delay_k(1000);
led =!led;
}
     }

  if(!kk2)
 {
       wren_cmd(); // 使能写入
      ppp=byte_read(mmm); // 读取地址处的数据(字节读取)
       P1 = ppp;
CS = 1;
while(!kk2)
{
 rst_wdog(); // 清除看门狗
           delay_k(1000);
led =!led;
}

     }
rst_wdog(); // 清除看门狗
   delay_k(1000);
 }
}
//******************************************************************************
**************
//* 写入使能指令
//* 传入参数: 无
//* 返回值: 无

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

unsigned char byte_read(unsigned r_addr_1)
{
unsigned int addr; 
unsigned char read_data;

// addr = BYTE_ADDR; // 设置要读取的地址
   addr = r_addr_1; // 设置要读取的地址
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 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_k(uint time_k)
{
  while(--time_k);

}

⌨️ 快捷键说明

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