找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5178|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

高手求幫忙 關(guān)于I2c總線的編程無法實現(xiàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:170144 發(fā)表于 2017-4-10 20:17 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
這是程序代碼   求幫忙 指出錯誤!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay()
{ ; ; }
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
void init()
{
        scl=1;
        sda=1;
}
void start()
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
void respons()
{
        uchar i=0;
        scl=1;
        delay();
        while((sda==1)&&(i<255))
                i++;
        scl=0;
        delay();
}
void delay1(uint xsm)
        {
                uint i,j;
                for(i=xsm;i>0;i--)
                        for(j=110;j>0;j--);
        }
void write_byte(uchar date)
{       
          uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                sda=CY;
                scl=1;
                delay();
                scl=0;
                delay();
               
        }
                scl=0;
                delay();
                sda=1;
                delay();
       
}

uchar read_byte()
{
        uchar i,k;
        for(i=0;i<8;i++)
        {
                k=(k<<1)|sda;
                delay();
                scl=1;
                delay();
                scl=0;
                delay();
               
        }
                delay();
                return k;
               
}
void main()
{        uchar a;
        init();
        start();
        write_byte(0xa0);
        respons();
        write_byte(0xaa);
        respons();
        write_byte(0xaa);
        respons();
        stop();

        delay1(100);
        start();
        write_byte(0xa0);
        respons();
        write_byte(0xaa);
        respons();
        start();
        write_byte(0xa1);
        respons();
        write_byte(0xaa);
        a=read_byte();
        a=P1;
        stop();
        while(1);       
}






另外我想提出一些問題 希望有貴人能幫助我
1  我學(xué)的是郭天祥的書   快一個月了  我每天都花大量時間不比作者花的時間少  但是快一個月了還是只會編一些基礎(chǔ)程序 ,高深的有點(diǎn)不行,我是一名?粕  ,難道這隱約能看出一個人的聰明程度嗎  當(dāng)我堅持不住編了一天的程序時得到的只是這一部分知識點(diǎn)的原因弄明白了,當(dāng)我堅持不下去的時候我都會想起在工廠里的父親,然后給我力量。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

17#
ID:111634 發(fā)表于 2017-4-13 18:25 | 只看該作者
憤怒的小鳥嗷 發(fā)表于 2017-4-13 12:33
樓業(yè)的內(nèi)容實在精辟  讓我受益匪淺  謝謝

僅僅是上傳了一部分,你還得進(jìn)一步學(xué),才能掌握。
回復(fù)

使用道具 舉報

16#
ID:170144 發(fā)表于 2017-4-13 12:33 | 只看該作者
zl2168 發(fā)表于 2017-4-11 22:06
⒈ I2C總線基本信號
I2C總線依靠兩根線(數(shù)據(jù)線SDA和時鐘線SCL)傳送信息,對于虛擬I2C總線,有4個基本 ...

樓業(yè)的內(nèi)容實在精辟  讓我受益匪淺  謝謝
回復(fù)

使用道具 舉報

15#
ID:170144 發(fā)表于 2017-4-13 12:28 | 只看該作者
yzwzfyz 發(fā)表于 2017-4-11 12:23
沙發(fā)說的很對,如果智力不夠(成績不好不等于智力不夠,邏輯思維要好)不要涉及這一行。
做單片機(jī),關(guān)鍵不 ...

我的確想弄 那你能不能給我參考一下 不勝感激
回復(fù)

使用道具 舉報

14#
ID:169626 發(fā)表于 2017-4-11 22:28 | 只看該作者
yzwzfyz 發(fā)表于 2017-4-11 12:23
沙發(fā)說的很對,如果智力不夠(成績不好不等于智力不夠,邏輯思維要好)不要涉及這一行。
做單片機(jī),關(guān)鍵不 ...

這張A4紙可否也給我一張.....
回復(fù)

使用道具 舉報

13#
ID:111634 發(fā)表于 2017-4-11 22:06 | 只看該作者
憤怒的小鳥嗷 發(fā)表于 2017-4-11 12:44
對  但是我感覺按時序?qū)懗鰜砜偸怯袉栴}

⒈ I2C總線基本信號
I2C總線依靠兩根線(數(shù)據(jù)線SDA和時鐘線SCL)傳送信息,對于虛擬I2C總線,有4個基本信號:起始信號S、終止信號P、應(yīng)答信號A和 ,如圖7-26所示。說明如下:
⑴ 起始信號S:如圖7-26a所示,必須在時鐘線SCL高電平時,數(shù)據(jù)線SDA出現(xiàn)從高電平到低電平的變化。即在時鐘線SCL高電平期間,數(shù)據(jù)線SDA出現(xiàn)下降沿,啟動I2C總線傳送數(shù)據(jù)。
⑵ 終止信號P:如圖7-26b所示,必須在時鐘線SCL高電平時,數(shù)據(jù)線SDA出現(xiàn)從低電平到高電平的變化。即在時鐘線SCL高電平期間,數(shù)據(jù)線SDA出現(xiàn)上升沿,停止I2C總線數(shù)據(jù)傳送。
⑶ 應(yīng)答信號分為兩種:A和 。在SCL脈沖高電平時,數(shù)據(jù)線SDA低電平為應(yīng)答信號A,如圖7-26c所示;數(shù)據(jù)線SDA高電平為應(yīng)答信號 ,如圖7-26d所示。兩種信號均在時鐘SCL低電平時刷新,在時鐘SCL高電平時傳送。

需要說明的是,發(fā)送數(shù)據(jù)“0”的時序要求與應(yīng)答A完全相同,發(fā)送數(shù)據(jù)“1”時序要求與應(yīng)答 完全相同。從圖7-26中看出,在時鐘線SCL高電平期間,數(shù)據(jù)線SDA的電平不能變化,否則,將被認(rèn)為是一個起始信號S或終止信號P,引起出錯。因此,若需改變數(shù)據(jù)線SDA的電平,必須先拉低時鐘線SCL電平。

程序就是根據(jù)I2C時序圖編的,例如:


啟動信號通用子程序STAT
void  STAT ( ){                     //啟動信號子函數(shù)STAT
  SCL=0;SDA=1;                  //時鐘線電平期間,改變SDA電平(高電平)
  SCL=1;                               //時鐘線發(fā)出時鐘脈沖
  SDA=0;                              //在時鐘線高電平期間,SDA下跳變(啟動信號規(guī)定動作)
  SCL=0;}                            //SCL電平復(fù)位,與SCL=1組成時鐘脈沖


而你上傳的程序少了一句SCL=0,使得時序出錯。當(dāng)然上述程序少了4us延時,用于proteus仿真沒問題,用于實例最好加4us延時。
⒉ I2C總線數(shù)據(jù)傳送時序
I2C總線數(shù)據(jù)傳送時序如圖7-27所示。說明如下:
⑴ 數(shù)據(jù)傳送以起始位開始,以終止位結(jié)束。
⑵ 每次傳送的字節(jié)數(shù)沒有限制,但要求每傳送一個字節(jié),對方回應(yīng)一個應(yīng)答位。即每幀數(shù)據(jù)9位,前8位是數(shù)據(jù)位,最后一位為應(yīng)答位ACK,傳送數(shù)據(jù)位的順序是從高位到低位。
⑶ 每次傳送的第一個字節(jié)應(yīng)為尋址字節(jié)(包括尋址和數(shù)據(jù)傳送方向)。
一次完整的數(shù)據(jù)傳送過程應(yīng)包括起始S、發(fā)送尋址字節(jié)(SLA  R/ )、應(yīng)答、發(fā)送數(shù)據(jù)、應(yīng)答、…、發(fā)送數(shù)據(jù)、應(yīng)答、終止P。如圖7-27所示。



以上摘自張志良編著《80C51單片機(jī)實用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學(xué)。
關(guān)鍵還是你沒學(xué)好沒理解,沒學(xué)好沒理解的原因可能有多種,其中之一是沒有好教材,沒有便于閱讀理解的教材,有些教材沒講透講細(xì),高職生就更不易理解了。我推薦的書絕不忽悠你,有比較才能有鑒別!


回復(fù)

使用道具 舉報

12#
ID:170144 發(fā)表于 2017-4-11 12:44 | 只看該作者
51Lovers 發(fā)表于 2017-4-10 21:48
I2C使用的關(guān)鍵是時序,按技術(shù)資料的時序?qū)憶]問題,范例中都有,重在調(diào)試。

對  但是我感覺按時序?qū)懗鰜砜偸怯袉栴}
回復(fù)

使用道具 舉報

11#
ID:170144 發(fā)表于 2017-4-11 12:43 | 只看該作者
wosiyabo 發(fā)表于 2017-4-11 03:22
a=read_byte();
        a=P1;
        stop();

多謝幫忙   
回復(fù)

使用道具 舉報

10#
ID:170144 發(fā)表于 2017-4-11 12:42 | 只看該作者

對  是的   
回復(fù)

使用道具 舉報

9#
ID:123289 發(fā)表于 2017-4-11 12:23 | 只看該作者
沙發(fā)說的很對,如果智力不夠(成績不好不等于智力不夠,邏輯思維要好)不要涉及這一行。
做單片機(jī),關(guān)鍵不在寫程序是,而是構(gòu)思如何達(dá)成目的,寫程序按規(guī)則抄抄寫寫即可,而構(gòu)思怎樣的程序結(jié)構(gòu)才能達(dá)成目的,才是關(guān)鍵。
就比如“I2c總線的編程”,寫一下,短短一個小程序就OK了。但在寫之前如何構(gòu)思呢?
如打仗一樣,知彼知已才行,首先必須弄清目標(biāo)的原理。
1、IC2原理是什么?
當(dāng)你弄清原理后,就面臨以下問題:
2、要用到幾根線通訊?
3、你打算用CPU上的哪幾根引腳線?所用的這此線是否方便程序操作?
4、CLK脈沖如何做,頻率如確定,何時給1何時給0,如何操作可以實現(xiàn)?
5、數(shù)據(jù)如何位讀入,如何拼裝成字節(jié),存于何存儲?又如何將字節(jié)分拆成位,如何逐位輸出?
……還有還有,依程序的目的而定。
如果以上都清楚了,寫程序也就不難了。如果有不清楚的地方,說明你還缺某方面的知識,需要補(bǔ)課。

如果樓主立志于單片機(jī),我給你一張A4紙,讀懂、弄清這張A4紙上的內(nèi)容,51單片機(jī)就過關(guān)了。A4紙上濃縮了基本51的精華部分,讀不懂的部分就說明要補(bǔ)課。

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

8#
ID:111634 發(fā)表于 2017-4-11 11:03 | 只看該作者

為什么一定要郭天祥的書?本網(wǎng)不乏質(zhì)疑的帖子,盛名之下其實難符。我給你推薦2本書,書中案例個個能proteus仿真演示,直觀能看,電路與程序真實可靠可信可行,語句條條有注解,便于閱讀理解,便于自學(xué)。
《80C51單片機(jī)實用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,雙解c和匯編程序!80C51單片機(jī)仿真設(shè)計實例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實驗操作。
回復(fù)

使用道具 舉報

7#
ID:187901 發(fā)表于 2017-4-11 09:41 | 只看該作者
買個便宜的邏輯分析儀,照著時序很容易調(diào)試的。  

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:146949 發(fā)表于 2017-4-11 03:22 | 只看該作者
       a=read_byte();
        a=P1;
        stop();
        while(1);        
}
后面那句反了吧,改為P1=a;
宏芯I2C調(diào)試工具
http://www.torrancerestoration.com/bbs/dpj-79714-1.html
(出處: 單片機(jī)論壇)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:187614 發(fā)表于 2017-4-10 21:48 | 只看該作者
I2C使用的關(guān)鍵是時序,按技術(shù)資料的時序?qū)憶]問題,范例中都有,重在調(diào)試。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:151348 發(fā)表于 2017-4-10 21:19 | 只看該作者
這是讀寫AT24吧

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:170144 發(fā)表于 2017-4-10 21:03 | 只看該作者
你像風(fēng)兒來了 發(fā)表于 2017-4-10 20:45
堅持下去你一定能有所突破,老實說大部分人智力都差不多,?粕皇腔A(chǔ)差,因為你基礎(chǔ)不夠,要想寫出優(yōu)秀 ...

受教了,謝謝
回復(fù)

使用道具 舉報

沙發(fā)
ID:148552 發(fā)表于 2017-4-10 20:45 | 只看該作者
堅持下去你一定能有所突破,老實說大部分人智力都差不多,?粕皇腔A(chǔ)差,因為你基礎(chǔ)不夠,要想寫出優(yōu)秀的程序,數(shù)學(xué)一定要好,要有很強(qiáng)的邏輯能力,但是我們就是數(shù)學(xué)不好怎么辦,沒事,有句話叫勤能補(bǔ)拙,多看些算法,多研究別人優(yōu)秀的程序,多思考,單片機(jī)雖然是硬件,但比的還是編程能力,看100個程序不如自己寫1個,加油,你一定可以很優(yōu)秀

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表