第九章串行總線接口技術(shù)_第1頁
第九章串行總線接口技術(shù)_第2頁
第九章串行總線接口技術(shù)_第3頁
第九章串行總線接口技術(shù)_第4頁
第九章串行總線接口技術(shù)_第5頁
已閱讀5頁,還剩132頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

12023/2/4單片機(jī)原理與應(yīng)用電子課件第9

章串行總線接口技術(shù)2023/2/42本章主要內(nèi)容9.1SPI串行總線接口技術(shù)9.2I2C總線接口技術(shù)9.3單總線(1-wire)接口2023/2/43第9章串行總線接口技術(shù)

由于數(shù)據(jù)的串行傳輸連線少,因而采用串行總線擴(kuò)展技術(shù)可以使系統(tǒng)的硬件設(shè)計(jì)簡化,系統(tǒng)的體積減小,同時(shí),系統(tǒng)的更改和擴(kuò)充更為容易。目前,單片機(jī)應(yīng)用系統(tǒng)中常用的串行擴(kuò)展總線有:I2C(InterICBUS)總線、SPI(SerialPeripheralInterface)總線、Microwire總線及單總線(1-WireBUS)。串行擴(kuò)展總線的應(yīng)用是單片機(jī)目前發(fā)展的一種趨勢。AT89系列單片機(jī)利用自身的通用并行線可以模擬多種串行總線時(shí)序信號,因此可以充分利用各種串行接口芯片資源。本章主要介紹I2C總線、SPI總線及單總線(1-WireBUS)的基本知識、常用的串行總線接口器件及和單片機(jī)的接口應(yīng)用。2023/2/449.1SPI串行總線接口技術(shù)9.1.1SPI串行總線簡介SPI接口的全稱是“SerialPeripheralInterface”,意為串行外圍接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息。SPI總線系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,該接口一般包括以下四種信號:MOSI–主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入MISO–主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出SCLK–時(shí)鐘信號,由主器件產(chǎn)生/ss–從器件使能信號,由主器件控制

2023/2/45

SPI接口是在CPU和外圍低速器件之間進(jìn)行同步串行數(shù)據(jù)傳輸,在主器件的移位脈沖下,數(shù)據(jù)按位傳輸,高位在前,低位在后,為全雙工通信,數(shù)據(jù)傳輸速度總體來說比I2C總線要快,速度可達(dá)到幾Mbps。

對于大多數(shù)不帶SPI串行總線接口的AT89系列單片機(jī)來說,可以使用軟件來模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。2023/2/469.1.2SPI串行接口A/D轉(zhuǎn)換器TLC549及其軟硬件設(shè)計(jì)

TLC549是美國德州儀器公司生產(chǎn)的8位串行A/D轉(zhuǎn)換器芯片,通過SPI接口與單片機(jī)連接,從CLK輸入的頻率最高可達(dá)1.1MHz。

TLC549具有4MHz的片內(nèi)系統(tǒng)時(shí)鐘,片內(nèi)具有采樣保持電路,A/D轉(zhuǎn)換時(shí)間最長17μs,最高轉(zhuǎn)換速率為40000次/s。TLC549的電源范圍為+3V-+6V,功耗小于15Mw,總失調(diào)誤差最大為±0.5LSB,適用于電池供電的便攜式儀表及低成本高性能的系統(tǒng)中。2023/2/471.引腳功能TLC549有8個(gè)引腳,如圖9-1所示。各引腳功能說明如下:REF+:正基準(zhǔn)電壓輸入端,2.5V≤REF+≤VCC+0.1V。REF-:負(fù)基準(zhǔn)電壓輸入端,-0.1V≤REF-≤2.5V,且要求REF+-REF-≥1V。在要求不高時(shí),也可將REF-接地,REF+接VCC。AIN:模擬信號輸入端,0≤AIN≤VCC,當(dāng)AIN≥REF+時(shí),轉(zhuǎn)換結(jié)果為全"1"(FFH),AIN≤REF-時(shí),轉(zhuǎn)換結(jié)果為全“0”(00H)。/CS:芯片選擇輸入端,低電平有效。DO:數(shù)據(jù)串行輸出端,輸出時(shí)高位在前,低位在后。CLK:外部時(shí)鐘輸入端,最高頻率可達(dá)1.1MHz。圖9-1TLC549引腳圖

2023/2/482.TLC549的時(shí)序TLC549的時(shí)序如圖9-2所示。/CS變?yōu)榈碗娖綍r(shí),TLC549芯片被選中,同時(shí)從DO端輸出前次轉(zhuǎn)換結(jié)果的最高有效位A7;

接著自CLK端輸入8個(gè)外部時(shí)鐘信號,前7個(gè)CLK信號輸出上次轉(zhuǎn)換結(jié)果的A6-A7位。

在第4個(gè)CLK信號由高至低的跳變之后,片內(nèi)采樣/保持電路對輸入模擬量采樣開始,第8個(gè)CLK信號的下降沿使片內(nèi)采樣/保持電路進(jìn)入保持狀態(tài)并啟動(dòng)本次A/D開始轉(zhuǎn)換。圖9-2TLC549的時(shí)序2023/2/49TLC549沒有啟動(dòng)控制端,只要讀走前一次數(shù)據(jù)后馬上就進(jìn)行新的轉(zhuǎn)換,轉(zhuǎn)換完成后就進(jìn)入保持狀態(tài),轉(zhuǎn)換時(shí)間為36個(gè)系統(tǒng)時(shí)鐘周期,最大為17uS。沒有轉(zhuǎn)換完成標(biāo)志信號,只要采用延時(shí)操作即可控制每次讀取數(shù)據(jù)的操作。3.TLC549與單片機(jī)的接口TLC549與單片機(jī)的連接如圖9-3所示。采用P1.0~P1.2連接TLC549的串行接口。圖9-3TLC549與單片機(jī)的硬件連接2023/2/410A/D轉(zhuǎn)換的匯編語言程序:DOBITP1.2CLKBITP1.1CSBITP1.0…TLC549_AD:CLRA;TLC549A/D轉(zhuǎn)換子程序,轉(zhuǎn)換結(jié)果在A中 CLRCLK MOVR5,#08HCLRCS;選中TLC549LOOP:SETBCLK;產(chǎn)生時(shí)鐘

NOPNOP NOP NOPMOVC,DO;讀取A/D轉(zhuǎn)換的一位數(shù)據(jù)

RLCA;左移進(jìn)入A CLRCLK2023/2/411

NOP NOP DJNZR5,LOOP;判8次數(shù)據(jù)是否讀完

SETBCS SETBCLK RET2023/2/412A/D轉(zhuǎn)換的C語言程序:sbitDO=P1^2sbitCLK=P1^1sbitCS=P1^0bdataUnsignedcharaddata;sbitadin0=addata^0;…unsignedcharTLC549_ad(void)/*A/D轉(zhuǎn)換程序*/{unsignedchari;Clk=0;CS=0;/*令CS為低選中TLC549*/_nop_();

2023/2/413for(i=0;i<8;i++)/*循環(huán)讀取8位A/D轉(zhuǎn)換結(jié)果*/{CLK=1;/*令CLK引腳為高,產(chǎn)生時(shí)鐘*/delay();/*延時(shí)*/adin0=DO;/*讀取A/D轉(zhuǎn)換后數(shù)據(jù)線的一位數(shù)據(jù)*/addata=addata<<1;/*左移一位,先讀取為高位,后讀為低位*/CLK=0;/*令CLK恢復(fù)為0*/_nop_();_nop_();}returnaddata;/*返回A/D轉(zhuǎn)換值*/}voiddelay(){unsignedchari;for(i=0;i<20;i++)}2023/2/4144.簡易數(shù)字電壓表的設(shè)計(jì)舉例利用TLC549A/D轉(zhuǎn)換器設(shè)計(jì)一個(gè)簡易數(shù)字電壓表,用4位LED顯示器將被測電壓顯示出來,測量范圍為0.000V-5.000V。將TLC549的、CLK、DO接到單片機(jī)的三條I/O口線,REF+、REF-直接接到Vcc、GND,模擬輸入AIN接電位器的中心抽頭,調(diào)節(jié)電位器即可改變被測輸入電壓值,硬件連接如圖9-4所示。

圖9-4簡易數(shù)字電壓表硬件連接圖2023/2/415軟件設(shè)計(jì)的基本思路:程序首先通過調(diào)用TLC549_ad(),讀取A/D轉(zhuǎn)換結(jié)果存入addata,然后按公式u=addata/255×5000(mV)計(jì)算電壓值,再將u轉(zhuǎn)換為4位BCD碼送顯示緩沖區(qū),并調(diào)用顯示程序disp_ad()將其轉(zhuǎn)換為字型碼顯示出來,顯示格式為x.xxxx,單位為v。程序請參照課本.2023/2/4169.1.3SPI串行接口D/A轉(zhuǎn)換器TLC5615及其軟硬件設(shè)計(jì)TLC5615是SPI接口的10位電壓輸出的D/A轉(zhuǎn)換器,通過3根串行總線就可以完成10位數(shù)據(jù)的串行輸入,易于和工業(yè)標(biāo)準(zhǔn)的微處理器或單片機(jī)接口,適用于電池供電的測量儀表、移動(dòng)電話以及工業(yè)控制場合。其主要特點(diǎn)如下:5V單電源工作;3線串行接口;DAC輸出的最大電壓為2倍基準(zhǔn)輸入電壓;上電時(shí)內(nèi)部自動(dòng)復(fù)位,確??梢灾貜?fù)啟動(dòng);功耗低,最大功耗為1.75mW。2023/2/4171.TLC5615的內(nèi)部結(jié)構(gòu)和引腳功能

TLC5615的內(nèi)部結(jié)構(gòu)如圖9-5所示,內(nèi)部包含:一個(gè)電壓跟隨器為參考電壓端REFIN提供高輸入阻抗;10位DAC×2電路提供最大值為2倍于REFIN的輸出;一個(gè)16位移位寄存器,接受串行移入的二進(jìn)制數(shù),并且有一個(gè)級聯(lián)的數(shù)據(jù)輸出端DOUT;并行輸入輸出的10位DAC寄存器,為10位DAC電路提供待轉(zhuǎn)換的二進(jìn)制數(shù)據(jù)。

圖9-5TLC5615的內(nèi)部結(jié)構(gòu)2023/2/418TLC5615的引腳如圖9-6所示,各引腳功能如下:DIN:串行二進(jìn)制數(shù)輸入端SCLK:串行時(shí)鐘輸入端/CS:芯片選擇,低有效DOUT:菊花鏈的串行數(shù)據(jù)輸出端(用于多芯片的級聯(lián))REFIN:基準(zhǔn)電壓輸入端OUT:DAC模擬電壓輸出端圖9-6TLC5615的引腳2023/2/4192、TLC5615的時(shí)序TLC5615的時(shí)序如圖9-7所示。/CS當(dāng)為低電平時(shí),在每一個(gè)SCLK時(shí)鐘的上升沿從DIN引腳移入一位數(shù)據(jù),高位在前,低位在后。經(jīng)16個(gè)時(shí)鐘后,/CS的上升沿將16位移位寄存器的10位有效數(shù)據(jù)鎖存到10位DAC寄存器,供DAC電路進(jìn)行轉(zhuǎn)換。

圖9-7TLC5615的時(shí)序2023/2/42016位數(shù)據(jù)的高4位和低2位不會被轉(zhuǎn)換,待轉(zhuǎn)換數(shù)據(jù)輸入的格式見表9-1:輸入序號12345678910111213141516輸入數(shù)據(jù)××××D9D8D7D6D5D4D3D2D1D000設(shè)n為待轉(zhuǎn)換的數(shù)字量,VREFIN為基準(zhǔn)輸入電壓,則轉(zhuǎn)換后的輸出電壓:VOUT=2×VREFIN×n/1024表9-1D/A轉(zhuǎn)換數(shù)據(jù)輸入格式2023/2/4213.TLC5615與單片機(jī)的接口TLC5615與單片機(jī)的硬件如圖9-7所示,將TLC5615的SCLK、、DIN分別與單片機(jī)的P1.0、P1.1、P1.2相連,基準(zhǔn)電壓接+5V。圖9-8TLC5615與單片機(jī)的硬件連接

2023/2/422D/A轉(zhuǎn)換匯編語言程序:設(shè)要轉(zhuǎn)換的數(shù)據(jù)放在R7R6中,R7為高8位,R6低8位DINBITP1.2;引腳定義CSBITP1.1SCLKBITP1.0…TLC5615_DA:CLRC ;將R7R6中數(shù)據(jù)左移2位(16位數(shù)據(jù)的最低2位添00)RLCR6RLCR7CLRCRLCR6RLCR7SETBCS;初始化片選信號為高

CLRSCLK;初始化時(shí)鐘為低

CLRDIN ;D/A數(shù)據(jù)線置低

CLRCS ;選中TLC5615,開始啟動(dòng)D/AMOVR5,#16 ;將16位數(shù)據(jù)從DIN端移進(jìn)內(nèi)部的16位移位寄存器2023/2/423

LOOP:RLCR6 ;R7R6中數(shù)據(jù)左移一位,最高位進(jìn)入CYRLCR7MOVDIN,C ;將數(shù)據(jù)送到DIN引腳

SETBSCLK;送時(shí)鐘

NOPNOPNOPCLRSCLK;NOPNOPNOP DJNZR5,LOOP SETBCS;D/A片選拉高,10位有效數(shù)據(jù)鎖存到DAC寄存器,開始轉(zhuǎn)換

RET

2023/2/424D/A轉(zhuǎn)換C語言程序:sbitDA_clk=P1^0;/*引腳定義*/sbitDA_cs=P1^1; sbitDA_in=P1^2;…voiddelay_s(unsignedcharn) /*延時(shí)*/{unsignedchari;

for(i=0;i<n;i++);

}voidTLC5615_DA_conver(unsignedintDA_data)/*D/A轉(zhuǎn)換程序*/{unsignedchari;

DA_data=DA_data<<2;/*將數(shù)據(jù)左移2位(最低2位添00)*/DA_cs=1; /*初始化片選信號為高*/DA_clk=0; /*初始化時(shí)鐘為低*/DA_in=0;/*D/A數(shù)據(jù)線置低*/DA_cs=0; /*選中TLC5615,開始啟動(dòng)D/A*/for(i=0;i<16;i++)/*將16位數(shù)據(jù)從DIN端移進(jìn)內(nèi)部的16位移位寄存器*/2023/2/425{DA_data=DA_data<<1;/*左移一位,最高位進(jìn)入CY*/DA_in=CY; /*將數(shù)據(jù)送到DIN引腳*/DA_clk=1;delay_s(0x02);/*送時(shí)鐘*/DA_clk=0;delay_s(0x02);

}DA_cs=1;/*片選拉高,10位數(shù)據(jù)鎖存到DAC寄存器,開始轉(zhuǎn)換*/delay_s(0x20); }2023/2/4264.用TLC5615設(shè)計(jì)簡易信號發(fā)生器

圖9-9是用TLC5615設(shè)計(jì)簡易信號發(fā)生器的硬件接口電路。系統(tǒng)實(shí)現(xiàn)上電后產(chǎn)生矩形波,當(dāng)S1按下時(shí)產(chǎn)生正弦波,當(dāng)S2按下時(shí)產(chǎn)生三角波。

圖9-9簡易信號發(fā)生器的硬件接口電路

程序略2023/2/4279.2I2C總線接口技術(shù)I2C總線是PHLIPS公司推出的一種高性能芯片間簡單、雙向二線制同步串行總線,數(shù)據(jù)傳輸時(shí)只需兩根信號線,一根是雙向數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL,所有連接到I2C總線上的串行器件,其數(shù)據(jù)線都連接到總線的SDA上,時(shí)鐘線則連接到總線的SCL上。9.2.1I2C總線簡介1.I2C總線的主要特點(diǎn)有:總線只有兩根線,即串行時(shí)鐘線(SCL)和串行數(shù)據(jù)線(SDA),這在設(shè)計(jì)中大大減少了硬件接口。

2023/2/428每個(gè)連接到總線上的器件都有一個(gè)用于識別的器件地址,器件地址由芯片內(nèi)部硬件電路和外部地址引腳同時(shí)決定,避免了片選線的連接方法,并建立簡單的主從關(guān)系,每個(gè)器件既可以作為發(fā)送器,又可以作為接收器。

同步時(shí)鐘允許器件以不同的波特率進(jìn)行通信。同步時(shí)鐘可以作為停止或重新啟動(dòng)串行口發(fā)送的握手信號。

串行的數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá)3.4Mbit/s。連接到同一總線的集成電路數(shù)只受400pF的最大總線電容的限制。

2023/2/4292.I2C總線系統(tǒng)結(jié)構(gòu)

I2C總線的系統(tǒng)結(jié)構(gòu)如圖9-10所示。采用I2C總線標(biāo)準(zhǔn)的器件均并聯(lián)在總線上,內(nèi)部都有I2C接口電路,用于實(shí)現(xiàn)和I2C總線的連接。I2C總線上的每一個(gè)從器件均有一個(gè)唯一的地址,用于識別不同的器件。

圖9-10I2C總線的系統(tǒng)結(jié)構(gòu)2023/2/4303.I2C總線的工作時(shí)序當(dāng)I2C總線沒有進(jìn)行信息傳送時(shí),數(shù)據(jù)線(SDA)和時(shí)鐘線(SCL)都為高電平時(shí)。當(dāng)主控制器向某個(gè)器件傳送信息時(shí),首先應(yīng)向總線送開始信號,然后才能傳送信息,當(dāng)信息傳送結(jié)束時(shí)應(yīng)送結(jié)束信號,如圖9-11所示。圖9-11I2C總線的工作時(shí)序2023/2/431開始信號和結(jié)束信號規(guī)定如下:開始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。結(jié)束信號:SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。開始信號和結(jié)束信號之間傳送的是信息,信息的字節(jié)數(shù)沒有限制,但每個(gè)字節(jié)必須為8位,高位在前,低位在后。數(shù)據(jù)線SDA上每一位信息狀態(tài)的改變只能發(fā)生在時(shí)鐘線SCL為低電平的期間,因?yàn)镾CL高電平期間SDA狀態(tài)的改變已經(jīng)被用來表示開始信號和結(jié)束信號。每個(gè)字節(jié)后面必須接收一個(gè)應(yīng)答信號(ACK),ACK是從控制器在接收到8位數(shù)據(jù)后向主控制器發(fā)出的特定的低電平脈沖,用以表示已收到數(shù)據(jù)。主控制器接收到應(yīng)答信號(ACK)后,可根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號的判斷。若未收到ACK,則判斷為從控制器出現(xiàn)故障。

2023/2/432

主控制器每次傳送的信息的第一個(gè)字節(jié)必須是器件地址碼,第二個(gè)字節(jié)為器件單元地址,用于實(shí)現(xiàn)選擇所操作的器件的內(nèi)部單元,從第三個(gè)字節(jié)開始為傳送的數(shù)據(jù)。其中器件地址碼格式如表9-2所示。表9-2I2C總線上器件地址碼格式D7D6D5D4D3D2D1D0器件類型碼片選R/W2023/2/433I2C總線上的每一個(gè)從器件均有一個(gè)唯一的地址,每次主器件發(fā)出起始信號后,必須接著發(fā)出一個(gè)字節(jié)的器件地址,以選取掛在總線上的某一從器件并控制總線的傳輸方向。器件類型碼:表示器件的類型,出廠時(shí)根據(jù)PHILIPS公司的I2C規(guī)程確定,比如對于24C02芯片來說,器件標(biāo)識地址為1010。片選地址:當(dāng)總線上有多片同類器件時(shí),只有器件引腳A2~A0的電平與器件地址中A2~A0同相的器件才能被選中。R/W操作控制位,為1表示讀操作,為0表示寫操作。說明:器件地址只表明選擇掛在總線的哪一個(gè)器件及數(shù)據(jù)傳送方向,而器件內(nèi)部的地址是由編程者在傳送第一個(gè)數(shù)據(jù)時(shí)指定的,即第一個(gè)數(shù)據(jù)為器件內(nèi)的子地址。

2023/2/4344.I2C總線讀、寫操作

(1)當(dāng)前地址讀該操作將從所選器件當(dāng)前地址執(zhí)行讀操作,讀的字節(jié)數(shù)不指定,格式見表9-3所示

表9-3當(dāng)前地址讀操作格式

S控制碼(R/W=1)A數(shù)據(jù)1A數(shù)據(jù)2AP(2)指定單元讀該操作將從所選器件指定地址讀,讀的字節(jié)數(shù)不指定,格式見表9-4所示。

表9-4指定地址讀操作格式

S控制碼(R/W=0)A器件單元地址AS控制碼(R/W=1)A數(shù)據(jù)1A數(shù)據(jù)2AP2023/2/435

(3)指定單元寫該操作將從所選器件指定地址寫,寫的字節(jié)數(shù)不指定,格式見表9-5所示。表9-5指定地址寫操作格式S控制碼(R/W=0)A器件單元地址A數(shù)據(jù)1A數(shù)據(jù)2AP其中:S表示開始信號,A表示應(yīng)答信號,P表示結(jié)束信號。

2023/2/4369.2.2用I/O口模擬I2C總線操作子程序目前不少的單片機(jī)內(nèi)部集成了I2C總線接口,如MCS-51系列的8XC550、8XC552、8XC571等,低價(jià)位的單片機(jī)內(nèi)部雖然沒有集成I2C總線接口,但可以通過軟件實(shí)現(xiàn)I2C總線操作。

假設(shè)采用89S51單片機(jī),晶振頻率為12MHz,即機(jī)器周期為1us,使用P1.0作為數(shù)據(jù)線SDA,P1.1作為時(shí)鐘線SCL。SCLBITP1.1 ;匯編語言定義端口SDABITP1.0sbitSDA=P1^0;//C語言定義端口sbitSCL=P1^1;bitack;//應(yīng)答標(biāo)志位,有應(yīng)答為1,無應(yīng)答為0#defineDELAY5US_nop_();_nop_();_nop_();_nop_();_nop_();

根據(jù)I2C總線數(shù)據(jù)傳送的典型信號時(shí)序要求,可用單片機(jī)I/O口線產(chǎn)生起始信號、停止信號、應(yīng)答信號、非應(yīng)答信號等。匯編語言和C語言程序如下:2023/2/4371.產(chǎn)生起始信號S匯編語言程序:

START:SETBSDA ;發(fā)送起始條件數(shù)據(jù)信號

SETB SCL ;發(fā)送起始條件的時(shí)鐘信號

NOP NOP NOP NOP CLR SDA ;發(fā)送起始信號(SCL為高,SDA發(fā)生由高到低)

NOP NOP NOP NOP NOP CLR SCL RET2023/2/438C語言程序:voidstart() {SDA=1; /*將SDA、SCL置為1*/SCL=1;DELAY5US;/*延時(shí)5us*/SDA=0;/*SCL為高時(shí),SDA由高變低*/DELAY5US;SCL=0; /*SCL變低,準(zhǔn)備發(fā)送或接收數(shù)據(jù)*/}2023/2/4392.產(chǎn)生停止信號S

匯編語言程序:STOP:CLRSDA ;發(fā)送停止條件的數(shù)據(jù)信號SETBSCL ;發(fā)送停止條件的時(shí)鐘信號NOPNOPNOPNOPNOP SETBSDA ;發(fā)送I2C總線停止信號(SCL為高,SDA發(fā)生由低到高)

NOPNOPNOPNOP CLRSCLCLRSDARET2023/2/440C語言程序:voidstop() {SDA=0;/*將SDA清0,SCL置1*/SCL=1;DELAY5US; SDA=1; /*當(dāng)SCL為高電平時(shí),SDA由低變高*/DELAY5US;SCL=0;}2023/2/4413.發(fā)送應(yīng)答信號ACK匯編語言程序:MACK:CLRSDA;發(fā)送應(yīng)答信號MACKSETBSCLNOPNOPNOPNOPNOPCLRSCLSETBSDARET2023/2/442C語言程序:voidack(void)/*產(chǎn)生應(yīng)答信號*/{SDA=0;/*SDA先清0,發(fā)應(yīng)答信號*/SCL=1; /*SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘*/DELAY5US;/*延時(shí)5us*/SCL=0;/*SCL變低,以便繼續(xù)接收*/SDA=1;}2023/2/4434.發(fā)送非應(yīng)答信號NACK匯編語言程序:NACK:SETBSDA;發(fā)送應(yīng)答信號NACKSETBSCLNOPNOPNOP NOPNOPCLRSCLCLRSDARET2023/2/444C語言程序:voidnack(void){SDA=1;/*DA先置1,發(fā)非應(yīng)答信號*/SCL=1; /*SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘*/DELAY5US;SCL=0;/*時(shí)鐘線SCL恢復(fù)到低電平*/SDA=0;}2023/2/4455.應(yīng)答檢測子程序CACK匯編語言程序(F0=1通信失敗):CACK:SETBSDA;發(fā)送應(yīng)答信號CACKSETBSCLCLRF0MOVC,SDAJNCCENDSETBF0CEND:CLRSCL RET2023/2/446C語言程序:voidcack(void){SDA=1;/*SDA先置1,發(fā)非應(yīng)答信號*/SCL=1;/*SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘*

DELAY5US;ack=0;if(SDA=1)ack=1;SCL=0;/*時(shí)鐘線SCL恢復(fù)到低電平*/}2023/2/4476.向I2C總線發(fā)送一個(gè)字節(jié)

匯編語言程序:;從A中取一個(gè)字節(jié)數(shù)據(jù)寫向I2C總線WRITE_BYTE:MOVR7,#8 ;寫8位WRITE_LOOP:RLCA;發(fā)送A中數(shù)據(jù)

MOVSDA,C SETBSCL NOP NOP NOP NOP NOP CLRSCL DJNZR7,WRITE_LOOPRET2023/2/448C語言程序:/*將指針P指向的一個(gè)字節(jié)數(shù)據(jù)發(fā)送*/voidSendByte(uchar*p){ucharn,temp;temp=*p;for(n=0;n<8;n++)/*一字節(jié)為8位,循環(huán)8次*/{if(temp&0x80)SDA=1;/*將數(shù)據(jù)線SDA置1或清0*/elseSDA=0;NOPSCL=1;/*置SCL為高,通知從機(jī)開始接收數(shù)據(jù)*/DELAY5US;SCL=0;/*SCL變低,準(zhǔn)備發(fā)送下一位數(shù)據(jù)*/temp=temp<<1;/*準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)*/}}2023/2/4497.從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)匯編語言程序:;從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)放在A中RDBYTE:MOVR7,#8 ;寫8位RD_LOOP:SETBSDASETBSCL NOP;延時(shí)5μs NOP NOP NOP NOP NOP MOVC,SDA;采樣SDA線上的數(shù)據(jù)到cy MOVA,R2;R2為接收數(shù)據(jù)的緩沖寄存器RLCA;將cy中的數(shù)據(jù)左移進(jìn)A中MOVR2,A;數(shù)據(jù)送回緩沖寄存器R2CLRSCLDJNZR7,RD_LOOPRET2023/2/450C語言程序:/*接收一個(gè)字節(jié)數(shù)據(jù)放在P指向單元*/ucharRcvByte(uchar*P) {ucharn,temp;for(n=0;n<8;n++) /*一字節(jié)為8位,循環(huán)8次*/{SDA=1;/*置數(shù)據(jù)線SDA為高,進(jìn)入接收方式*/SCL=1;/*SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘*/DELAY5US;temp=temp<<1;if(SDA=1)temp=temp︱0X01ELSEtemp=temp&0xfe;SCL=0;/*時(shí)鐘線SCL清0*/}*p=temp;}2023/2/4518.向有子地址器件發(fā)送多個(gè)字節(jié)以上介紹的都是I2C總線的基本操作,I2C總線完整的數(shù)據(jù)傳輸是由以上操作組合而成。設(shè)某從器件的寫地址為sla,如果希望向該器件由子地址suba開始的單元連續(xù)寫入n個(gè)字節(jié)的數(shù)據(jù)dat1、dat2、……datn,相應(yīng)的操作過程如圖9-12所示。有陰影部分表示數(shù)據(jù)由主器件向從器件傳送,無陰影部分表示數(shù)據(jù)由從器件向主器件傳送。圖9-12向有子地址器件發(fā)送多個(gè)字節(jié)的操作過程匯編語言程序:;多字節(jié)寫操作子程序WNBYTE;入口參數(shù):R7寫入的字節(jié)數(shù),R0寫入數(shù)據(jù)的首地址,R2從器件地址,R3從器件內(nèi)部地址2023/2/452WNBYTE:MOVA,R3; LCALLSTART LCALLWRITE_BYTE LCALLCACK JBF0,WRBYTEMOVA,R2 LCALLWRITE_BYTELCALLCACKJBF0,WRBYTEWRDA:MOVA,@R0LCALLWRITE_BYTELCALLCACKJBF0,WRBYTEINCR0DJNZR7,WRDALCALLSTOPRET2023/2/453C語言程序:/*多字節(jié)寫操作子程序WNBYTE入口參數(shù):n寫入的字節(jié)數(shù),S0寫入數(shù)據(jù)的首地址,S3從器件地址,S2從器件地址內(nèi)部地址*/voidSendnbyte(uchar*s3,uchar*s2,uchar*s0,ucharn){uchari;loop:start(); /*發(fā)起始信號,啟動(dòng)總線*/SendByte(s3); /*發(fā)送從器件地址*/cack(); if(ack)gotoloopSendByte(s2); /*發(fā)送器件子地址*/cack(); if(ack)gotoloopfor(i=0;i<n;i++) /*循環(huán)n次*/{SendByte(s0);/*發(fā)送一個(gè)字節(jié)數(shù)據(jù)*/cack(); if(ack)gotoloops0++; /*指向下一個(gè)字節(jié)*/}stop();/*發(fā)結(jié)束信號,結(jié)束本次數(shù)據(jù)傳送*/}2023/2/4549.向有子地址器件讀取多個(gè)字節(jié)

主機(jī)首先發(fā)送起始信號、從器件地址sla和希望讀取的字節(jié)數(shù)據(jù)所在從器件子地址suba,執(zhí)行一次寫操作,在從器件應(yīng)答之后,主器件重新發(fā)送起始信號和從器件讀地址sla+1,從器件響應(yīng)并發(fā)送應(yīng)答信號后,輸出主機(jī)所要求的一個(gè)字節(jié)數(shù)據(jù)dat1,主器件隨后發(fā)送應(yīng)答信號ACK,以后從器件每輸出一個(gè)字節(jié)數(shù)據(jù),主機(jī)均回送ACK應(yīng)答,當(dāng)從器件輸出最后一個(gè)字節(jié)數(shù)據(jù)datn后,主機(jī)回送非應(yīng)答信號,接著發(fā)送停止信號結(jié)束總線傳送,相應(yīng)的操作過程如圖9-13所示。圖9-13向有子地址器件讀取多個(gè)字節(jié)的操作過程2023/2/455匯編語言程序:;多字節(jié)讀操作子程序RNBYTE;入口參數(shù):R7寫入的字節(jié)數(shù),R0寫入數(shù)據(jù)的首地址,R2從器件地址內(nèi)部地址,R3從器件寫地址,R4從器件讀地址RNBYTE:LCALLSTARTMOVA,R3 ;取從器件寫地址LCALLWRITE_BYTE ;寫從器件地址LCALLCACK ;檢測應(yīng)答信號JBF0,RNBYTE ;無應(yīng)答重新開始MOVA,R2 ;取從器件地址內(nèi)部地址LCALLWRITE_BYTELCALLCACKJBF0,RNBYTELCALLSTART2023/2/456MOVA,R4 ;取從器件讀地址LCALLWRITE_BYTELCALLCACKJBF0,RNBYTERDN:LCALLRDBYTE ;接收一個(gè)字節(jié)數(shù)據(jù)MOV@R0,A DJNZR7,ACKLCALLMNACK ;接收完發(fā)非應(yīng)答信號LCALLSTOPACK:LCALLMACK;沒接收完發(fā)應(yīng)答信號INCR0SJMPRDN2023/2/457C語言程序:/*多字節(jié)讀操作子程序RNBYTE/*入口參數(shù):n寫入的字節(jié)數(shù),s0讀數(shù)據(jù)存放的首地址,s2從器件地址內(nèi)部地址,s3從器件寫地址,s4從器件讀地址*/viodRcvnbyte(uchar*s3,uchar*s4,uchar*s2,uchar*s0,ucharn){loop:start();/*發(fā)起始信號,啟動(dòng)總線*/ SendByte(s3);/*發(fā)送從器件地址*/Cack();/*應(yīng)答檢測*/if(ack)/*如果沒能應(yīng)答,重新開始*/gotoloopSendByte(s2);/*發(fā)送器件子地址*/Cack();/*應(yīng)答檢測*/if(ack)/*如果沒能應(yīng)答,重新開始*/gotoloop2023/2/458start();/*再次發(fā)起始信號*/SendByte(s4); /*sla+1表示進(jìn)行讀操作*/cack();/*應(yīng)答檢測*/if(ack)/*如果沒能應(yīng)答,重新開始*/gotoloopfor(i=0;i<n-1;i++)/*對前n-1個(gè)字節(jié)發(fā)應(yīng)答信號*/{RcvByte(s0);/*接收數(shù)據(jù)*/ack();/*發(fā)送應(yīng)答信號*/s++;}RcvByte(s0);/*接收最后一個(gè)字節(jié)*/nack();/*發(fā)送非應(yīng)答信號*/stop();/*發(fā)結(jié)束信號,結(jié)束本次數(shù)據(jù)傳送*/}2023/2/4599.2.324CXX系列EEPROM芯片及其與單片機(jī)的接口串行E2PROM是在各種串行器件應(yīng)用中使用較頻繁的器件,和并行E2PROM相比,串行E2PROM容量小、數(shù)據(jù)傳送速度較低,但因其體積較小,引腳較少,功耗低,特別適合于需要存放非揮發(fā)數(shù)據(jù),速度要求不高,引腳少的單片機(jī)應(yīng)用系統(tǒng)。24CXX系列的E2PROM有多種型號,其中典型的型號有:24C02/04/08/16/32/64/128/256共8中芯片,容量分別為1、2、4、8、16、32、64、128、256KB。串行EEPROM一般具有兩種寫入方式,一種是字節(jié)寫入方式,還有另一種頁寫入方式,允許在一個(gè)寫周期內(nèi)同時(shí)對1個(gè)字節(jié)到一頁的若干字節(jié)的編程寫入,一頁的大小取決于芯片內(nèi)頁寄存器的大小。其中,24C01具有8字節(jié)數(shù)據(jù)的頁面寫能力,24C02/04/08/16具有16字節(jié)數(shù)據(jù)的頁面寫能力,24C32/64具有32字節(jié)數(shù)據(jù)的頁面寫能力,24C128/256具有64字節(jié)數(shù)據(jù)的頁面寫能力。

2023/2/4601、引腳的功能24CXX系列的E2PROM管腳排列圖分別為如圖9-14的(a)、(b)、(c)所示VCC:電源+5V。VSS:地線。SCL:串行時(shí)鐘輸入端,用于發(fā)送數(shù)據(jù)或接收數(shù)據(jù)時(shí)產(chǎn)生所需的時(shí)鐘。SDA:串行數(shù)據(jù)I/O端,用于輸入和輸出串行數(shù)據(jù)。該引腳是漏極開路的端口,需接上拉電阻到VCC。WP:寫保護(hù)端,該引腳提供了硬件數(shù)據(jù)保護(hù),當(dāng)WP接地時(shí),允許對芯片執(zhí)行寫操作;當(dāng)WP接VCC時(shí),則對芯片實(shí)施寫保護(hù)。(a)24C01/02/04/08/16/32/64管腳(b)24C128管腳(c)24C256管腳圖9-1424CXX系列E2PROM引腳圖2023/2/461A0、A1、A2:器件地址輸入端,用于多個(gè)器件級聯(lián)時(shí)設(shè)置器件地址,當(dāng)這些腳懸空時(shí)默認(rèn)值為0,對于24C02可級聯(lián)8個(gè)器件,如果線路上只有一片24C02,這三個(gè)地址輸入腳A0、A1、A2可懸空或連接到GND。例:如果A2、A1、A0所接的電平為101,由于24C02的器件標(biāo)識為1010,那么,該芯片的讀地址為0xab,寫地址為0xaa。

2023/2/4622.24CXX的器件地址24CXX的器件地址見表9-6所示。表9-624CXX的器件地址型號控制碼片選讀寫總線訪問的器件24C011010A2A1A01/0最多8個(gè)24C021010A2A1A01/0最多8個(gè)24C041010A2A1a81/0最多4個(gè)24C081010A2a9a81/0最多2個(gè)24C161010a10a9a81/0最多1個(gè)24C321010A2A1A01/0最多8個(gè)24C641010A2A1A01/0最多8個(gè)24C1281010XXX1/0最多1個(gè)24C25610100A1A01/0最多4個(gè)2023/2/4633.AT89S51單片機(jī)與24C02的硬件連接

圖9-15為單片機(jī)與24C02的連接,其中P1.0作為24C02的數(shù)據(jù)線SDA,P1.1作為24C02的時(shí)鐘線SCL,24C02的器件標(biāo)識地址為1010。由于系統(tǒng)中只有一片24C02,所以直接將器件地址輸入端A2、A1、A0接地,這樣24C02在系統(tǒng)中的器件地址SLAW=0xA0,SLAR=0xA1。兩條線均接4.7K的上拉電阻

圖9-15

單片機(jī)與24C02的連接電路2023/2/4644.89S51對24C02的讀寫程序

針對圖9-15,編寫對24C02的讀寫程序,將若干個(gè)字節(jié)數(shù)據(jù)寫到24C02芯片地址為0x10開始的單元中,隨后從這些單元讀出數(shù)據(jù),判斷是否與寫入的數(shù)據(jù)一致,如果讀/寫正確,蜂鳴器鳴叫一聲,否則鳴叫3聲。24C02的內(nèi)部有連續(xù)的子地址空間,對這些空間進(jìn)行n個(gè)字節(jié)的連續(xù)讀/寫時(shí),具有地址自動(dòng)加1功能,只要設(shè)定好希望讀/寫的器件子地址及字節(jié)數(shù),就能完成整個(gè)操作。注意:對于24C02連續(xù)寫的字節(jié)數(shù)不應(yīng)超過頁容量8,一次連續(xù)寫所形成的總線傳送結(jié)束后(主機(jī)發(fā)出停止信號后),24C02執(zhí)行內(nèi)部擦寫過程,大約需要10ms左右,此時(shí)24C02不再應(yīng)答主器件的任何請求。2023/2/465C語言參考程序見課本.其中的函數(shù)Sendnbyte()、Rcvnbyte()在前面9.2.2節(jié)已作介紹,對24C02的讀寫完全適用。為了使用方便,可以將9.2.2節(jié)介紹的模擬I2C總線操作的子程序形成一個(gè)文件I2C.C,并形成如下的I2C.h文件,主程序和I2C.C加入同一個(gè)項(xiàng)目中,并且主程序包含這個(gè)h文件,即可使用Rcvnbyte()、Rcvnbyte()這兩個(gè)函數(shù)。2023/2/4669.2.4數(shù)碼管動(dòng)態(tài)顯示驅(qū)動(dòng)、鍵盤掃描管理芯片ZLG7290B及與單片機(jī)接口ZLG7290B是廣州周立功單片機(jī)發(fā)展有限公司自行設(shè)計(jì)的數(shù)碼管顯示驅(qū)動(dòng)及鍵盤掃描管理芯片。能夠直接驅(qū)動(dòng)8位共陰式數(shù)碼管(或64只獨(dú)立的LED),同時(shí)還可以掃描管理多達(dá)64只按鍵。其中有8只按鍵還可以作為功能鍵使用,就像電腦鍵盤上的Ctrl、Shift、Alt鍵一樣。另外ZLG7290B內(nèi)部還設(shè)置有連擊計(jì)數(shù)器,能夠使某鍵按下后不松手而連續(xù)有效。采用I2C總線方式,與微控制器的接口僅需兩根信號線。該芯片為工業(yè)級芯片,抗干擾能力強(qiáng),在工業(yè)測控中已有大量應(yīng)用。1.主要特性直接驅(qū)動(dòng)8位共陰式數(shù)碼管或64只獨(dú)立的LED;能夠管理多達(dá)64只按鍵,自動(dòng)消除抖動(dòng),其中有8只可以作為功能鍵使用;段電流可達(dá)20mA,位電流可達(dá)100mA以上;利用功率電路可以方便地驅(qū)動(dòng)1英寸以上的大型數(shù)碼管;2023/2/467具有閃爍、段點(diǎn)亮、段熄滅、功能鍵、連擊鍵計(jì)數(shù)等強(qiáng)大功能;提供有10種數(shù)字和21種字母的譯碼顯示功能,或者直接向顯示緩存寫入顯示數(shù)據(jù);不接數(shù)碼管而僅使用鍵盤管理功能時(shí),工作電流可降至1mA;與微控制器之間采用I2C串行總線接口,只需兩根信號線,節(jié)省I/O資源;工作電壓范圍:+3.3~5.5V;工作溫度范圍:-40~+85℃;封裝:DIP-24(窄體),SOP-24。2.引腳圖及功能說明引腳圖見9-16所示,引腳功能見表9-7所示。圖9-16ZLG7290B引腳圖(DIP-24,SOP-24)2023/2/468表9-7ZLG7290B引腳功能表引腳序號引腳名稱功能描述1SC/KR2數(shù)碼管c段/鍵盤行信號22SD/KR3數(shù)碼管d段/鍵盤行信號33DIG3/KC3數(shù)碼管位選信號3/鍵盤列信號34DIG2/KC2數(shù)碼管位選信號2/鍵盤列信號25DIG1/KC1數(shù)碼管位選信號1/鍵盤列信號16DIG0/KC0數(shù)碼管位選信號0/鍵盤列信號07SE/KR4數(shù)碼管e段/鍵盤行信號48SF/KR5數(shù)碼管f段/鍵盤行信號59SG/KR6數(shù)碼管g段/鍵盤行信號610DP/KR7數(shù)碼管dp段/鍵盤行信號711GND接地12DIG6/KC6數(shù)碼管位選信號6/鍵盤列信號62023/2/469引腳序號引腳名稱功能描述13DIG7/KC7數(shù)碼管位選信號7/鍵盤列信號714/INT鍵盤中斷請求信號,低電平(下降沿)有效15/RST復(fù)位信號,低電平有效16Vcc電源,+3.3~5.5V17OSC1晶振輸入信號18OSC2晶振輸出信號19SCLI2C總線時(shí)鐘信號20SDAI2C總線數(shù)據(jù)信號21DIG5/KC5數(shù)碼管位選信號5/鍵盤列信號522DIG4/KC4數(shù)碼管位選信號4/鍵盤列信號423SA/KR0數(shù)碼管a段/鍵盤行信號024SB/KR1數(shù)碼管b段/鍵盤行信號12023/2/4703.ZLG7290B典型應(yīng)用電路原理圖如圖9-17所示。(1)電路簡析在圖9-17中,U1就是ZLG7290B。J1是ZLG7290B與微控制器的接口,按照I2C總線協(xié)議的要求,信號線SCL和SDA上必須要分別加上上拉電阻,其典型值是10KΩ。晶振Y1通常取值4MHz,調(diào)節(jié)電容C3和C4通常取值在10pF左右。復(fù)位信號是低電平有效,數(shù)碼管必須是共陰式的,不能直接使用共陽式的。DPY1和DPY2是4位聯(lián)體式數(shù)碼管,共同組成完整的8位。R1~R8是限流電阻,典型值是270Ω。64只按鍵中,前56個(gè)按鍵是普通按鍵K1~K56,最后8個(gè)為功能鍵F0~F7。數(shù)碼管掃描線和鍵盤掃描線是共用的,所以二極管D1~D8是必須的,有了它們就可以防止按鍵干擾數(shù)碼管顯示的情況發(fā)生。在多數(shù)應(yīng)用當(dāng)中可能不需要太多的按鍵,這時(shí)可以按行或按列裁減鍵盤。2023/2/471圖9-17ZLG7290B典型應(yīng)用電路原理圖2023/2/472(2)功能概述如圖9-17所示,ZLG7290B可以掃描管理多達(dá)64個(gè)按鍵,K1~K56為普通按鍵,F(xiàn)0~F7為功能鍵。普通按鍵還有連擊檢測功能。ZLG7290B內(nèi)部有8個(gè)顯示緩沖寄存器DpRam0~DpRam7,它們直接決定數(shù)碼管顯示的內(nèi)容。ZLG7290B提供有兩種顯示控制方式,一種是直接向顯存寫入字型數(shù)據(jù),另一種是通過向命令緩沖寄存器寫入控制指令實(shí)現(xiàn)自動(dòng)譯碼顯示。訪問這些寄存器需要通過I2C總線接口來實(shí)現(xiàn)。ZLG7290B的I2C總線器件地址是70H(寫操作)和71H(讀操作)。訪問內(nèi)部寄存器要通過“子地址”來實(shí)現(xiàn)。2023/2/4734.寄存器詳解(1)系統(tǒng)寄存器SystemReg(地址:00H)系統(tǒng)寄存器的第0位稱作KeyAvi,標(biāo)志著按鍵是否有效,0-沒有按鍵被按下,1-有某個(gè)按鍵被按下。SystemReg寄存器的其它位暫時(shí)沒有定義。當(dāng)按下某個(gè)鍵時(shí),7290B的INT引腳會產(chǎn)生一個(gè)低電平的中斷請求信號。當(dāng)讀走鍵值后,中斷信號就會自動(dòng)撤銷。(2)鍵值寄存器Key(地址:01H)如果某個(gè)普通鍵(圖9-23中的K1~K56)被按下,則微控制器可以從鍵值寄存器Key中讀取相應(yīng)的鍵值1~56。如果微控制器發(fā)現(xiàn)ZLG7290B的INT引腳產(chǎn)生了中斷請求,而從Key中讀到的鍵值是0,則表示按下的可能是功能鍵。鍵值寄存器Key的值在被讀走后自動(dòng)變成0。2023/2/4743)連擊計(jì)數(shù)器RepeatCnt(地址:02H)

ZLG7290B為普通鍵(圖9-中的K1~K56)提供了連擊計(jì)數(shù)功能。所謂連擊是指按住某個(gè)普通鍵不松手,經(jīng)過一兩秒鐘的延遲后,開始連續(xù)有效,連續(xù)有效間隔時(shí)間為幾十到幾百個(gè)毫秒。當(dāng)按住某個(gè)普通鍵一直不松手時(shí):首先會產(chǎn)生一次中斷信號,這時(shí)連擊計(jì)數(shù)器RepeatCnt的值仍然是0;經(jīng)過一兩秒延遲后,會連續(xù)產(chǎn)生中斷信號,每中斷一次RepeatCnt就自動(dòng)加1;當(dāng)RepeatCnt計(jì)數(shù)到255時(shí)就不再增加,而中斷信號繼續(xù)有效。2023/2/475(4)功能鍵寄存器FunctionKey(地址:03H)ZLG7290B還提供有8個(gè)功能鍵(圖9-23中的F0~F7)。功能鍵常常是配合普通鍵一起使用的,就像電腦鍵盤上的Shift、Ctrl和Alt鍵,當(dāng)然也可以單獨(dú)使用。當(dāng)按下某個(gè)功能鍵時(shí),在/INT引腳也會像按普通鍵那樣產(chǎn)生中斷信號。功能鍵的鍵值是被保存在unctionKey寄存器中的。功能鍵寄存器FunctionKey的初始值是FFH,每一個(gè)位對應(yīng)一個(gè)功能鍵,第0位(LSB)對應(yīng)F0,第1位對應(yīng)F1,依次類推,第7位(MSB)對應(yīng)F7。某一功能鍵被按下時(shí),相應(yīng)的FunctionKey位就清零。(5)命令緩沖區(qū)CmdBuf0和CmdBuf1(地址:07H和08H)通過向命令緩沖區(qū)寫入相關(guān)的控制命令可以實(shí)現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。2023/2/476(6)閃爍控制寄存器FlashOnOff(地址:0CH)

FlashOnOff寄存器決定閃爍頻率和占空比。復(fù)位值為01110111B。高4位表示閃爍時(shí)亮的持續(xù)時(shí)間,低4位表示閃爍時(shí)滅的持續(xù)時(shí)間。改變FlashOnOff的值,可以同時(shí)改變閃爍頻率和占空比。特別說明:單獨(dú)設(shè)置FlashOnOff寄存器的值,并不會看到顯示閃爍,而應(yīng)該配合閃爍控制命令一起使用。(7)掃描位數(shù)寄存器ScanNum(地址:0DH)ScanNum寄存器決定掃描顯示的位數(shù),取值0~7,對應(yīng)1~8位。復(fù)位值是7,即數(shù)碼管的8位都掃描顯示。實(shí)際應(yīng)用中可能需要顯示的位數(shù)不足8位,例如只顯示3位,這時(shí)可以把ScanNum的值設(shè)置為2,則數(shù)碼管的第0、1、2位被掃描顯示,而第3~7位不會被分配掃描時(shí)間,所以不顯示。數(shù)碼管的掃描位數(shù)減少后,有用的顯示位由于分配的掃描時(shí)間更多因而顯示亮度得以提高。ScanNum寄存器的值為0時(shí),只有數(shù)碼管的第0位在顯示,亮度達(dá)到最大。2023/2/4779-2I2C總線接口技術(shù)(8)顯示緩沖區(qū)DpRam0~DpRam7(地址:10H~17H)DpRam0~DpRam7這8個(gè)寄存器的取值直接決定了數(shù)碼管的顯示內(nèi)容。每個(gè)寄存器的8個(gè)位分別對應(yīng)數(shù)碼管的a,b,c,d,e,f,dp段,MSB對應(yīng)a,LSB對應(yīng)dp。例如大寫字母H的字型數(shù)據(jù)為6EH(不帶小數(shù)點(diǎn))或6FH(帶小數(shù)點(diǎn))。2023/2/4785.控制命令詳解寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同組成命令緩沖區(qū)。通過向命令緩沖區(qū)寫入相關(guān)的控制命令可以實(shí)現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。(1)段尋址命令(SegOnOff)段尋址命令格式見表9-8所示。表9-8段尋址命令格式

D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D000000001on0S5S4S3S2S1S0在段尋址命令中,8位數(shù)碼管被看成是64個(gè)段,每一個(gè)段實(shí)際上就是一只獨(dú)立的LED。第1字節(jié)00000001B是命令字,為該命令的特征碼;第二字節(jié)中的on表示該段是否點(diǎn)亮,0-滅,1-亮;S5S4S3S2S1S0是64位段地址,取值0~63。在某1位數(shù)碼管內(nèi),各段的亮或滅的順序按照a,b,c,d,e,f,g,dp進(jìn)行。2023/2/479(2)下載數(shù)據(jù)命令(Download)下載數(shù)據(jù)命令格式見表9-9所示。表9-9下載數(shù)據(jù)命令D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D00110A3A2A1A0dpflash0d4d3d2d1d0

在第一字節(jié)中,高4位的0110是命令特征碼;A3A2A1A0是數(shù)碼管顯示數(shù)據(jù)的位地址(其中A3留作以后擴(kuò)展之用,實(shí)際使用時(shí)取0即可),位地址編號按從左到右的順序依次為0,1,2,3,4,5,6,7(以第本章中的圖9-23為準(zhǔn));dp控制小數(shù)點(diǎn)是否點(diǎn)亮,0-點(diǎn)亮,1-熄滅;flash表示是否要閃爍,0-正常顯示,1-閃爍;d4d3d2d1d0是要顯示的數(shù)據(jù),包括10種數(shù)字和21種字母。顯示數(shù)據(jù)按照表9-10中的規(guī)則進(jìn)行譯碼。2023/2/480表9-10下載數(shù)據(jù)并譯碼命令的數(shù)據(jù)表d4d3d2d1d0(二進(jìn)制)d4d3d2d1d0(十進(jìn)制)顯示結(jié)果0000000H00000101H10001002H20001103H30010004H40010105H50011006H60011107H70100008H82023/2/481表9-10下載數(shù)據(jù)并譯碼命令的數(shù)據(jù)表d4d3d2d1d0(二進(jìn)制)d4d3d2d1d0(十進(jìn)制)顯示結(jié)果0100109H9010100AHA010110BHb011000CHC01101ODHd01110OEHE01111OFHF1000010HG1000111HH2023/2/482表9-10下載數(shù)據(jù)并譯碼命令的數(shù)據(jù)表d4d3d2d1d0(二進(jìn)制)d4d3d2d1d0(十進(jìn)制)顯示結(jié)果1001012Hi1001113Hj1010014HL1010115Ho1011016Hp1011117Hq1100018Hr1100119Ht2023/2/483表9-10下載數(shù)據(jù)并譯碼命令的數(shù)據(jù)表d4d3d2d1d0(二進(jìn)制)d4d3d2d1d0(十進(jìn)制)顯示結(jié)果110101AHU110111BHy111001CHc111011DHh111101EHT111111FH(無顯示)2023/2/484(3)閃爍控制(Flash)閃爍控制命令格式見表9-11所示。表9-11閃爍控制D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D00111XXXXF7F6F5F4F3F2F1F0

在命令格式中,高4位的0111是命令特征碼;xxxx表示無關(guān)位,通常取值0000;第2字節(jié)的Fn(n=0~7)控制數(shù)碼管相應(yīng)位的閃爍屬性,0-正常顯示,1-閃爍。復(fù)位后,所有位都不閃爍。2023/2/4856.ZLG7290動(dòng)態(tài)數(shù)碼顯示程序設(shè)計(jì)在8個(gè)數(shù)碼管上從左到右顯示”20100725”,參考程序清單如下:SDA BITP1.0SCL BITP1.1WSLAEQU070H;ZLG7290器件的寫地址RSLAEQU071H;ZLG7290器件的讀地址

ORG 0000HLJMP0100HORG 0100H;主程序START: MOV 30H,#02H ;變量緩沖區(qū)定義顯示“20100725” MOV 31H,#00H ; MOV 32H,#01H ; MOV 33H,#00H MOV 34H,#00H2023/2/486 MOV 35H,#07H MOV 36H,#02H MOV 37H,#05H MOV DPTR,#LEDSEG ;數(shù)據(jù)指針指向字型碼表首地址

CLR A MOV R7,#08H MOV R0,#40H MOV R1,#30H LOOP1:MOVA,@R1;從變量緩沖區(qū)取出要形式的數(shù)字

MOVC A,@A+DPTR ;查表得字型碼

MOV @R0,A;將字型碼存儲到40H開始的單元中

INC R1 INC R0 DJNZR7,LOOP12023/2/487 LOOP: MOV R7,#08H MOV R0,#40H;字型碼首地址送R0 MOV R2,#10H;ZLG7290內(nèi)部顯示緩沖區(qū)首地址送R2 MOV R3,#WSLA;ZLG7290器件的寫地址送R3 LCALLWRNBYT;調(diào)用顯示子程序

LCALLDELAY SJMPLOOPLEDSEG:DB0FCH,60H,0DAH,0F2H,66H,0B8H,0BEH,0E4H;0-F共陰字型碼表

DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH DELAY:MOVR5,#00H;延時(shí)子程序

DELAY1:

MOVR6,#00H DJNZR6,$ DJNZR5,DELAY1 RET END2023/2/488上述調(diào)用的相關(guān)的I2C子程序(WRNBYT,WRBYT,STOP,CACK,START)參見9.2.2節(jié)的內(nèi)容。采用C語言編寫的參考程序#include“reg51.h”#include“intrins.h”#defineDEPLAY5US_nop_();_nop_();_nop_();_nop_();_nop_();sbitSDA=P1^0;sbitSCL=P1^1;#defineWSLA00x70#defineRSLA00x71#defineucharunsignedcharvoidSTA(void);voidSTOP(void);voidCACK(void);2023/2/489voidSendbyte(unsignedchar*p);voidSendnbyte(uchar*s3,uchar*s2,uchar*s0,ucharn);voidDELAY();voidmain(){ucharn,i,m,*c,*y,*x,wsubsla=0x10,WSLA=WSLA0;uchara[8]={2,0,1,0,0,7,2,5};/*顯示字符*/ucharb[8];/*存放顯示字符對應(yīng)的字型碼*/ucharzxm[16]={0xfc,0x60,0xda,0xf2,0x60,0xda,0xf2,0x66,0xbe,0xe4,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論