Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198041
  • 博文数量: 36
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-18 23:27
个人简介

时间就是一切。

文章分类

全部博文(36)

文章存档

2023年(1)

2017年(2)

2016年(6)

2014年(1)

2009年(1)

2008年(15)

2007年(10)

我的朋友

分类: 嵌入式

2016-09-21 01:47:32


8051 与  24C04A  I2C 通信测试!



测试代码

#include
#include
#define uint unsigned int
#define  NOP4()  _nop_();_nop_();_nop_();_nop_();
sbit SCL = P1^0;        //时钟线 
sbit SDA = P1^1;    //双向数据线

//延时
void Delayms(uint ms)
{
  uint i;
while(ms--)
{
for(i=0;i<125;i++);
}
}


/********************************************************************
**函数名称 RACK()
**函数描述 发送应答信号
**传入参数 无
**传出参数 无
**返回值 无
********************************************************************/
void RACK()
{
  SDA = 1; 
  NOP4();
  SCL = 1;
  NOP4();
  SCL = 0;



/********************************************************************
**函数名称 NO_RACK()
**函数描述 发送非应答信号
**传入参数 无
**传出参数 无
**返回值 无
********************************************************************/
void NO_ACK()
{
  SDA = 1; 
  SCL = 1;
  NOP4();
  SCL = 0;
  SDA = 0;
}


/********************************************************************
**函数名称 start()
**函数描述 II2C启动信号
**传入参数 无
**传出参数 无
**返回值 无
********************************************************************/
static void start()
{
  SDA = 1; 
  SCL = 1; 
  NOP4();
  SDA = 0;
  NOP4();
  SCL = 0;
}


/********************************************************************
**函数名称 stop()
**函数描述 II2C终止信号
**传入参数 无
**传出参数 无
**返回值 无
********************************************************************/
static void stop()
{
  SDA = 0; 
  SCL = 0; 
  NOP4();
  SCL = 1; 
  NOP4();
  SDA = 1;
}


/*******************************************************************
**函数名称 Write_Byte
**函数描述 向24C04写入一个字节的数据
**传入参数 dat  需要写入的字节
**传出参数 无
**返回值 无
********************************************************************/
static void Write_Byte(unsigned char dat)
{
  char i = 0;
  for(i = 0; i < 8; i++)
  {
    dat <<= 1; 
SDA = CY;//进位或借位,有就是1,没有就是0
_nop_();
SCL = 1; 
NOP4();  
SCL = 0;
  }
  RACK();
}
/*******************************************************************
**函数名称 Read_Byte
**函数描述 从24C04读取一个字节的数据
**传入参数 dat  需要写入的字节
**传出参数 无
**返回值 无
********************************************************************/
static unsigned char Read_Byte()
{
  unsigned char i = 0, dat = 0;
  for(i = 0; i < 8; i++)
  {
     SCL = 1; 
dat <<= 1;
dat |= SDA; 
SCL = 0;
  }
  return dat;
}


/********************************************************************
**函数名称 Write24C04
**函数描述 向24C04指定的地址写入一个字节
**传入参数 addr   指定写入的地址
**           dat    需要写入的字节
**传出参数 无
**返回值 无
********************************************************************/
void Write24C04(unsigned char addr, char dat)
{


  start();
  Write_Byte(0xa4);    //发送写入地址指令
  Write_Byte(addr);   //写入地址
  Write_Byte(dat);   //写入数据
  stop();
}


/********************************************************************
**函数名称 Read24C04
**函数描述 向24C04指定的地址读取一个字节
**传入参数 addr   指定读取的地址
**传出参数 无
**返回值 读取的字节
********************************************************************/
unsigned char Read24C04(unsigned char addr)
{
  unsigned char dat;
  start();
  Write_Byte(0xa4);
  Write_Byte(addr);
  start();
  Write_Byte(0xa5);
  dat = Read_Byte();
  NO_ACK();
  stop();
  return dat;
}


/********************************************************************
**函数名称 I2CWrite
**函数描述 向24C04指定的地址连续地写入一段数据
**传入参数 addr   地址
**           len    写入数据的字节数
**           pda    指向写入数据的
**传出参数 无
**返回值 无
********************************************************************/
void I2CWrite(unsigned char addr, unsigned char len, void  *pda)
{
   unsigned char *p = (unsigned char * )pda;
   char i = 0;
   for(i = 0; i < len; i++)
   {
     Write24C04(addr+i, p[i]);
Delayms(10);
   }
}


/********************************************************************
**函数名称 I2CRead
**函数描述 向24C04指定的地址连续地读取一段数据
**传入参数 addr   地址
**           len    读取数据的字节数
**           pda    存储读取的数据
**传出参数 无
**返回值 无
********************************************************************/
void I2CRead(unsigned char addr, unsigned char len, void  *pda)
{
   unsigned char *p = (unsigned char * )pda;
   char i = 0;
   for(i = 0; i < len; i++)
   {
     p[i] = Read24C04(addr+i);
Delayms(10);
   }
}


void main(void)
{
Write24C04(0x0, 0xA4);


Write24C04(0x0, 0xB0);


while(1) 
{
P0=Read24C04(0x0);


Delayms(1000);
       
   P0=Read24C04(0x0);

Delayms(1000);

}
}
阅读(1811) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~