各位前辈,本人现在学习到I2C协议,写出的历程怎么都不能正确运行,用别人成功运行过的历程加上自己的主函数也不行。现将源程序附上,请大家指导,在此谢过了!
#include <reg52.h>
#include<intrins.h>
void delaynop() //5us延时
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit SDA = P3^7;
sbit SCL = P3^6;
uchar r,f,count=0;
uchar l ,m=0x00;
//
//
//
// void delay()
// {;;}
void delay1ms(uint c)
{
uint e;
for(c;c>0;c--)
for(e=300;e>0;e--);
}
/*
void init()
{
SCL=1;
delay();
SDA=1;
delay();
}
void start()
{
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
return;
}
void stop()
{
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
return;
}
void respons()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
void unrespons()
{
uchar i;
delay();
while((SDA==0)&&(i<250))
i++;
SCL=0;
delay();
}
void write_byte(uchar date)
{
uchar i, temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
uchar read_byte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=k<<1;
k=k|SDA;
SCL=0;
delay();
}
delay();
r++;
return k;
}
void write_add(uchar address,uchar date)
{ start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
f++;
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
unrespons();
stop();
return date;
} */ //以上是自己写的
/*****************************************************************/
/* */
/* 初始化函数 */
/* */
/*****************************************************************/
void init()
{
SCL=1;
delaynop();
SDA=1;
delaynop();
}
/*****************************************************************/
/* */
/* 开始信号 */
/* */
/*****************************************************************/
void start()
{
SDA=1;
delaynop();
SCL=1;
delaynop();
SDA=0;
delaynop();
SCL=0;
}
/*****************************************************************/
/* */
/* 停止信号 */
/* */
/*****************************************************************/
void stop()
{
SDA=0;
delaynop();
SCL=1;
delaynop();
SDA=1;
delaynop();
SDA=0;
}
/*****************************************************************/
/* */
/* 应答信号 */
/* */
/*****************************************************************/
uchar reponse()
{
bit ack_bit;
SDA=1;
delaynop();
SCL=1;
delaynop();
ack_bit=SDA;
SCL=0;
return ack_bit;
}
/*****************************************************************/
/* */
/* 写一个字节 */
/* */
/*****************************************************************/
void write_byte(uchar date)
{
uchar i;
SCL=0;
for(i=0;i<8;i++)
{
SDA=(bit)(date&0x80);
_nop_();
SCL=1;
delaynop();
SCL=0;
date<<=1;
}
}
/*****************************************************************/
/* */
/* 读一个字节 */
/* */
/*****************************************************************/
uchar read_byte()
{
uchar i,date;
for(i=0;i<8;i++)
{
SCL=1;
date<<=1;
date=SDA|date;
delaynop();
SCL=0;
delaynop();
}
return date;
}
/*****************************************************************/
/* */
/* 指定地址写数据 */
/* */
/*****************************************************************/
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
reponse();
write_byte(address);
reponse();
write_byte(date);
reponse();
stop();
}
/*****************************************************************/
/* */
/* 指定地址读数据 */
/* */
/*****************************************************************/
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
reponse();
write_byte(address);
reponse();
start();
write_byte(0xa1);
reponse();
date=read_byte();
stop();
return date;
} //这些别人写的,还用成功了,但是用在我的主函数就不行
void main()
{
init();
l=read_add(2);
while(1)
{
l=read_add(2);
P2=0;
P0=table[l];
delay1ms(100);
delay1ms(100);
delay1ms(100);
write_add(2,m);
m=m+1;
count++;
if(count>10)
{
count=0;
m=0;
}
}
}
-
-
历程.c
下载积分: 积分 -1 分
6.49 KB, 下载次数: 3, 下载积分: 积分 -1 分
源程序
一周热门 更多>