📄 wd_51.c
字号:
#include<reg52.h>
#define WREN 0x06 //设置写锁存
#define WRDI 0x04 //重新设置写锁存
#define RSDR 0x05 //读状态寄存器
#define WRSR 0x01 //写状态寄存器
#define READ 0x03 //在选区的地址区读数据
#define WRITE 0x02 //在选区的地址区写数据(1 to 16BYTES)
sbit WDCS=P1^4;
sbit WDSCK=P1^5;
sbit WDSI=P1^6;
sbit WDSO=P1^7;
sbit LED=P1^0;
void X5045SpiOpen(void);//打开X5045片选
void X5045SpiClose(void);//关闭X5045片选
unsigned char X5045SpiSend(unsigned char val);//X5045收发SPI协议
void X5045WriteEnable();
void X5045SetTimer(void);//软件使能X5045写操作
void FillWD(void);
unsigned char X5045ReadStatus(void);
void X5045WriteStatus(unsigned char val);
void X5045WriteWait(void);
unsigned int X5045ReadWord(unsigned int addr);
unsigned char X5045ReadByte(unsigned int addr);
void X5045WriteWord(unsigned int addr, unsigned int val);
void X5045WriteByte(unsigned int addr, unsigned char val);
/*************************************************
void X5045SpiOpen(void);//打开X5045片选
*************************************************/
void X5045SpiOpen(void)//打开X5045片选
{
WDCS=1;
WDSI=1;
WDSO=1;
WDSCK=0;
WDCS=0;
}
/*************************************************
void X5045SpiClose(void);//关闭X5045片选
*************************************************/
void X5045SpiClose(void)//关闭X5045片选
{
WDCS=1;
WDSCK=0;
}
/*************************************************
unsigned char X5045SpiSend(unsigned char val);//X5045收发SPI协议
Dataout :读取到的WD数据
Datain :写入WD的数据
Cout :读取WD的数据进位
Cin :写入WD的数据进位
*************************************************/
unsigned char X5045SpiSend(unsigned char val)//X5045收发SPI协议
{
unsigned char Cout,i,Q=0x80;
unsigned char Dataout=0x00;
unsigned char Cin;
for(i=0;i<8;i++)
{
Cout=WDSO;
if(val&Q)
Cin=1;
else
Cin=0;
WDSI=Cin;
WDSCK=1;
;
WDSCK=0;
Dataout|=(Cout<<(7-i));
val<<=1;
}
return Dataout;
}
/*******************************8
void EnableWrite(void)
功能:发送WREN,写使能
*********************************/
void X5045WriteEnable()
{
X5045SpiOpen();
X5045SpiSend(WREN);
// WDCS=0;
// ;
WDCS=1;
;
WDCS=0;
WDSCK=0;
}
/*************************************************
unsigned char X5045SpiSend(unsigned char val)
{
unsigned char i;
ACC = val;
for (i = 8; i > 0; i --)
{
CY = WDSO;//取数据SO
_rlca_();//存数据ACC.0读数据ACC.7同时进行
WDSI = CY;//送数据SI
WDSCK = 1;//上升沿打入数据
_nop_();
WDSCK = 0;//下降沿读入数据(首次为假动作)
}
return ACC;
}
void X5045SetTimer(void);//设置看门狗时间,复位电压
状态寄存器status register :(default =30h)
SR.7=0,SR.6=0
SR.5=WD1;SR.4=WD0//设置看门狗的时间//WD1WD0=10;200ms,WD1WD0=01:600ms,WD1WD0=00;1.4s
SR.3=BL1;SR.2=BL0//设置保护区BL1BL0=10
SR.1=WEL;SR.0=WIP
*************************************************/
void X5045SetTimer(void)//软件使能X5045写操作
{
unsigned char timer=0x38;//设置为200ms,同时将100h--1ffh段地址保护起来;
X5045WriteEnable();
X5045SpiSend(WRSR);
X5045SpiSend(timer);
X5045SpiClose();//关闭X5045片选
}
/*******************************************
void FillWD(void)
功能:喂狗指令
*********************************************/
void FillWD(void)
{
WDCS=0;
WDCS=1;
WDCS=0;
WDSCK=0;
}
/**************************************
unsigned char X5045ReadStatus(void)
功能:读状态寄存器
*****************************/
unsigned char X5045ReadStatus(void)
{
unsigned char val;
X5045SpiOpen();//打开X5045片选
X5045SpiSend(RSDR);//发送读X5045状态命令
val=X5045SpiSend(0xff);//接收X5045状态数据
X5045SpiClose();//关闭X5045片选
return val;
}
/*--------------------------------------
写X5045状态
--------------------------------------*/
void X5045WriteStatus(unsigned char val)
{
X5045SpiOpen();//打开X5045片选
X5045WriteEnable();
X5045SpiSend(WRSR);//发送写X5045状态命令
X5045SpiSend(val);//发送X5045状态数据
X5045SpiClose();//关闭X5045片选
}
/*--------------------------------------
等待X5045写入完成
--------------------------------------*/
void X5045WriteWait(void)
{ unsigned char status;
do
{
status=X5045ReadStatus();
}
while (status & 0x01);//WIP=0 退出
}
/*--------------------------------------
写X5045一个字节
--------------------------------------*/
void X5045WriteByte(unsigned int addr, unsigned char val)
{
unsigned char temp;
temp = WRITE;
if ((addr >> 8) & 0x01) temp |= 8;
X5045WriteEnable();//使能X5045写操作
X5045SpiSend(temp);//发送X5045写命令及高位地址
X5045SpiSend(addr);//发送X5045写低位地址
X5045SpiSend(val);//发送X5045写数据
X5045WriteWait();//等待本次X5045写入完成
X5045SpiClose();//关闭X5045片选
}
/*--------------------------------------
写X5045一个字
--------------------------------------*/
void X5045WriteWord(unsigned int addr, unsigned int val)
{
unsigned char temp;
temp = WRITE;
if ((addr >> 8) & 0x01) temp |= 8;
X5045WriteEnable();//使能X5045写操作
X5045SpiSend(temp);//发送X5045写命令及高位地址
X5045SpiSend(addr);//发送X5045写低位地址
X5045SpiSend(val & 0xff);//发送X5045写低位数据
X5045SpiSend(val >> 8);//发送X5045写高位数据
X5045SpiClose();//关闭X5045片选
X5045WriteWait();//等待本次X5045写入完成
}
/*--------------------------------------
读X5045一个字节
--------------------------------------*/
unsigned char X5045ReadByte(unsigned int addr)
{
unsigned char val;
X5045SpiOpen();//打开X5045片选
val = READ;
if ((addr >> 8) & 0x01) val |= 8;
X5045SpiSend(val);//发送X5045读命令及高位地址
X5045SpiSend(addr&0xff);//发送X5045读低位地址
val=X5045SpiSend(0xff);//接收X5045读数据
X5045WriteWait();//等待本次X5045写入完成
X5045SpiClose();//关闭X5045片选
return val;
}
/*--------------------------------------
读X5045一个字
--------------------------------------*/
unsigned int X5045ReadWord(unsigned int addr)
{
unsigned char val;
X5045SpiOpen();//打开X5045片选
val = READ;
if ((addr >> 8) & 0x01) val |= 8;
X5045SpiSend(val);//发送X5045读命令及高位地址
X5045SpiSend(addr & 0xff);//发送X5045读低位地址
val=X5045SpiSend(0xff);//接收X5045读低位数据
addr=X5045SpiSend(0xff);//接收X5045读高位数据
X5045SpiClose();//关闭X5045片选
addr <<= 8;
addr |= val;
return addr;
}
/**************************************
void main():测试程序
**************************************/
void main()
{
unsigned int i;
unsigned char status,save;
unsigned char addr=0x03,datain=0x88;
X5045SetTimer();
X5045WriteByte(addr, datain);
// X5045WriteWord(0x0003,0xff88);
// FillWD();
// for(i=0;i<1600;i++)
// LED=1;
// for(i=0;i<1600;i++)
// LED=0;
status=X5045ReadStatus();
save=X5045ReadByte(addr);
// data1=X5045ReadWord(0x0003);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -