我用的STC8a8k单片机,想通过模拟I2C总线来实现EEPROM的读写,可是总感觉没有写进去,读出来用串口接到的总是FF,不管写进去的是什么,我是新手,求大神指点。程序如下:
#include
#include
#define OP_READ 0xa1
#define OP_WRITE 0xa0
sbit SDA = P2^4;
sbit SCL = P2^5;
void ConfigUART(void);
/*延时*/
//void delay1ms()
//{
// unsigned char i,j;
// for(i = 0;i < 10;i++)
// {
// for(j = 0;j < 33;j++);
// }
//}
void delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
/*延时nms*/
void delaynms(unsigned char n)
{
unsigned char i;
for(i = 0;i < n;i++)
{
delay1ms();
}
}
/*******************************************
开始函数
*******************************************/
void start()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/***********************************************************************
停止函数
***********************************************************************/
void stop()
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0;
SCL = 0;
}
/********************************************************************
读数据
********************************************************************/
unsigned char ReadData()
{
unsigned char i;
unsigned char x;
for(i = 0;i < 8;i++)
{
SCL = 1;
x<<=1;
x|=(unsigned char)SDA;
SCL = 0;
}
return(x);
}
/*******************************************************************
写数据
******************************************************************/
bit WriteCurrent(unsigned char y)
{
unsigned char i;
bit ack_bit;
for(i = 0;i < 8;i++)
{
SDA = (bit)(y&0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
y<<=1;
}
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit;
}
/*************************************************************
HHH
***********************************************************/
void WriteSet(unsigned char add,unsigned char dat)
{
start();
WriteCurrent(OP_WRITE);
WriteCurrent(add);
WriteCurrent(dat);
stop();
delaynms(4);
}
unsigned char ReadCurrent()
{
unsigned char x;
start();
WriteCurrent(OP_READ);
x = ReadData();
stop();
return x;
}
unsigned char ReadSet(unsigned char set_addr)
{
start();
WriteCurrent(OP_WRITE);
WriteCurrent(set_addr);
return(ReadCurrent());
}
void main()
{
SDA = 1;
SCL = 1;
WriteSet(0x00,0x0f);
EA = 1; //允许中断
ConfigUART();
SBUF = ReadSet(0x00);
}
void ConfigUART(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 =0xDC;//256-(11059200/12/32)/baud; //设定定时初值
TH1 = TL1; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
ES = 1;
TR1 = 1; //启动定时器1
}
void InterruptUART() interrupt 4
{
if(RI) //检测接收标志位是否为1
{
RI = 0; //为1则清零
SBUF = SBUF ; //数据加1
}
if(TI) //检测发送标志位是否为1
{
TI = 0; //为1清零
}
}
检查脚位对应关系。检查一下时序。最好是示波器,没设备就仿真一下。
bit WriteCurrent(unsigned char y)
{
unsigned char i;
bit ack_bit;
for(i = 0;i < 8;i++)
{
SDA = (bit)(y&0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
y<<=1;
}这一段中是把SDA的数据放入CY移位寄存器中了么