STC12C5A60S2单片机IIC例程

i2c.c

#include "config.h"
#include "delay.h"
#include "i2c.h"

//I2C延时5us函数
void I2cDelay_5us(void)
{
	Delay_us(5);
}

//I2C总线起始信号
void I2cStart(void)
{
	SCL = 1;
	SDA = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 0;
	I2cDelay_5us();//状态保持5us
}

//I2C总线停止信号
void I2cStop(void)
{
	SCL = 0;
	SDA = 0;
	SCL = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 1;
	I2cDelay_5us();//状态保持5us
}

/********************************
 *函数名称:ReadACK(void)
 *函数输入:无
 *函数返回:1非应答,0应答
 *函数说明:I2C总线读从机应答信号
 ********************************/
bit ReadACK(void)
{
	uint i;
	
	SCL = 0;//拉低时钟总线,允许从机控制SDA
	SCL = 1;//拉高,读SDA
	I2cDelay_5us();
	while((SDA==1) && (i<250))//等待SDA应答,或者超过时间默认应答
		i++;
	SCL = 0;
	I2cDelay_5us();
	return(0);//返回0应答
}

/***************************************
 *函数名称:SendACK(bit i)
 *函数输入:1主机发送非应答,0发送应答
 *函数返回:无
 *函数说明:主机发送应答信号
 ***************************************/
void SendACK(bit i)
{
	SCL = 0;	//拉低时钟总线,允许主机控制SDA
	if(i)		//发送非应答
		SDA = 1;
	else
		SDA = 0;
	SCL = 1;	//拉高总线,让从机读SDA
	I2cDelay_5us();
	SCL = 0;	//拉低时钟总线,允许SDA释放
	SDA = 1;	//释放数据总线
}

/***************************************
 *函数名称:I2cSendByte(uchar DAT)
 *函数输入:DAT需要发送的数据
 *函数返回:无
 *函数说明:I2C发送一个字节数据
 ***************************************/
void I2cSendByte(uchar DAT)
{
	uchar i;
	for(i=0; i<8; i++)	//分别写8次,每次写1位
	{
		SCL = 0;		//拉低时钟总线,允许SDA变化
		if(DAT & 0x80)	//先写数据最高位
			SDA = 1;  	//写1
		else
			SDA = 0;  	//写0
		SCL = 1;	  	//拉高时钟,让从机读SDA
		DAT <<= 1;	  	//为发送下一位左移1位
	}
	SCL = 0;			//拉低时钟总线,允许SDA释放
	SDA = 1;			//释放数据总线
}

/*====================================
函数	:I2cReadByte()
参数	:无
返回值	:返回读出的一字节数据
描述	:I2C总线读一字节数据
====================================*/
uchar I2cReadByte(void)
{
	uchar i, DAT;
	for(i=0; i<8; i++)//分别读8次,每次读一位
	{
		DAT <<= 1; //数据左移1位,准备接收一位
		SCL = 0;   //拉低时钟总线,允许从机控制SDA变化
		SCL = 1;   //拉高时钟总线,读取SDA上的数据
		if(SDA)
			DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
	}
	return(DAT); //返回读出的数据
}


i2c.h

#ifndef _I2C_H
#define _I2C_H

//I2C模拟硬件接口定义
sbit SCL = P0^6;
sbit SDA = P0^7;

/*I2C常用变量宏定义*/
#define I2cRead 		1			//I2C读方向位
#define I2cWrite 		0			//I2C写方向

//I2C延时5us函数
void I2cDelay_5us(void);

//I2C总线起始信号
void I2cStart(void);

//I2C总线停止信号
void I2cStop(void);

//I2C总线读从机应答信号
bit ReadACK(void);

//主机发送应答信号
void SendACK(bit i);

//I2C发送一个字节数据
void I2cSendByte(uchar DAT);

//I2C总线读一字节数据
uchar I2cReadByte(void);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明n.n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值