用51单片机模拟I2C接口实例
扫描二维码
随时随地手机看文章
电路原理图
EEPROM为ATMEL公司的AT24C01A。单片机为ATMEL公司的AT89C51。
软件说明
C语言为Franklin C V3.2。将源程序另存为testi2c.c,用命令
C51 testi2c.c
L51 TESTI2C.OBJ
OHS51 TESTI2C
编译,连接,得到TESTI2C.HEX文件,即可由编程器读入并进行写片,实验。
3.源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineAddWr0xa0/*器件地址选择及写标志*/
#defineAddRd0xa1/*器件地址选择及读标志*/
#defineHidden0x0e/*显示器的消隐码*/
/*有关全局变量*/
sbitSda=P3^7;/*串行数据*/
sbitScl=P3^6;/*串行时钟*/
sbitWP=P3^5;/*硬件写保护*/
voidmDelay(ucharj)
{
uinti;
for(;j>0;j--)
{
for(i=0;i<125;i--)
{
;
}
}
}
/*发送起始条件*/
voidStart(void)/*起始条件*/
{
Sda=1;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
voidStop(void)/*停止条件*/
{
Sda=0;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
voidAck(void)/*应答位*/
{
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=0;
}
voidNoAck(void)/*反向应答位*/
{
Sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=0;
}
voidSend(ucharData)/*发送数据子程序,Data为要求发送的数据*/
{
ucharBitCounter=8;/*位数控制*/
uchartemp;/*中间变量控制*/
do
{
temp=Data;
Scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
if((temp&0x80)==0x80)/*如果最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;/*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
ucharRead(void)/*读一个字节的数据,并返回该字节值*/
{
uchartemp=0;
uchartemp1=0;
ucharBitCounter=8;
Sda=1;
do{
Scl=0;
_