📄 x5045.c
字号:
#include<reg51.h>
#include<intrins.h>
/*-------------------------------------------
//X5045状态字定义
#define WREN_INST 0x06 //写允许命令
#define WRDI_INST 0x04 //写禁止
#define WRSR_INST 0x01 //写状态寄存器命令
#define RDSR_INST 0x05 //读状态寄存器命令
#define WRITE_INST 0x02 //写存储器命令
#define RDAD_INST 0x03 //读存储器命令
#define MAX_POLL 0x99 //测试的最大次数
//-------------------------------------------*/
sbit CS_5045=P1^4;
sbit SIO=P1^1;
sbit CLK=P1^0;
sfr16 DPTR=0x82;
unsigned char time;
unsigned char eeprom_data;
void timer0_int(void) interrupt 1
{
TH0=0xdc;
TL0=0x00;
if(time--==0)
{
time=100;
}
}
void mDelay(unsigned int DelayTime)
{
unsigned char j=0;
for(;DelayTime>0;DelayTime--)
{
for(j=0;j<125;j++)
{;}
}
}
//----------------------------------------------------
//名称:clear_dog
//功能:x5045看门狗定时器复位子程序
//
//----------------------------------------------------
void clear_dog(void)
{
CS_5045=1;
_nop_();_nop_();
CS_5045=0;
_nop_();_nop_();
CS_5045=1;
}
//----------------------------------------------------
//名称:read_dog
//功能:读x5045,1字节数据子程序
//rd为读出数
//----------------------------------------------------
unsigned char read_dog(void)
{
unsigned char n,rd;
for(n=0;n<8;n++){
CLK=1;
_nop_();_nop_();
CLK=0;
if(SIO==1)
rd|=0x01;
else
rd&=0xFE;
if(n<7)
rd=rd<<1;}
return rd;
}
//----------------------------------------------------
//名称:write_dog
//功能:写x5045,1字节数据子程序
//wr为写入数
//----------------------------------------------------
void write_dog(unsigned char wr)
{
unsigned char n;
for(n=0;n<8;n++){
CLK=0;
if(wr&0x80)
SIO=1;
else
SIO=0;
CLK=1;
wr=wr<<1;}
}
//----------------------------------------------------
//名称:write_enable
//功能:写x5045使能允许子程序
//
//----------------------------------------------------
void write_enable(void)
{
CLK=0;
CS_5045=0;
write_dog(0x06);/*写使能锁存器*/
CLK=0;
CS_5045=1;
}
//读写状态寄存器或E2PROM操作函数-----------------------
//-----------------------------------------------------
//名称:read_dogstate
//功能:x5045读状态寄存器子程序
//status为返回状态字
//----------------------------------------------------
unsigned char read_dogstate(void)
{
unsigned char status;
CLK=0;
CS_5045=0;
write_dog(0x05); /*RSDR,读状态寄存器*/
status=read_dog(); /*读出状态字节*/
CLK=0;
CS_5045=1;
return status;
}
//----------------------------------------------------
//名称:write_dogstatus
//功能:x5045写状态寄存器子程序
//wr为写入状态
//----------------------------------------------------
void write_dogstate(unsigned char wr)
{
unsigned char status;
do{status=read_dogstate();}
while(status&0x01);
write_enable(); /*写使能允许*/
CLK=0;
CS_5045=0;
write_dog(0x01); /*WRSR,写状态寄存器*/
write_dog(wr); /*写状态字节*/
CLK=0;
CS_5045=1;
}
//----------------------------------------------------
//名称:read_dogdata
//功能:读x5045单元指定位置1字节数据子程序
//com为读出数
//addr为指定地址
//----------------------------------------------------
unsigned char read_dogdata(unsigned int addr)
{
unsigned char com;
DPTR=addr;
CLK=0;
CS_5045=0;
com=0x03;
if(DPH&0x01)
com|=0x08;
write_dog(com);
write_dog(DPL); /*写数据起始地址*/
com=read_dog(); /*读数据*/
CLK=0;
CS_5045=1;
return com;
}
//----------------------------------------------------
//名称:write_dogdata
//功能:向x5045单元指定位置写1字节数据子程序
//wr为写入数
//addr为指定地址
//----------------------------------------------------
void write_dogdata(unsigned int addr,unsigned char wr)
{
unsigned char status;
do{status=read_dogstate();}
while(status&0x01);
write_enable(); /*WREN,写使能允许*/
DPTR=addr;
CLK=0;
CS_5045=0;
status=0x02;
if(DPH&0x01)
status|=0x08;
write_dog(status); /*WRITE,写数据命令*/
write_dog(DPL); /*写数据起始地址*/
write_dog(wr); /*写数据*/
CLK=0;
CS_5045=1;
}
main()
{
// CKCON=0x00; //时钟控制
// AUXR=0x01; // 禁止ALE输出
P0=0xff;
P1=0xff;
P2=0xff;
// P3=0xff;
/* 设置t0 */
mDelay(1000);
TMOD=0x21;
TH0=0xdc;
TL0=0x00;
IE=0x82;
IP=0x02;
TR0=1;
EA=1;
time=100;
clear_dog();
mDelay(1000);
write_dogstate(0x00);
while(1)
{
write_dogdata(0x0001,0xaa);
eeprom_data=read_dogdata(0x0001);
mDelay(1000);
write_dogdata(0x0003,0x55);
eeprom_data=read_dogdata(0x0003);
mDelay(1000); //1s
// LED=!LED;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -