欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
I2C通訊軟件模擬 老是報錯
[打印本頁]
作者:
李博文
時間:
2018-7-22 19:51
標題:
I2C通訊軟件模擬 老是報錯
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AT24C02_ADDR 0xa0;
/*I2C IO口定義*/
sbit SDA = P2^0;
sbit SCL = P2^1;
/*5us延時*/
void delay_5us()
{
_nop_();
}
/*1ms延時*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x-- )
for(y = 114; y > 0; y-- )
;
}
/*I2C初始化*/
void I2C_init()
{
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
/*I2C開始信號*/
void I2C_Start()
{
SCL = 1;
_nop_();
SDA = 1;
delay_5us();
SDA = 0;
delay_5us();
}
/*I2C停止信號*/
void I2C_Stop()
{
SDA = 0;
_nop_();
SCL = 1;
delay_5us();
SDA = 1;
delay_5us();
}
/*主機發送應答*/
void Master_ACK(bit i) //bit i 控制應答或者非應答
{
SCL = 0;
_nop_();
if(i)
{
SDA = 0;
}
else
{
SDA = 1;
}
_nop_();
SCL = 1;
delay_5us();
SCL = 0;
_nop_();
SDA = 1;
_nop_();
}
/*檢測從機應答*/
bit Test_ACK()
{
SCL = 1;
delay_5us();
if(SDA)
{
SCL = 0;
_nop_();
I2C_Stop();
return(0);//從機無應答返回0
}
else
{
SCL = 0;
_nop_();
return(1);//從機應答返回1
}
}
/*發送一個字節*/
void I2C_send_byte(uchar byte)
{
uchar i;
for(i = 0; i < 8; i++)
{
SCL = 0;
_nop_();
if(byte & 0x80)//表達式成立 說明byte最高位為1
{
SDA = 1;
_nop_();
}
else
{
SDA = 0;
_nop_();
}
SCL = 1;
_nop_();
byte <<= 1;
}
SCL = 0;//拉低時鐘總線 允許從機的應答信號
_nop_();
SDA = 1;//主機釋放數據總線 讓從機控制
_nop_();
}
/*接收一個字節*/
uchar I2C_read_byte()
{
uchar dat,i;
SCL = 0;//拉低時鐘總線 允許從機控制SDA
_nop_();
SDA = 1;//釋放數據總線
_nop_();
for (i = 0 ; i < 8 ; i++)
{
SCL = 1;//拉高時鐘總線 允許主機讀數據
_nop_();
if(SDA)
{
dat |= 0x01;
}
else
{
dat &= 0xfe;
}
_nop_();
SCL = 0;//允許主機發送應答
_nop_();
if(i < 7)
{
dat =dat << 1;
}
}
return(dat);
}
/*I2C發送數據*/
bit I2C_TransmitData(uchar ADDR,DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(ADDR);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(DAT);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_Stop();
return(1);//傳送完成
}
/*I2C接收數據*/
uchar I2C_ReceiveData(uchar ADDR)
{
uchar DAT;
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(ADDR);
if(!Test_ACK())
{
return(0);//停止傳送
}
Master_ACK(0); //主機非應答
I2C_Start();
I2C_send_byte(AT24C02_ADDR+1);
if(!Test_ACK())
{
return(0);//停止傳送
}
DAT = I2C_read_byte();
Master_ACK(0);
I2C_Stop();
return(DAT);
}
void main()
{
I2C_init();
if(!I2c_TransmitDATA(255,0xfe))
{
P1 = 0;//數據傳送失敗
}
delay(5);
P1 = I2C_ReceiveData(255);
while(1);
}
復制代碼
作者:
wulin
時間:
2018-7-23 06:29
1. #define AT24C02_ADDR 0xa0; 多了一個分號。
2. bit I2C_TransmitData(uchar ADDR,DAT) 與 if(!I2c_TransmitDATA(255,0xfe)) 的函數名大小寫不一致。
作者:
李博文
時間:
2018-7-23 07:53
大佬 是怎么發現的 我怎么發現不了
作者:
609763691
時間:
2018-7-28 10:22
你的bit I2C_TransmitData(uchar ADDR,DAT)這個函數DAT不能直接寫,加了分號之后還需要加uchar,應該寫成bit I2C_TransmitData(uchar ADDR,uchar DAT)
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1