Nebula Pi评测报告IIC 通信AT24C256·

Nebula Pi 开发板评测报告(十一)——IIC通信及AT24C256功能测试

ii11nnocent

ii11nnocent

80 0

IIC总线通信是一种重要的通信方式,使用下列程序可以将写入AT24C256中的数据显示到LCD1602上:

IIC.h:

#ifndef _IIC_H
#define _IIC_H

#include "reg52.h"
#include "intrins.h"


sbit SCL=P0^1;
sbit SDA=P0^2;

void iic_delay(void);
void IIC_Start(void);   
void IIC_Stop(void);

bit IIC_WriteByte(unsigned char dat);
unsigned char ReadByte(void);
unsigned char ReadByteN(void);

#endif

IIC.c:

#include "IIC.h"


/**********延时函数,i=1时延时1ms**********/
void iic_delay(void)
{
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

/************IIC起始信号************/
void IIC_Start(void)
{
  SCL = 0;
  SDA = 1;      //SCL低电平时拉高SDA,为起始信号做准备
  iic_delay();          
  SCL = 1;      //拉高SCL,延时
  iic_delay();  
  SDA = 0;      //拉低SDA,延时
  iic_delay();  
  SCL = 0;      //拉低SCL
}

/************IIC停止信号*************/
void IIC_Stop(void)
{
  SCL = 0;
  SDA = 0;      //SCL低电平时拉低SDA,为停止信号做准备
  iic_delay();          
  SCL = 1;      //拉高SCL,延时
  iic_delay();  
  SDA = 1;      //拉低SDA,延时
  iic_delay();  
  SCL = 0;      //拉低SCL
}


/*********写入一个字节数据*********/
bit IIC_WriteByte(unsigned char dat)
{
    bit ack;    //位定义应答位
    unsigned char mask; 
    
    for(mask=0x80;mask!=0;mask>>=1) //高位到低位依次传输
    {
        if( (mask&dat) == 0 )   SDA = 0;
        else                                    SDA = 1;
        
        iic_delay();
        SCL = 1;
        iic_delay();
        SCL = 0;                        //SCL由高变低完成一位的传送        
    }
    
    SDA = 1;
    iic_delay();
    SCL = 1;
    ack = SDA;
    iic_delay();
    SCL = 0;
    
    return ack; //返回0表示写入成功,返回1表示写入失败   
    
}

/********接收一个字节数据********/
unsigned char ReadByte(void)
{
    unsigned char mask;
    unsigned char dat;

    SDA = 1;     //将SDA拉高,设置数据线为输入方式
    for(mask=0x80;mask!=0;mask>>=1)
    {
        iic_delay();
        SCL = 1;                
        if(SDA == 0)    dat&=~mask;     //SDA为0时,dat的对应位清零
        else                    dat|=mask;      //SDA不为零时,dat的对应位置1
        iic_delay();
        SCL = 0;
    }
    SDA = 0;
    iic_delay();
    SCL = 1;
    iic_delay();
    SCL = 0;        

    return dat;
}

unsigned char ReadByteN(void)
{
    unsigned char mask;
    unsigned char dat;

    SDA = 1;                        //将SDA拉高,设置数据线为输入方式
    for(mask=0x80;mask!=0;mask>>=1)
    {
        iic_delay();
        SCL = 1;                
        if(SDA == 0)    dat&=~mask;     //SDA为0时,dat的对应位清零
        else                    dat|=mask;      //SDA不为零时,dat的对应位置1
        iic_delay();
        SCL = 0;
    }
    SDA = 1;
    iic_delay();
    SCL = 1;
    iic_delay();
    SCL = 0;        

    return dat;
}

main.c:

#include "reg52.h"  
#include "LCD1602.H"  
#include "IIC.h"  
#include "AT24CXX.h"  
  
unsigned char t[10];  
unsigned char d;  
  
void delay_ms(unsigned int k)  
{  
    unsigned int i,j;  
    for(i=k;i>0;i--)  
    {  
        for(j=78;j>0;j--);  
    }  
  
}  
  
void main(void)  
{  
    LCD_Init();             //LCD初始化  
    LCD_WriteString(1,1,"AT24C256");  
    WriteByte_AT24C256(0x08,123);           //写数据  
    delay_ms(10);  
    d = ReadByte_AT24C256(0x08);            //读数据  
      
    t[0] = d/100+'0';  
    t[1] = (d/10)%10+'0';  
    t[2] = d%10+'0';                                    //分离数据  
      
    LCD_WriteString(2,1,t);  
          
    while(1)  
    {  
        ;  
    }  
}

所属系列

从当前文章继续阅读它所在合集中的前后内容。

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人