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

📄 对5045的操作不是我编的,但我用过,挺好用的..c

📁 对看门狗5045的操作不是我编的,但我用过,挺好用的..c
💻 C
字号:
#include <stdio.h>
#include <AT89X51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

#define WREN_INST    0x06  //写使能控制字       Write enable latch instruction (WREN)
#define WRDI_INST    0x04  //写禁能控制字       Write disable latch instruction (WRDI)
#define WRSR_INST    0x01  //写状态寄存器控制字 Write status register instruction (WRSR)
#define RDSR_INST    0x05  //读状态寄存器控制字 Read status register instruction (RDSR)
#define WRITE_INST   0x02  //写存储器控制字     Write memory instruction (WRITE)
#define READ_INST    0x03  //读存储器控制字     Read memory instruction (READ)
#define MAX_POLL     0x99  //最大查询周期控制字 Maximum number of polls
#define WDT020       0x20  //看门狗超时周期200ms
#define WDT060       0x10  //看门狗超时周期600ms
#define WDT140       0x00  //看门狗超时周期1400ms
#define WDT000       0x30  //关闭看门狗
#define BP0          0x00       //没有保护的空间
#define BP1          0x40       //保护0180--01ff
#define BP2          0x80       //保护0100--01ff
#define BP3          0xc0       //保护0000--01ff
//******************************************
//定义对5045的操作方式
#define CONTROL1    WDT000|BP0  //实际控制值一(关闭看门狗 没有保护的空间)
#define CONTROL2    WDT140|BP3  //实际控制值二(看门狗超时周期1400ms 保护0000--01ff)
#define CONTROL3    WDT140|BP0  //实际控制值三(看门狗超时周期1400ms 没有保护的空间)
//******************************************
//定义管脚
sbit SCK=P1^0;                //时钟
sbit SI=P1^1;                 //CPU--->5045
sbit SO=P1^5;                 //5045-->CPU
sbit CS=P1^4;                 //片选
//******************************************
//***************************************************************************
//5045底层操作程序,外部函数声明
void dog_feed(void);
extern void Wrdi_Cmd(void);                   //写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作
extern void Wrsr_Cmd(uchar control_Byte);     //写状态寄存器
extern void Byte_Write(uint e2_add,uchar a);  //写入一字节
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt);    //写入1页,数据来源:内部的RAM
extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt);    //写入1页,数据来源:外部的RAM
extern uchar Byte_Read(uint e2_add);                              //从5045的指定地址读出1字节
extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uint data_amount);   //从5045连续读取数据.数据存放:内部的RAM
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uchar data_amount);  //从5045连续读取数据.数据存放:外部的RAM
//***************************************************************************

//******************************************
//输出一个字节
//入口:一个uchar形变量
//出口:无
static void OutByte(uchar ch)
{
     uchar i=8;
     do
     {
          SCK=0;
          SI=(bit)(ch&0x80);        //强制取为位变量,输出
          ch=ch<<1;                 //右移一位
          SCK=1;
     }
     while(--i);
     SI=0;
}
//******************************************


//******************************************
//输入一个字节
//入口:没有入口
//出口:一个uchar形变量
static uchar InByte(void)
{
    uchar i,a=0;
    SO=1;
    for (i=8;i>0;i--)
    {
        SCK=1;
        SCK=0;
        a<<=1;
 if(SO)
 a|=0x01;
    }
    return(a);
}
//*****************************************


//*****************************************
//读状态寄存器
//入口:无
//出口:寄存器状态
static uchar Rdsr_cmd(void)
{
        uchar a;
        SCK=0;
        CS=0;
        OutByte(RDSR_INST);     //发出读寄存器命令
        a=InByte();             //读入
        SCK=0;
        CS=1;
        return(a);
}
//*****************************************


//*****************************************
//测试写周期是否结束,超时后测试不成功也返回
//入口:无
//出口:无
static void Wip_Poll(void)
{
       uchar temp,i=MAX_POLL;
       do
       {
              temp=Rdsr_cmd();
              ACC=temp;
              if(!(ACC&0x01))
              break;              //结束后返回
       }
       while(--i);                //超时也返回
}
//*****************************************


//*****************************************
//设置写使能,在执行写入操作之前要先将写使能控制位置位
//入口:无
//出口:无
static void Wren_Cmd(void)
{
        SCK=0;
        CS=0;
        OutByte(WREN_INST);
        SCK=0;
        CS=1;
}
//*****************************************


//*****************************************
//写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作
//入口:无
//出口:无
extern void Wrdi_Cmd(void)
{
        SCK=0;
        CS=0;
        OutByte(WRDI_INST);
        SCK=0;
        CS=1;
}
//*****************************************


//*****************************************
//写状态寄存器
//入口:控制字
//出口:无
extern void Wrsr_Cmd(uchar control_Byte)
{
        Wren_Cmd();
        SCK=0;
        CS=0;
        OutByte(WRSR_INST);
        OutByte(control_Byte);
        SCK=0;
        CS=1;
        Wip_Poll();
}
//*****************************************

//*****************************************
//写入数据之前的预操作
//入口:5045的地址
//出口:无
static void Pre_Write(uint c1)
{
        Wren_Cmd();
        SCK=0;
        CS=0;
        OutByte(WRITE_INST|(0x08&((uchar)(c1/256))<<3));  //将地址的第9位(D9)传送到命令字中,随命令字一起发出
        OutByte((uchar)c1);                               //发送地址的低8位
}
//*****************************************



//*****************************************
//写入一字节
//入口:5045的地址,待写数据
//出口:无
extern void Byte_Write(uint e2_add,uchar a)
{
        Pre_Write(e2_add);         //预操作
        OutByte(a);                //发出数据
  OutByte(\'Ω\');
        SCK=0;
        CS=1;
        Wip_Poll();                //等待写入操作完成
}
//*****************************************

//*****************************************
//读数据之前的预操作
//入口:5045的地址
//出口:无
static void Pre_Read(uint c1)
{
        SCK=0;
        CS=0;
        OutByte(READ_INST|(0x08&((uchar)(c1/256))<<3));  //将地址的第9位(D9)传送到命令字中,随命令字一起发出
        OutByte((uchar)c1);                              //发送地址的低8位
}
//*****************************************


//*****************************************
//从5045的指定地址读出1字节
//入口:5045的地址
//出口:数据
extern uchar Byte_Read(uint e2_add)
{
        uchar a;
        Pre_Read(e2_add);     //预读取
        a=InByte();           //读出数据
        SCK=0;
        CS=1;
        return(a);
}
/*****************************************

void dog_feed(void)
{
CS=1;
CS=0;
CS=1;
}
*/

void main(void)
{
 Wrdi_Cmd();                     //复位写使能
 Wrsr_Cmd(CONTROL3);             //设置5045的工作状态
 while(1);
} 

⌨️ 快捷键说明

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