用c语言 编写51 和 24c02 ~24c256 通讯 代码 要求中文注释
时间: 2024-05-15 13:12:24 浏览: 87
基于51单片机24C02代码.rar_;24c02_;i2c_C51
以下是C语言编写的51和24C02~24C256通讯代码,已加入中文注释:
```c
#include <reg52.h> // 51单片机的头文件
#include <intrins.h> // 延时函数头文件
sbit SDA = P1^0; // 定义SDA引脚
sbit SCL = P1^1; // 定义SCL引脚
void IIC_Start() // IIC起始信号函数
{
SDA = 1; // SDA和SCL都先拉高电平
SCL = 1;
_nop_(); // 延时
_nop_();
_nop_();
_nop_();
SDA = 0; // SDA下降沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; // SCL下降沿
}
void IIC_Stop() // IIC停止信号函数
{
SDA = 0; // SDA和SCL都先拉低电平
SCL = 1;
_nop_(); // 延时
_nop_();
_nop_();
_nop_();
SDA = 1; // SDA上升沿
_nop_();
_nop_();
_nop_();
_nop_();
}
void IIC_SendByte(unsigned char dat) // IIC发送一个字节函数
{
unsigned char i;
for(i=0;i<8;i++) // 先发送高位
{
if(dat & 0x80) SDA = 1; // 判断当前位是1还是0
else SDA = 0;
dat <<= 1; // 左移一位,将下一位移动到高位
_nop_(); // 延时
_nop_();
_nop_();
_nop_();
SCL = 1; // SCL上升沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; // SCL下降沿
}
}
unsigned char IIC_ReceiveByte() // IIC接收一个字节函数
{
unsigned char i,receive = 0;
for(i=0;i<8;i++)
{
receive <<= 1; // 左移一位,为下一位腾出位置
SCL = 1; // SCL上升沿
_nop_();
_nop_();
_nop_();
_nop_();
if(SDA) receive++; // 判断当前位是1还是0
SCL = 0; // SCL下降沿
_nop_();
_nop_();
_nop_();
_nop_();
}
return receive;
}
unsigned char IIC_WaitAck() // 等待从设备应答函数
{
unsigned char re;
SDA = 1; // SDA和SCL都先拉高电平
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
if(SDA) re = 1; // 判断是否有应答信号
else re = 0;
SCL = 0; // SCL下降沿
_nop_();
_nop_();
_nop_();
_nop_();
return re;
}
void IIC_Ack() // 发送应答信号函数
{
SDA = 0; // SDA下降沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; // SCL上升沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; // SCL下降沿
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; // SDA上升沿
}
void IIC_NoAck() // 发送非应答信号函数
{
SDA = 1; // SDA上升沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; // SCL上升沿
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; // SCL下降沿
_nop_();
_nop_();
_nop_();
_nop_();
}
void IIC_Write(unsigned char addr, unsigned char dat) // IIC写函数
{
IIC_Start(); // 先发送起始信号
IIC_SendByte(0xa0); // 发送写命令
IIC_WaitAck(); // 等待应答信号
IIC_SendByte(addr); // 发送地址
IIC_WaitAck(); // 等待应答信号
IIC_SendByte(dat); // 发送数据
IIC_WaitAck(); // 等待应答信号
IIC_Stop(); // 发送停止信号
}
unsigned char IIC_Read(unsigned char addr) // IIC读函数
{
unsigned char dat;
IIC_Start(); // 先发送起始信号
IIC_SendByte(0xa0); // 发送写命令
IIC_WaitAck(); // 等待应答信号
IIC_SendByte(addr); // 发送地址
IIC_WaitAck(); // 等待应答信号
IIC_Start(); // 发送起始信号
IIC_SendByte(0xa1); // 发送读命令
IIC_WaitAck(); // 等待应答信号
dat = IIC_ReceiveByte(); // 读取数据
IIC_NoAck(); // 发送非应答信号
IIC_Stop(); // 发送停止信号
return dat;
}
```
以上代码中,SDA和SCL引脚需要根据实际连接电路进行修改,具体使用时可结合24C02~24C256的数据手册进行使用。
阅读全文