标题:
自己用的1T单片机AT24C02库 支持STC12C5A60S2等芯片
[打印本页]
作者:
sxhwdz
时间:
2018-10-2 20:48
标题:
自己用的1T单片机AT24C02库 支持STC12C5A60S2等芯片
自己一直使用的I2C库,可供参考。
单片机源程序如下:
#include <INTRINS.H>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define slaw 0xa0
#define slar 0xa1
sbit sclb = P3^0;
sbit sdab = P3^1;
/**************************************
延时5微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5us()
{
BYTE n = 4;
while (n--)
{
_nop_();
_nop_();
}
}
//-----------------------
// 发出 START 1->0
void IICstart(void)
{
sdab=1;
sclb=1; Delay5us();
sdab=0; Delay5us();
sclb=0;
Delay5us(); //延时
}
//-----------------------
// 发出 STOP 0->1
void IICstop(void)
{
sdab=0;
sclb=1; Delay5us();
sdab=1; Delay5us();
sclb=0;
Delay5us(); //延时
}
//-----------------------
// 发出 应答位 0
void mack(void)
{
sdab=0;
sclb=1; Delay5us(); sclb=0;
sdab=1;
Delay5us(); //延时
}
//-----------------------
// 发出 非应答位 1
void mnack(void)
{
sdab=1;
sclb=1; Delay5us(); sclb=0;
sdab=0;
Delay5us(); //延时
}
//-----------------------
// 向 SDA 写一个字节
bit wrbyt(BYTE out_b)
{
BYTE data i;
bit bdata sack;
ACC=out_b;
for(i=8;i>0;i--)
{
ACC = ACC<<1; sdab=CY;
sclb=1; Delay5us(); sclb=0;
Delay5us(); //延时
}
sdab=1;
sclb=1;
Delay5us(); //延时
sack=sdab; //收应答
sclb=0;
Delay5us(); //延时
return sack; //返回应答
}
//-----------------------
// 从 SDA 读取一个字节
sbit ACC_bit0= ACC^0;
BYTE rdbyt(void)
{
BYTE data i;
sdab=1;
ACC=0;
for(i=8;i>0;i--)
{
ACC=ACC<<1;
sclb=1; Delay5us();
ACC_bit0=sdab;
sclb=0;
Delay5us(); //延时
}
return ACC;
}
//-----------------------
// 发送 numbyt 字节
void wrnbyt(BYTE iic_add, BYTE numbyt, BYTE xdata *data_add) reentrant
{
BYTE i;
for(i=100;i>0;i--)
{
IICstart();
if(!wrbyt(slaw)) // 发送 SLAW 字节
break;
} // return 0;
wrbyt(iic_add); // 发送 地址
for( ; numbyt>0; numbyt--)
{
wrbyt(*data_add++); // 发送
}
IICstop();
}
//-----------------------
// 读取 numbyt 字节
void rdnbyt(BYTE iic_add, BYTE numbyt, BYTE idata *data_add) reentrant
{
BYTE i;
for(i=100;i>0;i--)
{
IICstart();
if(!wrbyt(slaw)) // 发送 SLAW 字节
break;
} // return 0;
wrbyt(iic_add); // 发送 地址
IICstart();
wrbyt(slar); // 发送 SLAr 字节
for(; numbyt>0; numbyt--)
{
*data_add++=rdbyt();
if(numbyt>0)
mack();
}
mnack();
IICstop();
}
复制代码
所有资料51hei提供下载:
AT24C02.rar
(972 Bytes, 下载次数: 37)
2018-10-2 20:45 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
路LGY
时间:
2020-5-17 11:17
想问一下最后两个函数的参数该怎么写呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1