1. 51單片機操作24c08,IIC應答時,以下程序怎樣反應出來是為0和為1呢
這是程序設計者偷懶的結果,因為大多數正常情況下不會出現應答為1的情況。程序沒有寫出錯處理,出錯處理也就是把結果向上一級函數返回,IIC_single_byte_write定義為 bit型,返回IIC_Tack的值。
正常情況下 程序設計合理,電路器件正常,基本不會出錯。程序設計不合理調試不會通過,電路器件不正常,程序也沒辦法,只是知道錯了而已。解決不了問題,所以很多時候程序員都會捨去這部分出錯處理程序。
2. 單片機 iic 應答信號程序中有一句 while((sda==1)&&(i<250))i++ 我想知道 為什麼i<250,250這個數字從哪
首先這段程序是一個等待ACK的程序
先看一下IIC規范是怎麼說的:
IIC匯流排上的所有數據都是以8位位元組傳送的,發送端每發送一個位元組,就在第9個時鍾脈沖期間釋放數據線,由接收端反饋一個應答信號。對於有效應答信號ACK的要求是,接收方在第9個時鍾脈沖之前的低電平期間將SDA線拉低,並且確保在該時鍾的高電平期間為穩定的低電平。
好了,現在針對你的程序進行解讀:
注意這句「接收方在第9個時鍾脈沖之前的低電平期間將SDA線拉低,並且確保在該時鍾的高電平期間為穩定的低電平」,程序中首先設置了SCL=1,然後開始等待,如果sda一直為1且i<250(可以根據情況酌情設定,一般設置為250),則說明沒有應答信號到來(sda=1)且未超時(i<250),那麼繼續等待ACK。如果sda一直deng一直為1,則說明一直沒有應答信號,那麼等待250次就不再等待了(不可能一直等待下去),如果等到sda=0,說明等到了應答信號,則將scl至0。scl從1到0的變化就是為了產生第9個時鍾脈沖。
只是我覺得你是初學者吧,說太簡略了你肯定不懂,我當初也是這樣的,好好用功吧.
3. I2C 單片機程序 在檢測從機應答的時候,SDA是什麼時候變化的
這個I2C的協議決定的。當你發送完數據之後,將SCL(時鍾線)和SDA(數據線)同時置高,等待應答信號,應答信號就會將SDA的電平變低,從而實現應答的效果。你記住一點就是I2C是兩個設備之間的通信,將兩個線置高的是主設備,然後等待從設備將SDA數據線拉低,主設備檢測到SDA線拉低,就說明從設備應答了。從而實現兩者之間的通信
4. I2C的應答子程序如何使用,單片機從外部器件讀取數據後,該怎麼進行應答操作,這個子程序是否要返回值
void respons()
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
SCL在高電平期間,SDA被從設備拉低標示應答。
while((SDA==1)&&(i<255))標示若一定時間內沒收到應答,則默認收到,不再等待,以免從設備無應答時程序永遠停在這里。
5. C51單片機模擬IIC匯流排,應答函數的疑問
應答是接收設別自動產生的,不一定是從機。在IIC上除了開始,停止和重復開始外,所有數據都在在時鍾的低電平變化的,也就是為高後,數據就應該穩定了。所以如果是模擬匯流排,應先有下降沿,再設為輸入,然後讀ACK,如果是從機的應答,是自動產生的,是作為數據通信正確的判斷標志,為了可靠,是要判斷的。主機的應答一般是程序控制的,如果要結束匯流排,可以給也可以不給應答;如果要繼續讀數據,就必須給出應答。
6. 向大神求助,有沒有C語言的基於485的51單片機的主從應答的程序啊,就是主機向各個從機發送地址碼要求應答
這個問題很簡單,用485通訊的話,思路如下
思路:
PC方面:可以用MSCOMM控制項先發一個字元表示接收地址,後延遲1ms,(注意PC端在485通訊在字元發送過程中一定要加延遲,這是我多次測試的總結,如果是用調試助手的話,他內部代碼已經加過延遲了,就不必考慮這個問題)再發控制指令,初學者建議直接用調試助手
單片機方面:首先對接收數據進行核對,如果不是本地地址,放棄,如果是本地地址,在檢測命令是否正確,如果正確,做出處理後返回PC本地地址並發送命令
我舉個例子教你怎麼玩多站通訊,下面是我已經通過測試的一個程序
#include <reg51.h> //選用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存數據
#define AddressID 0x31 //本機地址1
sbit RS485E=P3^7; //定義485的使能腳// RS5485E=0為接收狀態 RS5485E=1為發送狀態
sbit MAX485_DIR=P3^7;
main()
{
//****************通訊設置
SCON = 0xF0; //REN=1允許串列接受狀態,串口工作模式3,SM2=1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口優先順序高
// TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、數據位8、停止位1。效驗位無 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //開啟定時器1
EA = 1; // 開總中斷
ES = 1; //開串口中斷
RS485E=0; // RS5485E=0為接收狀態 RS5485E=1為發送狀態
while(1);
}
void counter4(void) interrupt 4 using 2 //串口中斷
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //發送指令
{
MAX485_DIR=1; //開發送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //發送o
while(TI==0);
TI=0;
SBUF=0x6b; //發送k
MAX485_DIR=0; //開接收
}
if(SBUF==0x00) //接收
{
//這里怎麼處理就看你自己要怎麼做了,你沒要求,我也不好怎麼寫,就自己寫吧
}
}
}
程序調試通過,可以直接套用
7. 51單片機軟體實現iic通信的應答程序
呵呵不知道你是從哪裡看的?這個應答是肯定有用的。在進行寫操作的時候,一定需要檢測應答信號來判斷是否寫入有效?在進行讀的時候,也要發送應答信號繼續和非應答信號停止讀寫。
8. 在單片機中IIC中如果沒有應答信號單片機如何處理
IIC匯流排是每發送一個位元組(8位)數據後,從動設備將主動將SDA引腳拉低,表示數據正常。
如果沒有拉低,說明在發送過程中出現了匯流排時序錯誤,可能會導致意外情況,那麼為了將這種意外降到最低,當沒有應答信號時,應採取以下措施:
1.
數據重新發送,以覆蓋原來的錯誤
2.
設置合理的超時時間,以在超時後允許系統重發。
3.
對於重要數據,比如需要保存的系統參數,在無應答信號時,需要將數據讀回進行校驗,防止出現寫錯誤。
9. 單片機模擬i2c協議讀寫2408,為什麼主程序中只檢測應答並沒有對返回的應答值進行處理。
這個是程序偷懶的方法,就算主程序給2408的應答時,2408也沒有要求重發的指令,2408隻是個接受體,即使命令錯誤了它也沒有辦法。如果是兩個單片機之間I2C就必須有ACK了。