📄 iic.c
字号:
#include"reg51.h"
sbit IIC_SDA=P3^7; /*IIC总线SDA引脚定义*/
sbit IIC_SCL=P3^6; /*IIC总线SCL引脚定义*/
#define uchar unsigned char
#define uint unsigned int
#define IC24X_ORDER_WRITE 0xa0 /*AT24C02写指令*/
#define IC24X_ORDER_READ 0xa1 /*AT24C02读指令*/
#define IIC_TLOW 10 /*IIC总线等待时间*/
void IicDelay();
void IicStart();
void IicStop();
void IicAck();
void IicNAck();
void IicWrite(uchar ucData);
uchar IicRead();
void AT24C02WriteByte(uint uiAddr,uchar ucData);
uchar AT24C02ReadByte(uint uiAddr);
/*****************************************************************************
名称: AT24C02WriteByte()
说明: AT24C02写操作
参数: uint uiAddr 地址
uchar ucData 数据
返回: 无
*****************************************************************************/
void AT24C02WriteByte(uint uiAddr,uchar ucData)
{
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicWrite(ucData);
IicAck();
IicStop();
IicDelay();
}
/*****************************************************************************
名称: AT24C02ReadByte()
说明: AT24C02读操作
参数: uint uiAddr 地址
返回: uchar 数据
*****************************************************************************/
uchar AT24C02ReadByte(uint uiAddr)
{
uchar ucData;
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicStart();
IicWrite(IC24X_ORDER_READ);
IicAck();
ucData=IicRead();
IicNAck();
IicStop();
return ucData;
}
/****************************************************************************
说明: IIC总线处理函数
*****************************************************************************/
void IicDelay(void) /*内部涵数*/
{
uchar a;
for(a=0;a<IIC_TLOW;a++);
}
void IicStart(void) /*内部涵数*/
{
IIC_SDA=1;
IicDelay();
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IicDelay();
IIC_SCL=0;
}
void IicStop(void) /*内部涵数*/
{
IIC_SCL=0;
IIC_SDA=0;
IIC_SCL=1;
IIC_SDA=1;
}
void IicAck(void) /*内部涵数*/
{
IIC_SDA=0;
IIC_SCL=1;
IicDelay();
IIC_SCL=0;
IIC_SDA=1;
}
void IicNAck(void) /*内部涵数*/
{
IIC_SDA=1;
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IIC_SCL=0;
}
void IicWrite(uchar ucData) /*内部涵数*/
{
uchar a;
for(a=0;a<8;a++)
{
if(ucData&0x80)
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
IIC_SCL=1;
IIC_SCL=0;
ucData=ucData<<1;
}
}
uchar IicRead(void) /*内部涵数*/
{
uchar a,ucData=0;
for(a=0;a<8;a++)
{
IIC_SDA=1;
IIC_SCL=1;
ucData<<=1;
if(IIC_SDA==1)
{
ucData|=0x01;
}
else
{
ucData&=0xfe;
}
IIC_SCL=0;
}
return ucData;
}
/*********************************************************************/
void delay(uchar j) /*延时*/
{
uchar k,l;
for(l=0;l<=j;l++)
for(k=0;k<=250;k++);
}
/*********************************************************************/
void main(void)
{
//uchar i;
IIC_SDA=1;
IIC_SCL=1;
/*IIC时钟引脚至0*/
AT24C02WriteByte(22,0x99);
delay(80);
/*将dsp数组的数据写入24c02*/
while(1)
{
P0=AT24C02ReadByte(22);
delay(80); /*读出24c02中的数据并送P0口显示*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -