X5045看门狗电路

转载:仅为学习用: 

看门狗X5045开发档案 

    最近给客户做了一个电机控制板。考虑到产品的稳定性。所有复位电路我们采用了X5045最为复位。当然前期我也下了不少的资料看。可是大多的不全。或者是程序不能用,现在我把我的程序发给大家。希望做X5045的朋友可以用的上,也算是我个人回馈论坛吧。当然我支持程序原创,因为许许多多的

一手资料都不是网上下的。而是写出来的。在此我更希望大家自己动手去写程序。因为只有自己写用的时候你才会有底。

     X5045工作在4.5V-5.5V,希望要用在2.7V-5.5V,并且复位电压在3.0V的同志。记得选型的时候选X5045S8I-2.7A,我也曾经为此复位电压苦恼了很久,我用的是锂电池3.6V,我当时选的X5045一直在啊复位希望读者,一定要看清除数据手册在选型。

    X5045是一种集看门狗、电压监控和串行EEPROM 三种功能于一身的可编程控制电路.特别适合应用在需要少量存储器,并对电路板空间需求较高场合,X5045具有电压监控功能,可以保护系统免受低电压的影响,当电源电压降到允许范围(4.2V)以下时,系统将复位,直到电源电压返回到稳定值为止。X5045的存储器与CPU 通过串行通信方式接口(SPI),可以存放512个字节数据.可擦写100万次,数据可保存100年.

    下面是我项目中的  X5045的读写程序,希望可以用的上的可以拿去参考。

     X5045接线电路图:

         

测试程序:

 说明:

   以下程序包含:底层字节读取函数,复位看门狗,状态寄存器的读写函数,EEPROM的读写函数。

在主函数中有一个  P0=design[b];//读已经定义的花样数据并写花样数据到P0;那个是我在程序测试的时候用的使用可以不易理会,send_char_com(Read_StatusReg()); 是利用串口把状态寄存器中的数发送到PC机上去。这个也是我测试用的。这些函数在另一个 .h文件中我就不发上去了,你们应该是会写的。

   我的程序在实际应用中得到了事实的考证,经过实际的检验。单片机做控制外置看门狗电路效果很不错。X5045的功能很强大在实际开发中很有价值。

//=============================================
//程 序:X5045看门狗的使用

//MCU:AT89C2051

//晶振:12M
//署名:张先永
//时间:2009-6-6
//=============================================
#include <AT89X51.h>

#define uchar unsigned char 
#define uint  unsigned int
/*
#define CS    P1_4
#define SO    P1_5
#define SI    P1_7
#define SCLK  P1_6
*/

//实验板测试
#define CS    P1_0
#define SO    P1_1
#define SI    P1_3
#define SCLK  P1_2
#define ID_Part_A 0x55
#define ID_Part_D 0x40

//=============================================
//函数名称:1ms延时函数
//=============================================
delay1ms(int t)
{
 int i,j;
 for(i=0;i<t;i++)
  for(j=0;j<120;j++)  ;
}
//=============================================
//函数名称: X5045写入数据(NOTE:高位在前)
//=============================================
void Write_X5045(uchar Writer_data)
{
 unsigned char i;
 for(i=0;i<8;i++)
 {
     SI=(bit)(Writer_data&0x80);
  SCLK=0;
  SCLK=1;
  Writer_data<<=1;
 }
  SI=0; //使SI处于确定的状态  
}
//=============================================
//函数名称: X5045读取数据(NOTE:高位在前)
//=============================================
uchar Read_X5045(void)
{
 unsigned char i,Read_data;
 for(i=0;i<8;i++)
 {
  SCLK=1;
  SCLK=0;
  Read_data<<=1;
  Read_data|=(uchar)(SO);
 }
 return Read_data; 
}

//=============================================
//函数名称:WREN Instruction  允许写 CMD OX06
//=============================================
void WREN_Cmd (void)
{
 SCLK=0;
 CS=0;
 Write_X5045(0x06);
 SCLK=0;
 CS=1;
}
//=============================================
//函数名称:WRDI Instruction 不允许写 CMD OX04
//=============================================
void WRDI_Cmd (void)
{
 SCLK=0;
 CS=0;
 Write_X5045(0x04);
 SCLK=0;
 CS=1;
}
//=============================================
//函数名称: 读状态寄存器 
//说    明: WIP bit:(Read Only) 
//    When set to a"1",a nonvolatile 
//    write opration is in progress.
//    WEL Bit:(Read Only) 
//    the bit is Write Enable Latch
//    When WEL=1,the latch is set. 
//=============================================
uchar Read_StatusReg(void)
{
  uchar Read_data;
  SCLK=0;
  CS=0;
  Write_X5045(0X05);      //Read Status Register instuction
  Read_data=Read_X5045();
  SCLK=1;
  CS=1; 
  return (Read_data);    
}

//=============================================
//函数名称: 写状态状态寄存器
//=============================================
void Write_StateReg(uchar Writer_data)
{
  delay1ms(10); //等待器件稳定,经验值
  WREN_Cmd (); //解锁
  SCLK=0;
    CS=0;
  Write_X5045(0X01);
   Write_X5045(Writer_data);
   SCLK=0;
   CS=1;
  WRDI_Cmd (); //上锁 
}
//=============================================
//函数名称:重设看门狗
//=============================================
void Rest_WDG(void)
{
 CS=0;
 CS=1;
}
//=============================================
//函数名称: 写数据到X5045__EEPROM
//=============================================
void Writer_to_X5045(uchar Writer_data, address)
{
  WREN_Cmd (); //解锁
  SCLK=0;
  CS=0;
  Write_X5045(0X02);
  Write_X5045(address);
  Write_X5045(Writer_data);
  SCLK=0;
  CS=1;
  WRDI_Cmd (); //上锁
}
//=============================================
//函数名称:读取数据X5045__EEPROM 
//=============================================
uchar Read_form_X5045(uchar address)
{
 uchar Read_data;

 SCLK=0;
 CS=0;
 Write_X5045(0X03);
 Write_X5045(address);
 Read_data=Read_X5045();
 SCLK=0;
 CS=1;
 return Read_data;
}
//=============================================
//函数名称:重置看门狗门限
//=============================================
void Reset_Vtrip(void)
{
 CS=0;
 delay1ms(50);
 SCLK=0;
 CS=0;
 Write_X5045(0x06);
 SCLK=0;
 CS=1;
 delay1ms(10);
 SCLK=0;
 CS=0;
 Write_X5045(0X02);
 Write_X5045(0x00);
 Write_X5045(0x03);
 Write_X5045(0x00);
 SCLK=0;
 CS=1; 
}
//=============================================
//函数名称:设置看门狗门限
//=============================================
void Set_Vtrip(void)
{
 CS=0;
 delay1ms(50);
 SCLK=0;
 CS=0;
 Write_X5045(0x06);
 SCLK=0;
 CS=1;
 delay1ms(10);
 SCLK=0;
 CS=0;
 Write_X5045(0X02);
 Write_X5045(0x00);
 Write_X5045(0x01);
 Write_X5045(0x00);
 SCLK=0;
 CS=1; 
}

//=============================================
//函数名称:配置串口
//=============================================
void Init_Com(void)
{
     TMOD = 0x20;       //定时器工作方式2,初值自动装入
     PCON = 0x00;       //波特率不增倍
     SCON = 0x50;       //串行工作方式设定   
     TH1 = 0xFd;       //定时器初值高位
     TL1 = 0xFd;       //定时器初值低位
     TR1 = 1;        //启动定时器    
}
//=============================================
//函数名称:向串口发送一个字符 
//=============================================
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}


//定义花样数据
code   unsigned char design  
[32]={0xFF,0xFE,0xFD,
0xFB,0xF7,0xEF,0xDF ,0xBF,0x7f,
0x7f,0xbf,0xdf,0xef,0xF7,0xFB,0xFD,0xFE,0xFF,
0XFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
0xE7,0xDB,0xBD,0x7E,0xFF};

//=============================================
//函数名称:MAIN
//=============================================
void main()
{
 unsigned  char  b;//在C51中因内存由限需要尽可能考虑使用变量的类型
 
// Reset_Vtrip();
// delay1ms(60000);
// CS=0;
  Writer_to_X5045(ID_Part_D,ID_Part_A);
 Write_StateReg(0X10);
 Init_Com();
 while(1)
 { 
  for (b=0 ;b<32;b++)
     {
//  Set_Vtrip();
  P0=design[b];//读已经定义的花样数据并写花样数据到P0;
    send_char_com(Read_StatusReg());  
   send_char_com(Read_form_X5045(ID_Part_A));
   Rest_WDG();
  delay1ms(300);
  }
 }
}
--------------------- 
作者:zxianyong0 
来源:CSDN 
原文:https://blog.csdn.net/zxianyong/article/details/4310865 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_34447192/article/details/88314977