📄 x5045程序.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 + -