I2C_SCL=0; //时序要求,51单片机速度比较慢
}
}
/**
* @brief I2C主机接收从机一个字节,SCL为同步信号,高电平读数据
* @param 无
* @retval 接收到的一个字节数据
*/
unsigned char I2C_ReceiveByte(void)
{
unsigned char i,Byte=0x00;
I2C_SDA=1; //主机释放数据线SDA
for(i=0;i<8;i++)
{
I2C_SCL=1; //主机作为接收器
if(I2C_SDA) Byte|=(0x80>>i); //读数据
I2C_SCL=0; //从机作为发送器,写数据
}
return Byte;
}
/**
* @brief I2C主机发送应答
* @param AckBit 应答位,0为应答,1为非应答
* @retval 无
*/
void I2C_SendAck(unsigned char AckBit)
{
I2C_SDA=AckBit;
I2C_SCL=1;
I2C_SCL=0;
}
/**
* @brief I2C主机接收应答位
* @param 无
* @retval 接收到的应答位,0为应答,1为非应答
*/
unsigned char I2C_ReceiveAck(void)
{
unsigned char AckBit;
I2C_SDA=1;
I2C_SCL=1;
AckBit=I2C_SDA;
I2C_SCL=0;
return AckBit;
}
#ifndef _i2c_h_
#define _i2c_h_
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(unsigned char Byte);
unsigned char I2C_ReceiveByte(void);
void I2C_SendAck(unsigned char AckBit);
unsigned char I2C_ReceiveAck(void);
#endif
3.6 AT24C02控制函数
#include #include 'i2c.h' #define AT24C02_ADDRESS 0xA0 /** * @brief AT24C02写入一个字节 * @param WordAddress 要写入字节的地址 * @param Data 要写入的数据 * @retval 无 */ void AT24C02_WriteByte(unsigned char WordAddress,Data) { I2C_Start(); I2C_SendByte(AT24C02_ADDRESS); I2C_ReceiveAck(); I2C_SendByte(WordAddress); I2C_ReceiveAck(); I2C_SendByte(Data); I2C_ReceiveAck(); I2C_Stop(); } /** * @brief AT24C02读取一个字节 * @param WordAddress 要读出字节的地址 * @retval 读出的数据 */ unsigned char AT24C02_ReadByte(unsigned char WordAddress) { unsigned char Data; I2C_Start(); I2C_SendByte(AT24C02_ADDRESS); I2C_ReceiveAck(); I2C_SendByte(WordAddress); I2C_ReceiveAck(); I2C_Start(); I2C_SendByte(AT24C02_ADDRESS|0x01); I2C_ReceiveAck(); Data=I2C_ReceiveByte(); I2C_SendAck(1); I2C_Stop(); return Data; } #ifndef _at24c02_h_ #define _at24c02_h_ void AT24C02_WriteByte(unsigned char WordAddress,Data); unsigned char AT24C02_ReadByte(unsigned char WordAddress); #endif 3.7 延时函数 #include void delayms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while(xms--) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } #ifndef _delayms_h_ #define _delayms_h_ delayms(unsigned int xms); #endif
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 NCP59150 的参考设计
- AM1G-2424DH30Z ±24V 1 瓦 DC/DC 转换器的典型应用
- LTC3406ES5-1.8 微型 3.3V/600mA 降压稳压器的典型应用电路
- AT6558R定位模块
- 小尺寸墨水屏驱动板
- 使用 OP297 的 OP297FSZ-REEL 简单桥式条件放大器的典型应用
- 用于汽车照明的 21-LED 通用 LED 驱动器
- AD9714-EBZ,用于 AD9714 双通道、8 位、125 MSPS TxDAC 数模转换器的评估板
- OP284FSZ 运算放大器噪声电路模型的典型应用,用于确定总电路等效输入噪声电压
- 使用 Analog Devices 的 LT1764ET-2.5 的参考设计