




免費(fèi)預(yù)覽已結(jié)束,剩余11頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
I2C總線入門1) 最近學(xué)習(xí)51單片機(jī),學(xué)到A/D,D/A轉(zhuǎn)換的時(shí)候發(fā)現(xiàn)我板子上的轉(zhuǎn)換芯片不是書上所講的ADC0804和DAC0832而是PCF8591T,看了一下它的數(shù)據(jù)手冊,發(fā)現(xiàn)它并不是書上所說的并行傳輸數(shù)據(jù),是使用 I2C 總線傳輸?shù)?。搞了兩天才搞懂,寫出來給大家分享一下,不足之處請務(wù)必不吝指出。以上是I2C總線的簡單介紹。就比如說AT24C02存儲芯片,和PCF8591數(shù)模模數(shù)轉(zhuǎn)換芯片都支持I2C端口。(如下圖) 2) 接下來看如何使用I2C總線進(jìn)行通信以上是I2C總線通信的格式。由上圖可以看出進(jìn)行通信需要以下幾個(gè)步驟a.初始化I2C總線就是把SDA和SCL都變成高電平。void init()/初始化SDA=1;delay();SCL=1;delay();delay()為延時(shí)函數(shù)void delay()/延時(shí)4-5個(gè)微秒;b.發(fā)送起始信號就是保持SCL為高電平,而SDA從高電平降為低電平(這是I2C總線的規(guī)定,別問我為什么)void start()/起始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();c.發(fā)送地址字(芯片的硬件地址)(8591的數(shù)據(jù)手冊) 前四位對同一種芯片來說是固定的,不同的芯片之間不同。就像pcf8591是1001而at24c02是1010 接下來三位A0,A1,A2是可編程的三個(gè)地址位,這里說說的編程并不是通過軟件編程,而是把A0,A1,A2三個(gè)引腳接不同的電壓來確定數(shù)值。接VCC表示1,接GND表示0。為什么要有這三個(gè)呢?因?yàn)橛锌赡苣阍贗2C總線上“并聯(lián)”了不止一個(gè)相同的元件(比如說接了三個(gè)8591),那你如何來分辨你要操作的是哪一個(gè)芯片呢,就是通過設(shè)置A0,A1,A2的數(shù)值,來區(qū)別。可編程的地址一個(gè)有三位,也就是說最多可以接8個(gè)相同的芯片在同一個(gè)I2C總線上。 最后一位是 讀/寫 位,1為讀,0為寫。如何寫數(shù)據(jù)寫數(shù)據(jù)只需要按照時(shí)序圖1.先將SCL置0(只有它為0的時(shí)候SDA才允許變化)2.改變SDA是數(shù)值(就是你當(dāng)前要穿的一位是0還是1)3.把SCL置1(此時(shí)芯片就會讀取總線上的數(shù)據(jù))下面是代碼#define uchar unsigned char#define uint unsigned intvoid write_byte(uchar date)/寫一字節(jié)數(shù)據(jù)uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;/左移一位 移出的一位在CY中SCL=0;/只有在scl=0時(shí)sda能變化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();發(fā)送地址的時(shí)候只需把地址傳給該函數(shù)即可。 d.應(yīng)答(ACK) 每接受或發(fā)送一字節(jié)數(shù)據(jù)后都需要發(fā)送一位應(yīng)答,來表是否收到了前面一個(gè)字節(jié)的數(shù)據(jù)。void respons()/應(yīng)答 相當(dāng)于一個(gè)智能的延時(shí)函數(shù)uchar i;SCL=1;delay();while(SDA=1)&(i250)/沒收到應(yīng)答,我等!i+;/等了250次沒收到就不管他了,就當(dāng)他收到了-_- /其實(shí)沒收到的話可以結(jié)束程序的SCL=0;delay();e.發(fā)送/接受數(shù)據(jù)(取決于前面地址字的最后一位讀/寫位)發(fā)送數(shù)據(jù)和上面的發(fā)送地址調(diào)用同一個(gè)函數(shù),只要穿給他數(shù)據(jù)即可。 接收數(shù)據(jù)其實(shí)和發(fā)送數(shù)據(jù)差不多,只不過要把接收到的數(shù)據(jù)一位一位拼裝成一字節(jié)數(shù)據(jù),看代碼uchar read_byte()uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i8;i+)SCL=1;delay();k=(k1)|SDA;/先左移一位,再在最低位接受當(dāng)前位SCL=0;delay();return k;f.應(yīng)答g.如此循環(huán),直到數(shù)據(jù)一個(gè)字一個(gè)字的發(fā)完h.發(fā)送終止信號 就是SCL在高電平的時(shí)候SDA由低電平變成高電平void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();以上就是整個(gè)數(shù)據(jù)傳輸?shù)倪^程了 為了更好的掌握I2C總線我在此放兩個(gè)例子,一個(gè)是書上(郭天祥的,你們懂的)EPROM存儲定時(shí)時(shí)間的例子,還有就是用PCF8591進(jìn)行D/A轉(zhuǎn)換的例子。1.EPROM存儲定時(shí)時(shí)間/JP10(P0)接JP12/我發(fā)現(xiàn)數(shù)據(jù)手冊(電路圖pdf)上錯(cuò)了 SCL連的是P21 而SDA連的P20/程序功能:在數(shù)碼管上顯示數(shù)字,每隔1s增加1/ 但是每次復(fù)位或者掉電程序都會把當(dāng)前數(shù)值存儲到AT24C02中,并在下次啟動時(shí)讀取#include #define uchar unsigned char#define uint unsigned intbit write=0;/寫24c02的標(biāo)志sbit SCL=P21; /串行時(shí)鐘輸入端sbit SDA=P20; /串行數(shù)據(jù)輸入端sbit LS138A=P22;/138譯碼器的3位 控制數(shù)碼管的 sbit LS138B=P23;sbit LS138C=P24;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/數(shù)顯管字模uchar second,tempt;/second用來計(jì)秒數(shù) ,tempt用來臨時(shí)存放0.05s的次數(shù) 滿20即1s寫入void delay()/延時(shí)4-5個(gè)微秒;void delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void start()/起始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();void respons()/應(yīng)答 相當(dāng)于一個(gè)智能的延時(shí)函數(shù)uchar i;SCL=1;delay();while(SDA=1)&(i250)/沒收到應(yīng)答,我等!i+;/等了250次沒收到就不管他了,就當(dāng)他收到了-_- /其實(shí)沒收到的話可以結(jié)束程序的SCL=0;delay();void init()/初始化SDA=1;delay();SCL=1;delay();void write_byte(uchar date)/寫一字節(jié)數(shù)據(jù)uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;/左移一位 移出的一位在CY中SCL=0;/只有在scl=0時(shí)sda能變化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();uchar read_byte()uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i8;i+)SCL=1;delay();k=(k=100)second=0;TMOD=0x01;/定時(shí)器工作方式1ET0=1;EA=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;/開始計(jì)時(shí)while(1)display(second/10,second%10);if(write=1)write=0;write_add(2,second);void t0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;tempt+;if(tempt=20)tempt=0;second+;write=1;if(second=100)second=0;這是電路圖為了更好的掌握I2C總線我在此放兩個(gè)例子,一個(gè)是書上(郭天祥的,你們懂的)EPROM存儲定時(shí)時(shí)間的例子,還有就是用PCF8591進(jìn)行D/A轉(zhuǎn)換的例子。1.EPROM存儲定時(shí)時(shí)間/I2C總線很強(qiáng)大/程序功能:通過DA轉(zhuǎn)換把輸出電壓逐漸增大,使加在上面的發(fā)光二級管慢慢變亮/ 到最亮后再變暗,如此循環(huán)#include #define uchar unsigned char#define uint unsigned int#define PCF8591 0x90 /PCF8591 地址sbit SCL=P21; /串行時(shí)鐘輸入端sbit SDA=P20; /串行數(shù)據(jù)輸入端void delay()/延時(shí)4-5個(gè)微秒;void delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void start()/開始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();void respons()/應(yīng)答 相當(dāng)于一個(gè)智能的延時(shí)函數(shù)uchar i;SCL=1;delay();while(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 衣物捐贈及轉(zhuǎn)讓協(xié)議
- 紡織品的智能生產(chǎn)調(diào)度優(yōu)化考核試卷
- 購房定金的法律咨詢服務(wù)協(xié)議
- 電影敘事技巧與劇情發(fā)展考核試卷
- 中班禮儀:尊敬長輩
- 腫瘤內(nèi)科常見急癥及護(hù)理
- 石棉制品生產(chǎn)過程中的節(jié)能減排考核試卷
- 服裝零售企業(yè)危機(jī)應(yīng)對與輿情管理考核試卷
- 電視機(jī)制造業(yè)的數(shù)字化供應(yīng)鏈管理考核試卷
- 畜牧業(yè)信息技術(shù)在養(yǎng)殖中的應(yīng)用考核試卷
- 《大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)教程》第六章創(chuàng)業(yè)資源與融資
- 山水林田湖草生態(tài)環(huán)境調(diào)查技術(shù)規(guī)范DB41-T 1992-2020
- 大眾旅游服務(wù)質(zhì)量控制手冊
- GB/T 44421-2024矯形器配置服務(wù)規(guī)范
- 大型活動策劃與管理第八章 大型活動風(fēng)險(xiǎn)管理
- Q∕GDW 12165-2021 高海拔地區(qū)運(yùn)維檢修裝備配置規(guī)范
- JGJ107-2016鋼筋機(jī)械連接技術(shù)規(guī)程
- 婦科醫(yī)生進(jìn)修匯報(bào)課件
- 動態(tài)分析與設(shè)計(jì)實(shí)驗(yàn)報(bào)告總結(jié)
- 2024年江蘇省泰州市海陵區(qū)中考一模數(shù)學(xué)試卷
- 從汽車檢測看低空飛行器檢測發(fā)展趨勢
評論
0/150
提交評論