⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 本程序能够实现温度测量
💻 C
字号:
/*--------------------------------------------------------
i2c.c file
Creat by Computer-lov Date: 2005.7.19
Last edit date:2005.7.19
Copyright(C) 2005-2015 Computer-lov
All rights reserved
Welcome to my Blog: Http://computer00.21ic.org
-----------------------------------------------------------*/

#include "hardware.h"
#include "I2C.h"

#define delay()
//*****************************************************************************************************
//void delay(void)      //延时子程序
//{
// unsigned char i;
// for(i=0;i<1;i++);
//}
//*****************************************************************************************************


//**************************************   将一个字节写入I2C总线   *****************************************
unsigned char Write_a_data(unsigned char device_addr,unsigned char data_addr,unsigned char w_data) 
{
 unsigned char i,Device_Addr;
 delay();
 SDA=0;                          //产生一个起始位 	
 delay();
 Device_Addr=device_addr;        //地址暂存
 for(i=0;i<7;i++)                //输出设备地址
  { 
   SCL=0;
   delay();
   SDA=device_addr&0x80;         //SDA上输出一位数据,高位在前
   device_addr<<=1;
   delay();
   SCL=1;
   delay();
  }
 SCL=0;
 delay();
 SDA=0;                          //SDA上输出0,表示写操作
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 1;}               //如果设备未响应,则返回出错代码1
 for(i=0;i<8;i++)                //输出数据地址
  {
   SCL=0;
   delay();
   SDA=data_addr&0x80;           //SDA上输出一位数据,高位在前
   data_addr<<=1;       
   delay();
   SCL=1;
   delay();
   delay();
  }  
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 2;}             //如果设备未响应,则返回出错代码2
 for(i=0;i<8;i++)                //输出要写入的数据
  {
   SCL=0;
   delay();
   SDA=w_data&0x80;               //SDA上输出一位数据,高位在前
   w_data<<=1;
   delay();
   SCL=1;
   delay();
  }  
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 3;}               //如果设备未响应,则返回出错代码3
 SCL=0;
 delay();
 SDA=0;
 delay();
 SCL=1;
 delay();
 SDA=1;                         //产生一个停止位,停止操作
 return 0;                      //正确写入,返回0
}
//****************************************************************************************


#define SET_POINT 0xB0   //0xB0命令表示写入地址

//*********************************   从I2C总线中读取一个字节   *****************************
unsigned int Read_a_data(unsigned char device_addr,unsigned char data_addr) 
{
 unsigned char i,r_data;             //,Device_Addr;                          
 Write_a_data(device_addr,SET_POINT,data_addr);
 SDA=0;                         //产生一个起始位 	
 delay();
 for(i=0;i<7;i++)            //输出设备地址,一个7位的地址
  { 
   SCL=0;
   delay();
   SDA=device_addr&0x80;     //SDA上输出一位数据,高位在前
   device_addr<<=1;
   delay();
   SCL=1;
   delay();
  }
 SCL=0;
 delay();
 SDA=1;                     //SDA上输出1,表示读操作
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=1;                     //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA) return 0x0300;    //如果设备未响应,则返回出错代码0x0300
 for(i=0;i<8;i++)          //读出数据
  {
   SCL=0;
   delay();
   r_data<<=1;
   delay();
   SCL=1;
   if(SDA)r_data=r_data|0x01;   //保存一位数据
   delay();
  }  
 SCL=0;
 delay();
 SDA=1;                        //置SDA高电平,表示停止读出
 delay(); 
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=0;
 delay();
 SCL=1;
 delay();
 SDA=1;                         //产生一个停止位,停止读操作
 return r_data;                 //返回数据
}
//****************************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -