导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→网上down的,能用

* 28667: SOS!!![公告]

   荒原野草 
荒原野草发表的帖子 

 网上down的,能用
#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);                //发出数据
        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);
}

发表时间:2003年5月6日16:46:06

  
回复该帖

本主题共有 8 帖,分页:>>>>>该主题的所有内容[8]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  28792.[详细]荒原野草: 能告诉我是在哪里DOWN的吗?(X5045看门狗)
摘要:......(无内容)
- [cjy0312][1028次] 2003年5月7日

  28795.[详细]时间太久,记不清了,当时是用google搜的
摘要:......(无内容)
- [荒原野草][1715次] 2003年5月7日

  28805.[详细]谢谢!还有问题。。。。。
摘要:荒原野草:          我在google搜过,没发现。我用你的DOWN的程序直接生成.HEX文件烧片子,看门狗就起作用了吗?你试过吗?......(117字)
- [cjy0312][1039次] 2003年5月7日

[上一篇帖子]:[讨论]请教:关于以太网控制器芯片物理地址的问题?先提出我的观点,然后大家可以各抒己见: 网
[下一篇帖子]:SOS!!![公告][color=#F08080][size=4][face=黑体] S0S