先是自己写了一个不行,用网上广泛流传的下面这个程序还是不行,感觉这个程序写的挺清晰的,位定义已经根据实际硬件进行了定义,也换过片子,晶振11.0592,写保护脚已经接到0(没有写保护了),读出来总是0xff,两天了焦头烂额了,谢谢各位 // 24c02读写程序
#define uchar unsigned char #define uint unsigned int #include <reg52.h> #include <stdio.h> #include <absacc.h> sbit scl=P3^5; //24c02 SCL sbit sda=P3^4; //24c02 SDA sbit DOG=P1^7; //狗 uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据 void x24c02_write(uchar address,uchar info); //向24c02的address地址中写入一字节数据info void x24c02_init(); //24c02初始化子程序 void delay1(uchar x); void flash(); void x24c01_init(); void start(); void stop(); void writex(uchar j); uchar readx(); void clock(); void delay1(uchar x) { uint i; for(i=0;i<x;i++); DOG=~DOG; } void flash() { // uchar u; DOG=~DOG; } void x24c02_init() { scl=1; flash(); sda=1; flash(); } void start() { sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash(); } void stop() { sda=0; flash(); scl=1; flash(); sda=1; flash(); } void writex(uchar j) { uchar i,temp; temp=j; for (i=0;i<8;i++){ temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash(); } scl=0; flash(); sda=1; flash(); } uchar readx() { uchar i,j,k=0; scl=0; flash(); sda=1; for (i=0;i<8;i++){ flash(); scl=1; flash(); if (sda==1) j=1; else j=0; k=(k<<1)|j; scl=0; } flash(); return(k); } void clock() { uchar i=0; scl=1; flash(); while ((sda==1)&&(i<255))i++; scl=0; flash(); } uchar x24c02_read(uchar address) { uchar i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop(); delay1(10); return(i); } void x24c02_write(uchar address,uchar info) { EA=0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA=1; delay1(50); }
|