打印

请帮忙看看这个2401的读写程序那里有问题

[复制链接]
1483|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaohq|  楼主 | 2009-3-5 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己学编的,编译通过,但硬件仿真时无反映.
//**********************************
//AT24C01  读写程序
//***********************************
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P3^3;
sbit sda=P3^4;
void delay(uint n)    //延时
{
    for(;n>0;n--)
        {
            _nop_;
            _nop_;
            
        }
}

void star()
{
    sda=1;
    delay(1);
    scl=1;
    delay(1);
    sda=0;
    delay(1);
    scl=0;
}

void stop()
{
    sda=0;
    delay(1);
    scl=1;
    delay(1);
    sda=1;
    delay(1);
    scl=0;
}
void ack()
{
    uchar i;
    scl=0;
    delay(2);
    while((sda=1)||(i<250))
    i++;
    scl=1;
    delay(2);
    scl=0;
}
void write(uchar temp)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        scl=0;
        delay(1);
        temp=temp<<1;
        if(temp&0x80==0x80)
            sda=1;
        else
            sda=0;
        scl=1;
        delay(1);
    }
    scl=0;
}
uchar read()
{
    uchar i,temp;
    for(i=0;i<8;i++)
    {
        scl=0;
        delay(1);
        scl=1;
        delay(1);
        if(sda)
            temp=(temp<<1)|0x01;
        else
            temp=temp<<1;
        delay(1);
        
    }
    scl=0;
    return temp;
}
void wrtorom(uchar address,uchar date)  //向指定地址写数据
{
    star();
    write(0xa0);
    ack();
    write(address);
    ack();
    write(date);
    ack();
    stop();
}
uchar rdfromrom(address)      //从指定地址读出数据
{
    uchar k;
    star();
    write(0xa0);
    ack();
    write(address);
    ack();
    star();
    write(0xa1);
    ack();
    k=read();
    stop();
    scl=0;
    return k;
}
 main()
{    
    uchar j;
    sda=1;
    delay(1);
    scl=1;
    delay(1);
    wrtorom(3,0x0f);
    delay(2000);
    j=rdfromrom(3);
    P2=j;
    while(1);
}

相关帖子

沙发
ayb_ice| | 2009-3-5 21:24 | 只看该作者

ack中i没有赋初值

当然这可能不是根本问题

使用特权

评论回复
板凳
zdwabcdefg| | 2009-3-5 22:28 | 只看该作者

我做过24c08的

1 得有返回值
void  I2C_Ack()
{
   SDA = 0;
   SCL = 1;
   delayNOP();   
   SCL = 0;       //启动应答发送
   SDA = 1;      //取反
}



  //得发送非应答子函数
//如下:
void  I2C_NAck()
{
   SDA = 1;
   SCL = 1;
   delayNOP();   
   SCL = 0;  //启动非应答发送
   SDA = 0;   //取反  
}
//你查下2401的芯片读写怎么具体,一次能写多少!如2408 每次写只能写16个数据
读 能读64个数据 你读写程序没具体写明要读和写多少个数据
只给出你部分程序 可用做参考你!这程序可行!

uchar  SendString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
   uchar  s;

   I2C_start();
   SendByte(Slave);          
   if(ack==0) return(0);     
   SendByte(Subaddr);       
   if(ack==0) return(0);

   for(s=0; s<Num; s++)
   {
     SendByte(*Source);      
     if(ack==0) return(0);
     Source++;               
   }
   I2C_stop();             
   return(1);
}



// 接收多字节数据函数(0xa0,0x00,数组地址,数据个数)


uchar  RecString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
   uchar  s;

   I2C_start();
   SendByte(Slave);          //发送器件地址
   if(ack==0) return(0);
   SendByte(Subaddr);        //发送器件子地址
   if(ack==0) return(0);
  
   I2C_start();
   SendByte(Slave+1);        //发送器件地址,读模式
   if(ack==0) return(0);

   for(s=0; s<Num; s++)
   {
     *Source=RecByte();    
     I2C_Ack();            
     Source++;
   }
   I2C_NAck();               
   I2C_stop();            
   return(1);
}
main(void)

  uchar i,j,k,a,b,c,d,e,f,h,o=0;
 I2C_init(); 
while(key==1);
P1=0xfe;
 for(o=0;o<4;o++)
{                                                                                                                         
  RecString(0xa0,h,display1,64);
  delayms(30);
  h+=0x40;
  j=0;
   SendString(0xa8,k,p+j,64);
   k+=0x40;
   j+=64;
   delayms(30);

h=0;
for(o=0;o<4;o++)

  
   RecString(0xa2,h,display1,64);
  delayms(30);
  h+=0x40;
  b=0;
   SendString(0xaa,a,p+b,64);
   a+=0x40;
   b+=64;
   delayms(30);
   }
  }
}

使用特权

评论回复
地板
gaohq|  楼主 | 2009-3-6 10:07 | 只看该作者

谢谢楼上两位!

我再试试.

使用特权

评论回复
5
zdwabcdefg| | 2009-3-6 12:30 | 只看该作者

好使了 跟我说声

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

378

主题

3763

帖子

5

粉丝