久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品国产91久久久久久
|
国产精品一区2区
|
成人午夜精品一区二区三区
|
国产午夜精品一区二区三区四区
|
国产美女视频一区
|
日韩一区二区三区四区五区
|
aaa天堂
|
国产福利91精品
|
亚洲综合大片69999
|
97精品超碰一区二区三区
|
美女福利视频
|
小视频你懂得
|
伊人网站
|
久久99久久久久
|
日韩在线不卡视频
|
91性高湖久久久久久久久_久久99
|
国产精品免费一区二区
|
精品中文字幕在线观看
|
国产午夜精品一区二区三区嫩草
|
伊人久久在线
|
91精品久久久久
|
91久久国产综合久久
|
国产在线观看一区二区三区
|
欧洲一区二区视频
|
久久9久
|
九九久久免费视频
|
91青娱乐在线
|
久久久做
|
国产亚洲欧美另类一区二区三区
|
午夜视频在线
|
91看片在线
|
99精品视频在线
|
高清视频一区二区三区
|
www狠狠干
|
久久久久国产精品一区
|
久久久久久国产精品免费免费男同
|
国产 日韩 欧美 在线
|
精品综合
|
九九av
|
久久久久久久一区二区三区
|
日韩高清www
|