欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機+iic仿真的困惑
[打印本頁]
作者:
創造生活
時間:
2021-10-31 11:20
標題:
單片機+iic仿真的困惑
各位大神大家好,誰有時間幫我解答一下這個問題,我寫了一個iic的小程序,可為什仿真時iic監視器顯示有數據,而芯片AT24C02C的存儲器里顯示的全是FF,我程序在18號地址寫的是20,是程序的事嗎
#include<STC12C5A60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define ui unsigned int
sbit sda=P2^1;
sbit scl=P2^0;
uchar c=20;
void delay7us() // 延時函數
{
unsigned char a;
for(a=2;a>0;a--);
}
void init()
{sda=1;
delay7us();
scl=1;
delay7us();
}
/*啟動信號函數*/
void start() //啟動信號函數
{ scl=1;
sda=1;
delay7us();
sda=0;
delay7us();
}
/*寫一個字節的函數*/
void write_iic_byte(uchar dat)
{ uchar i;
scl=0; /*主機拉低為的是SDA數據線
可以發生變化并為SDA拉高,讓
接受設備接收數據做準備*/
/*發送八位數據*/
for(i=0;i<8;i++)
{ if(dat&0X80)
sda=1;/*主機將數據1存入SDA*/
else
sda=0;/*主機將數據0存入SDA
,也可認為是存入一個
存儲器*/
scl=1; /*主機將時鐘數據線拉高*/
delay7us(); /*延時接收設備在此期間
自動取走*/
dat=dat<<1;/* 數據左移一位,次高位
變成發送數據位*/
scl=0;/*時鐘線拉低為更改發送數據
位做準備,只有其為低數據線
上的數據才會發生改變。*/
}
sda=1;/*釋放數據線*/
}
/*讀一個字節的函數*/
uchar read_iic_byte()
{ uchar i,v;/*暫時為空變量,8次后
存儲要保存的數據*/
sda=1;/*主機釋放數據線,這數據
狀態以后有發送設備決定*/
scl=0;/*主機將時鐘信號線拉低,
/*SDA線上的數據才會改變*/
/*從設備發送八位數據*/
for(i=0;i<8;i++)
{ v=v<<1; /*第一次循環無意義,以后
發送用*/
scl=1; /*以后發送期間數據穩定*/
delay7us();/*延時使主機有時間取走
數據*/
if(sda) /*SDA發送從設備里最高位數據
1,第一次循環從此發送第一
位數據*/
v=v|0X01;/*把1傳入變量V的最低位*/
scl=0; /*時鐘線拉低發送數據由發送
設備自動改變*/
delay7us();/*延時使時鐘線可靠拉低
,有充足時間數據被讀走
*/
}
return v; /*被讀的數據存在V中,
作為返回值/*返回*/
}
void stop()//停止信號函數
{scl=1;
sda=0;
delay7us();
sda=1;
delay7us();
}
/*產生和檢測應答信號 */
uchar ack()
{uchar i;
scl=0;
sda=0;
delay7us();
scl=1;
delay7us();
while(sda==1)
{ i++;
if(i>260)
{
stop();
return 1;
}
}
return 0;
}
/* 產生非應答信號*/
void noack()
{scl=0;
sda=1;
delay7us();
scl=1;
delay7us();
scl=0;
}
void main()
{ do
{init();
start();
write_iic_byte(0XA0);
ack();
write_iic_byte(0X18);
ack();
write_iic_byte(c);
ack();
stop();
delay7us();
}
while(0);
while(1);
}
復制代碼
IMG_20211031_110437.jpg
(632.98 KB, 下載次數: 39)
下載附件
2021-10-31 11:20 上傳
作者:
創造生活
時間:
2021-10-31 11:24
#include<STC12C5A60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define ui unsigned int
sbit sda=P2^1;
sbit scl=P2^0;
uchar c=20;
void delay7us() // 延時函數
{
unsigned char a;
for(a=2;a>0;a--);
}
void init()
{sda=1;
delay7us();
scl=1;
delay7us();
}
/*啟動信號函數*/
void start() //啟動信號函數
{ scl=1;
sda=1;
delay7us();
sda=0;
delay7us();
}
/*寫一個字節的函數*/
void write_iic_byte(uchar dat)
{ uchar i;
scl=0; /*主機拉低為的是SDA數據線
可以發生變化并為SDA拉高,讓
接受設備接收數據做準備*/
/*發送八位數據*/
for(i=0;i<8;i++)
{ if(dat&0X80)
sda=1;/*主機將數據1存入SDA*/
else
sda=0;/*主機將數據0存入SDA
,也可認為是存入一個
存儲器*/
scl=1; /*主機將時鐘數據線拉高*/
delay7us(); /*延時接收設備在此期間
自動取走*/
dat=dat<<1;/* 數據左移一位,次高位
變成發送數據位*/
scl=0;/*時鐘線拉低為更改發送數據
位做準備,只有其為低數據線
上的數據才會發生改變。*/
}
sda=1;/*釋放數據線*/
}
/*讀一個字節的函數*/
uchar read_iic_byte()
{ uchar i,v;/*暫時為空變量,8次后
存儲要保存的數據*/
sda=1;/*主機釋放數據線,這數據
狀態以后有發送設備決定*/
scl=0;/*主機將時鐘信號線拉低,
/*SDA線上的數據才會改變*/
/*從設備發送八位數據*/
for(i=0;i<8;i++)
{ v=v<<1; /*第一次循環無意義,以后
發送用*/
scl=1; /*以后發送期間數據穩定*/
delay7us();/*延時使主機有時間取走
數據*/
if(sda) /*SDA發送從設備里最高位數據
1,第一次循環從此發送第一
位數據*/
v=v|0X01;/*把1傳入變量V的最低位*/
scl=0; /*時鐘線拉低發送數據由發送
設備自動改變*/
delay7us();/*延時使時鐘線可靠拉低
,有充足時間數據被讀走
*/
}
return v; /*被讀的數據存在V中,
作為返回值/*返回*/
}
void stop()//停止信號函數
{scl=1;
sda=0;
delay7us();
sda=1;
delay7us();
}
/*產生和檢測應答信號 */
uchar ack()
{uchar i;
scl=0;
sda=0;
delay7us();
scl=1;
delay7us();
while(sda==1)
{ i++;
if(i>260)
{
stop();
return 1;
}
}
return 0;
}
/* 產生非應答信號*/
void noack()
{scl=0;
sda=1;
delay7us();
scl=1;
delay7us();
scl=0;
}
void main()
{
{init();
start();
write_iic_byte(0XA0);
ack();
write_iic_byte(0X18);
ack();
write_iic_byte(c);
ack();
stop();
delay7us();
}
while(1);
}
復制代碼
作者:
wxxl
時間:
2021-10-31 20:39
我們都是延時5US,不知道7US會不會影響,手冊上是4.7和4US
作者:
Y_G_G
時間:
2021-10-31 21:17
你的應答是錯誤的,SDA=1才是對的,這叫釋放SDA端口
SDA=0了就無法檢測電平狀態了
有電腦,有開發板,不是復雜運算,仿真沒有用,仿真要用在真正需要的地方IIC寫入字節是可以很簡單的,不需要那么復雜
void Write_Byte(unsigned char Byte) //寫入器件的應答信號由從機給出
{
unsigned char i;
unsigned int k;
SCL=0;
Delay();
for(i=0;i<8;i++)
{
if(Byte&0x80)SDA=1;
else SDA=0;
Delay();
SCL=1;
Delay();
SCL=0;
Byte<<=1;
}
SCL=1; //給出一個上升沿,用于產生應答信號
Delay();
SDA=1;
while((SDA==1)&(k<1000)) //超時就不再等待應答
{
k++;
Delay();
} //等待SDA出現低電平,出現低電平就表示器件已經應答
SCL=0;
}
作者:
TTQ001
時間:
2021-11-1 08:21
向I2C總線寫入一個字節時,在FOR循環中,每次左移一位,將SCL設置為高電平,必須延遲7微秒,然后將SCL拉低。 并重復下一個數位。
作者:
創造生活
時間:
2021-11-1 17:31
多謝大師們指教
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1