//#include //#include //下面是我正在用的没有问题。 sbit SO=P2^2; sbit SI=P2^1; sbit SCK=P2^0; sbit CS=P3^6; //25045可编程看门狗监控EEPROM指令集 #define WREN 0x06; 00000110 //设置写使能锁存器(允许写操作) #define WRDI 0x04; 00000100 //复位写使能锁存器(禁止写操作) #define RDSR 0x05; 00000101 //读状态寄存器 #define WRSR 0x01; 00000001 //写状态寄存器(块锁定) #define READ 0x03; 00000011 //从开始于所选地址的存储器列阵中读出数据 #define WRTE 0x02; 00000010 //把数据写入开始于所选地址的存储器阵列中(1至4字 节) void in_byte(unsigned char BYT); unsigned char out_byte(void); unsigned char rdsr_dog(void); void wrsr_dog(unsigned char status_reg); unsigned char wip_poll(void); void wrdi_dog(void); void rest_dog(void); unsigned char byte_read(unsigned char H,unsigned char L); void byte_write(unsigned char H,unsigned char L,unsigned char D); //void page_read(unsigned char H,unsigned char L,unsigned char D); //void page_write(unsigned char H,unsigned char L,unsigned char D); unsigned char rda[8]; unsigned char cs_rda[8]; //看门狗写使能子程序 void wren_dog(void) { // unsigned char com; // com=0x06;//WREN; SCK=0; CS=0; in_byte(0x06); SCK=0; CS=1; } //看门狗写禁止子程序 void wrdi_dog(void) { //unsigned char com; //com=0x04;//WRDI; SCK=0; CS=0; in_byte(0x04); SCK=0; CS=1; } //写状态寄存器 void wrsr_dog(unsigned char status_reg) { // unsigned char com=0x01;//WRSR; SCK=0; CS=0; in_byte(0x01); in_byte(status_reg); SCK=0; CS=1; wip_poll(); } //读状态寄存器 unsigned char rdsr_dog(void) { // unsigned char com=0x05;//RDSR; SCK=0; CS=0; in_byte(0x05); return(out_byte()); SCK=0; CS=1; } //字节读 unsigned char byte_read(unsigned char H,unsigned char L) { unsigned char data_dog,add; SCK=0; CS=0; SO=1; SI=1; add=H<<3; add|=0x03;//READ; in_byte(add); add=L; in_byte(add); data_dog=out_byte(); SCK=0; CS=1; return(data_dog); } //字节写 //H,地址高字节;L地址低字节;D写入的数据 void byte_write(unsigned char H,unsigned char L,unsigned char D) { unsigned char data_dog,add; SCK=0; CS=0; SO=1; SI=1; add=H<<3; add|=0x02;//WRTE; in_byte(add); add=L; in_byte(add); data_dog=D; in_byte(data_dog); CS=1; wip_poll(); } //复位看门狗子程序 void rest_dog(void) { CS=0; CS=1; } //检验写操作是否结束。 unsigned char wip_poll(void) { unsigned char i; unsigned char wip; for(i=0xff;i>=1;i--) { wip=rdsr_dog(); wip&=0x01; if(wip==0) break; } return(wip); } //单字节指令或数据写入X25045 //在SI线上输入的数据在SCK的上升沿被锁存。 void in_byte(unsigned char byt) { unsigned char i; //SCK=0; //CS=0; for(i=8;i>=1;i--) { SCK=0; SI=byt&0x80; SCK=1; byt=byt<<1; } // SI=0; // SCK=0; // CS=1; } //单字节数据从X25045读到单片机 //数据由SCK的下降沿输出到SO线上。 unsigned char out_byte(void) { unsigned char i; unsigned char byt; //SO=1; //SCK=0; //CS=0; for(i=8;i>=1;i--) { byt=byt<<1; SCK=1; SCK=0; byt|=SO; } //SCK=0; //CS=1; return (byt); }