打印

求助24C02,写不进,读不出

[复制链接]
1716|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
myhmz|  楼主 | 2007-9-7 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ST, AC, ck, sd
求助24C02,写不进,读不出,不知问题出在哪?请指点一下



#include <at89x51.h>
#include <regx51.h>
#include <intrins.h>
#define unchar unsigned char
#define unint unsigned int
#define nop _nop_();_nop_();

unchar dispbuf[9];
sbit SDA=P3^5;//定义数据线
sbit SCL=P3^4;//定义时钟线
sbit clk=P2^0  ;
sbit din=P2^1    ;
sbit en=P2^2     ;
void ack();
void noack();
void delay(unint value)

    while(value!=0) value--;
                      }

/*********************************************************
**名称:I2C_Start
**功能:启动I2C
**输入:无
**返回:无
*********************************************************/
void start()
{
        SDA=1;
       
        SCL=1;
           nop;nop; 
        SDA=0;
        nop;nop;
        SCL=0;//钳位I2C总线,准备发送数据
}
/**********************************************************
**名称:I2C_Stop
**功能:停止I2C
**输入:无
**返回:无
**********************************************************/
void stop()
{
        SDA=0;
        
        SCL=1;
        nop;nop;
        SDA=1;
        nop;nop;
        SCL=0;
}
/**********************************************************
**名称:Ack
**功能:应答信号
**输入:无
**返回:无
**********************************************************/
void ack()
{
        SDA=0;
       
        SCL=1;
            nop;nop;
        SCL=0;
        
        SDA=1;
       
}
/********************************************************
**名称:NoAck
**功能:发送非应答信号
**输入:无
**返回:无
********************************************************/
void noack()
{
        SDA=1;
        SCL=1;
           SCL=0;
                
       
}
/********************************************************
**名称:Test_Ack()
**功能:检测应答位
*********************************************************/
bit testack()
{         bit errorbit;
        SCL=1;
        SDA=1;//读入数据
        errorbit=SDA;
        SCL=0;           
        return(errorbit);

/********************************************************
**名称:SendData()        
**功能:发送一字节数据
**输入:buffer
**返回:
*******************************************************/
write8bit(unchar input)
{
        unchar  temp;
        for (temp=8;temp!=0;temp--)
           {
             SDA=(bit)(input&0x80);
             SCL=1;
             SCL=0;
             input=input<<1;
             }
    

/**************************************************************
**名称:uint ReceiveData()
**功能:接收一字节数据
**输入:
**返回:ucReceData
**说明:将接收的数据存放在ucReceData中
**************************************************************/
void  write24c02(unchar value,unchar address)
 
{     start();
      write8bit(0xa0);
      testack();
      write8bit(address);
      testack();
      write8bit(value);
      testack();
      stop();
       nop;nop;
      

//读8位
unchar read8bit()
{
   unchar temp,byte=0;
    for(temp=8;temp<0;temp--)
      { 
          SCL=1;
         byte=byte<<1;
         byte=byte|((unchar)(SDA));
        
         SCL=0;
         }
         return(byte);
         }


 //读一个字节
 unchar read24c02(unchar address)
 {
    unchar ch;
    start();
    write8bit(0xa0);
    testack();
    write8bit(address);
     testack();    
     start();
      write8bit(0xa1);
      testack();     
      ch=read8bit();
      noack();
      stop();
      return(ch); 
      }
  
/***************************************************************
**名称:main()
**功能:
**输入:
**返回:
**说明:
****************************************************************/
 void tsled(void)
{ unchar ts0,i,j;
  clk=0;
  en=0;
  delay(10);
    for(j=0;j<9;j++)
       {  ts0=dispbuf[j];
         
          for(i=0;i<4;i++)
           { clk=1;
              ts0=ts0<<1;
             if(AC==1)
                 din=1;
        else din=0;
                clk=0;
                nop;
                delay(3);
         }
         }
             en=1;

           }




void main()
{ unchar c1,c2;
  while(1) 
   {
   dispbuf[8]=0x0;
   dispbuf[7]=0x01;
   dispbuf[6]=0x0;
  dispbuf[5]=0x0;
  dispbuf[0]=0x1;
  write24c02(0x58,0x02);
  c1=read24c02(0x02);
  dispbuf[1]=c1%10;
  dispbuf[2]=c1/105;
  delay(100);
  write24c02(0x39,0x03);
  c2=read24c02(0x03);
  dispbuf[4]=c2%10;
  dispbuf[3]=c2/10;
  tsled();
      }
   }
    

       

相关帖子

沙发
ayb_ice| | 2007-9-7 20:42 | 只看该作者

多看IIC协议。。。

使用特权

评论回复
板凳
myhmz|  楼主 | 2007-9-8 08:43 | 只看该作者

我就是看了协议

我就是看了协议,写的程序,可能理解不够透彻。。能不能指点程序出错在什么地方

使用特权

评论回复
地板
ayb_ice| | 2007-9-8 09:12 | 只看该作者

简单的看了一下,至少下面程序的有问题

/********************************************************
**名称:Test_Ack()
**功能:检测应答位
*********************************************************/
bit testack()
{         bit errorbit;
        SCL=1;
        SDA=1;//读入数据
        errorbit=SDA;
        SCL=0;           
        return(errorbit);
}
修改一下
bit testack()
{
        bit errorbit;

        SDA=1;//读入数据
        SCL=1;
        errorbit=SDA;
        SCL=0;           
        return(errorbit);
}

使用特权

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

本版积分规则

8

主题

41

帖子

0

粉丝