单片机24C02仿真,

#include
#define uchar unsigned char         
#define uint  unsigned int
#define ulong unsigned long
#define WriteDeviceAddress 0xa0       //定义器件写地址
#define ReadDviceAddress 0xa1         //定义器件读地址
sbit SCL=P3^3;                     //P2.7口模拟SCL信号
sbit SDA=P3^2;                     // P2.6口模拟SDA信号
bit ACK;                            //定义应答位
unsigned char i,rebuf[16] _at_ 0x40;    //16字节的数据接收缓冲区

void DelayMs(unsigned int number)     //延时函数
{
     unsigned char temp;
     for(;number!=0;number--)  
              for(temp=100;temp!=0;temp--) ;   
}
 
void Start()  /*发起始位*/
{
     SDA=1;
     SCL=1;
     SDA=0;
     SCL=0;
}

void Stop()  /*发停止位*/
{
     SCL=0;
     SDA=0;
     SCL=1;
     SDA=1;
}

void YEAck()  /*发应答信号*/
{
     SDA=0;
     SCL=1;
     SCL=0;
}
 
void NoAck()  /*发非应答信号*/
{
     SDA=1;
     SCL=1;
     SCL=0;
}

bit TestAck()  /*测试应答信号*/
{
         bit ErrorBit;
         SDA=1;
         SCL=1;
         ErrorBit=SDA;
         SCL=0;
         return(ErrorBit);
}
 
Write8Bit(unsigned char input)  /*写入 8 个 bit 到 24c02 */
{
     unsigned char temp;
     for(temp=8;temp!=0;temp--)  
     {
              SDA=(bit)(input&0x80);
              SCL=1;
              SCL=0;
              input=input<<1;
     }
}

uchar Read8Bit()  /*从 24c02 中读出 8 个 bit*/
{
     unsigned char temp,rbyte=0;
     for(temp=8;temp!=0;temp--)  
     {
            SDA=1;
              SCL=1;
              rbyte=rbyte<<1;
              rbyte=rbyte|((unsigned char)(SDA));
              SCL=0;
     }
     return(rbyte);
}

/*向24c02的address地址中写入8个字节数据ch*/
void Write24c02(uchar ch,uchar address)  
{
    Start();
     Write8Bit(WriteDeviceAddress);
     ACK=TestAck();
     if (ACK==1)
            Stop();
     Write8Bit(address);
     ACK=TestAck();
     if (ACK==1)
            Stop();
     for(i=0;i<8;i++)
     {
            Write8Bit(ch);    
             TestAck();
            if (ACK==1)
            Stop();
             ch++;
     }
     Stop();
     DelayMs(10);
}
 

/*从24c02的地址address中读取mm个字节数据*/
Read24c02_mm (uchar mm, uchar address)    
{
    uchar ch;        
     Start();
     Write8Bit(WriteDeviceAddress);
     ACK=TestAck();
      if (ACK==1)
            Stop();
     Write8Bit(address);
     ACK=TestAck();
      if (ACK==1)
            Stop();
     Start();
     Write8Bit(ReadDviceAddress);
    ACK=TestAck();
      if (ACK==1)
            Stop();
     for(i=0;i     {
            ch=Read8Bit();
            P0=ch;
            DelayMs(5000);
            YEAck();
     }
     ch=Read8Bit();
     P0=ch;
     DelayMs(5000);
     NoAck();
     Stop();
}
 
/*写入8个字节到 24c02 并读出来通过P0口的LED验证*/
void main(void) // 主程序
{
   uchar c1;
     while(1)
     {
             unsigned char m,n;
              m=0x01;
              n=0x30;  
             Write24c02(m,n);
            Read24c02_mm(5,0x32);
            while(1);
    }
}
单片机24C02仿真,_第1张图片

你可能感兴趣的:(单片机24C02仿真,)