版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
一、學習目標1.了解D/A和A/D變換原理。2.掌握ADC0809使用方法。3.掌握DAC0832使用方法。4.掌握PCF8591的A/D以及D/A變換使用方法
二、學習任務
在自動檢測和自動控制等領域中,經(jīng)常需要對溫度、電壓、壓力等連續(xù)變化的物理量,即模擬量進行測量和控制,而計算機只能處理數(shù)字量,因此就出現(xiàn)了計算機信號的數(shù)/模(D/A)和模/數(shù)(A/D)轉換以及計算機與A/D和D/A轉換芯片的連接問題。本項目任務分解為具體個學習任務:任務一用ADC0808實現(xiàn)電壓表;任務二PCF8591實現(xiàn)電壓表。三、任務分解任務一用ADC0808實現(xiàn)電壓表【任務描述】數(shù)字電壓表(Digital
Voltmeter)簡稱DVM,它是采用數(shù)字化測量技術,把連續(xù)的模擬量(直流輸入電壓)轉換成不連續(xù)、離散的數(shù)字形式并加以顯示的儀表。傳統(tǒng)的指針式電壓表功能單一、精度低,不能滿足數(shù)字化時代的需求,采用單片機的數(shù)字電壓表,由精度高、抗干擾能力強,可擴展性強、集成方便。目前,由各種單片A/D
轉換器構成的數(shù)字電壓表,已被廣泛用于電子及電工測量、工業(yè)自動化儀表、自動測試系統(tǒng)等智能化測量領域,示出強大的生命力。使用芯片ADC0809將輸入的模擬量進行A/D變換,然后送數(shù)碼管顯示?!救蝿辗治觥渴煜DC0809模數(shù)轉換原理,掌握其驅動方法?!鞠嚓P知識】一、A/D變化之ADC0809芯片介紹ADC0809是帶有8位A/D轉換器、8路多路開關以及微處理機兼容的控制邏輯的CMOS組件。它是逐次逼近式A/D轉換器(限于篇幅,對逐次逼近式A/D轉換器原理不做介紹,請參閱相關資料),可以和單片機直接接口。1.主要特性8路8位A/D轉換器,即分辨率8位;具有轉換起??刂贫?;轉換時間為100μs;單個+5V電源供電;模擬輸入電壓范圍0~+5V,不需零點和滿刻度校準;工作溫度范圍為-40~+85攝氏度;低功耗,約15mW;2.內部結構ADC0809是CMOS單片型逐次逼近式A/D轉換器,內部結構如圖所示,它由8路模擬開關、地址鎖存與譯碼器、比較器、8位開關樹型D/A轉換器、逐次逼近寄存器、三態(tài)輸出鎖存器等其它一些電路組成。3.外部特性(引腳功能)ADC0809芯片有28條引腳,如圖9-2所示,采用雙列直插式封裝,下面說明各引腳功能。
IN0~IN7:8路模擬量輸入端。D7~D0——數(shù)據(jù)輸出線。為三態(tài)緩沖輸出形式,可以和單片機的數(shù)據(jù)線直接相連。D0為最低位,D7為最高。ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路。ALE:地址鎖存允許信號,輸入,高電平有效。START:A/D轉換啟動信號,輸入,高電平有效。EOC:A/D轉換結束信號,輸出,當A/D轉換結束時,此端輸出一個高電平(轉換期間一直為低電平)OE:數(shù)據(jù)輸出允許信號,輸入,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態(tài)門,輸出數(shù)字量。CLK:時鐘脈沖輸入端。要求時鐘頻率不高于640KHZ。REF(+)、REF(-):基準電壓。Vcc:電源,單一+5V。GND:地。ADC0809的工作過程是:首先輸入3位地址,并使ALE=1,將地址存入地址鎖存器中。此地址經(jīng)譯碼選通8路模擬輸入之一到比較器。START上升沿將逐次逼近寄存器復位。下降沿啟動A/D轉換,之后EOC輸出信號變低,指示轉換正在進行。直到A/D轉換完成,EOC變?yōu)楦唠娖?,指示A/D轉換結束,結果數(shù)據(jù)已存入鎖存器,這個信號可用作中斷申請。當OE輸入高電平時,輸出三態(tài)門打開,轉換結果的數(shù)字量輸出到數(shù)據(jù)總線上?!救蝿諏嵤空f明:使用ADC0808,ADC0809之類的AD,一般都從單片機的ALE引腳直接取信號,ALE信號的頻率約為晶振頻率的1/6(方波),假定晶振為12MHz,則ALE出來的方波頻率為2MHz,然后用74HC74進行兩次二分頻,也就是除4,獲得500KHz的方波,就可以送AD的CLK了。也可以使用單片機定時器產(chǎn)生500KHz的方波作為ADC0809的時鐘,這里為簡化程序,直接在Proteus中使用方波信號激勵源,產(chǎn)生頻率直接填為500KHz?;贏DC0809的數(shù)字電壓表對應的程序代碼如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDuanArr[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數(shù)點的編碼ucharcodedispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharcodeshiftbitcode[]={0xf7,0xfb,0xfd,0xfe};uchargetdata,dispbuf[4];uinti,j,temp;sbitST=P3^0;sbitOE=P3^1;sbitEOC=P3^2;sbitALE=P3^7;voidDelay(unsignedinti);voiddelay1(ucharx){uchari,j;for(i=x;i>0;i--)for(j=114;j>0;j--);}voidDelay(unsignedinti){unsignedintj;for(;i>0;i--){for(j=0;j<125;j++){;}}}voidDisplay(){for(i=0;i<4;i++){ if(i==2){P1=DuanArr[dispbuf[i]];}else{P1=dispbitcode[dispbuf[i]];} P2=shiftbitcode[i]; Delay(10);P1=0x00;}}voidmain(){while(1){ST=0; delay1(10); ST=1;//上升沿時內部寄存器清零
delay1(10);ALE=1;ST=0;//下降沿時開始AD轉換
OE=1;//允許讀出轉換結果
while(EOC==0);OE=1;getdata=P0;
OE=0;
temp=getdata*1.0/255*500;dispbuf[0]=temp%10;
dispbuf[1]=temp/10%10;dispbuf[2]=temp/100%10;dispbuf[3]=temp/1000;Display();}}【進階提高】一、D/A轉換芯片DAC0832介紹D0~D7:數(shù)字信號輸入端。ILE:輸入寄存器允許,高電平有效。CS:片選信號,低電平有效。WR1:寫信號1,低電平有效。XFER:傳送控制信號,低電平有效。WR2:寫信號2,低電平有效。IOUT1、IOUT2:DAC電流輸出端。Rfb:是集成在片內的外接運放的反饋電阻。Vref:基準電壓(-10~10V)。Vcc:是源電壓(+5~+15V)。AGND:模擬地NGND:數(shù)字地,可與AGND接在一起使用。DAC0832輸出的是電流,一般要求輸出是電壓,所以還必須經(jīng)過一個外接的運算放大器轉換成電壓。根據(jù)對DAC0832的輸入寄存器和DAC寄存器不同控制方法,DAC0832有如下3種工作方式:單緩沖方式。單緩沖方式是控制輸入寄存器和DAC寄存器同時接收資料,或者只用輸入寄存器而把DAC寄存器接成直通方式。此方式適用只有一路模擬量輸出或幾路模擬量異步輸出的情形;雙緩沖方式。雙緩沖方式是先使輸入寄存器接收資料,再控制輸入寄存器的輸出資料到DAC寄存器,即分兩次鎖存輸入資料。此方式適用于多個D/A轉換同步輸出的情節(jié);直通方式。直通方式是資料不經(jīng)兩級鎖存器鎖存,即,,,均接地,ILE接高電平。此方式適用于連續(xù)反饋控制線路,不過在使用時,必須通過另加I/O接口與CPU連接,以匹配CPU與D/A轉換。DAC0832對應的程序代碼如下:#include<reg51.h>#include<intrins.h>#include<ABSACC.H> #defineucharunsignedchar#definedata_OUTXBYTE[0x7FFF]//定義DAC0832端口地址//產(chǎn)生方波等所需要的數(shù)字量charcodedat[]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};bitflag=0;voiddelay(unsignedintN){inti;for(i=0;i<N;i++);}voidconversion_once_0832(unsignedcharout_data){data_OUT=out_data;//輸出數(shù)據(jù)
delay(10);//延時等待轉換
}ucharkeyscan(){ucharkey;if(P1!=0xff){delay(61);key=P1;if(key!=0xff)flag=~flag;return(key);}}voidtriangle(){uchark;for(k=0;k<255;k++)conversion_once_0832(k);for(;k>0;k--)conversion_once_0832(k);}voidpulse(){conversion_once_0832(0xff);delay(1000);conversion_once_0832(0x00);delay(1000);}voidfun3(){ucharj;for(j=0;j<255;j++)conversion_once_0832(j);}voidfun4(){uchari;for(i=0;i<255;i++){conversion_once_0832(dat[i]);}}voidmain(){uchartemp;while(1){temp=keyscan();switch(temp){ case0xfe: do{ triangle(); }while(keyscan()&&(flag==1));break; case0xfd:do{ pulse();
}while(keyscan()&&(flag==1));break; case0xfb:do{ fun3(); }while(keyscan()&&(flag==1));break;case0xf7:do{ fun4(); }while(keyscan()&&(flag==1));break; default:break; }}}
二、用ADC0808進行直流電機轉速控制下面給出一般直流電機驅動電路當三極管的集極電壓小于死區(qū)電壓時三極管截止,則電動機不轉動;當集極電壓大于死區(qū)電壓而小于飽和電壓時三極管處于放大狀態(tài),隨著集極電壓改變,從而改變了直流電動機兩端的壓降也就改變了電機的轉速。具體原理為集極的電壓大小不一樣,三極管的電壓放大倍數(shù)也不一樣從而起到調速作用改變直流電動機的旋轉速度。#include<reg52.h>unsignedinttemp;sbitST=P3^0;//定義ADC0808/0809啟動轉換命令sbitOE=P3^1;//定義ADC0808/0809數(shù)據(jù)輸出允許位sbitEOC=P3^2;//定義ADC0808/0809轉換結束信號sbitCLK=P3^3;//定義ADC0808/0809時鐘脈沖輸入位sbitP36=P3^6;sbitMOTOR=P1^0;//直流電機轉速控制/*由delay參數(shù)確定延遲時間*/#include<reg52.h>unsignedinttemp;sbitST=P3^0;//定義ADC0808/0809啟動轉換命令sbitOE=P3^1;//定義ADC0808/0809數(shù)據(jù)輸出允許位sbitEOC=P3^2;//定義ADC0808/0809轉換結束信號sbitCLK=P3^3;//定義ADC0808/0809時鐘脈沖輸入位sbitP36=P3^6;sbitMOTOR=P1^0;//直流電機轉速控制/*由delay參數(shù)確定延遲時間*/voidmDelay(unsignedchardelay){unsignedinti;for(;delay>0;delay--)for(i=0;i<124;i++);}voidmain(){while(1){ST=0;OE=0;ST=1;ST=0;
P36=0;while(EOC==0);OE=1;temp=P0; //讀取A/D轉換結果
MOTOR=1;mDelay(temp);MOTOR=0; //A/D轉換結果送電
temp=255-temp;mDelay(temp); OE=0;
}}任務2PCF8591實現(xiàn)電壓表【任務描述】本項目的目的就是使用單片機AT89C51、PCF85919轉換器、數(shù)碼管設計一塊數(shù)字電壓表。該電壓表能準確測量0~5V之間的直流電壓值,其測量最小分辨率為0.02V。項目在實施過程中需要解決以下關鍵問題:PCF8591芯片的轉換特性以及它與單片機的接口電路;LED數(shù)碼管顯示原理及接口電路設計;【任務分析】熟悉PCF8591的硬件結構以及熟悉PCF8591的驅動方法?!局R鏈接】概述單電源供電工作電壓:2.5V~6V待機電流低I2C總線串行輸入/輸出通過3個硬件地址引腳編址采樣速率取決于I2C總線速度4個模擬輸入可編程為單端或差分輸入自動增量通道選擇模擬電壓范圍:VSS~VDD片上跟蹤與保持電路8位逐次逼近式A/D轉換帶一個模擬輸出的乘法DAC引腳說明PCF8591共16引腳,如圖9-12所示,引腳說明如下:ANI0~ANI3為模擬信號輸入端,不使用的輸入端應接地A0~A2地址輸入端GND、VCC地和電源端(+5V)SDA為I2C數(shù)據(jù)輸入與輸出端SCL為I2C時鐘輸入端EXT內外部時鐘選擇端,使用內部時鐘時接地,使用外部時鐘時接+5VOSC外部時鐘輸入、內部時鐘輸出端,不使用時應懸空AGND模擬信號地,如果有比較復雜的模擬電路,那么AGND部分在布局布線上要特別處理VREF基準電壓輸入端AOUTD/A轉換后的電壓輸出端3.功能說明PCF8591是具有I2C總線接口的8位A/D及D/A轉換器,具有4路A/D輸入,1路D/A輸出。PCF8591采用典型的I2C總線接口器件尋址方法,即總線地址由器件地址(1001,1001為固定值)、引腳地址(由A0~A2接地或+5V來確定,接地代表0;接+5V代表1,即此3位用戶可以自定義)、方向位(即R/W)組成。因此,在I2C總線系統(tǒng)中最多可接8個這樣的器件。器件地址字節(jié):由器件地址、引腳地址、方向位組成,它是通信時主機發(fā)送的第一字節(jié)數(shù)據(jù),主要作用是器件地址和讀寫控制,所示:R/W=1表示讀操作,R/W=0表示寫操作。如將A0~A2接地,則讀地址為91H;寫地址為90H??刂谱止?jié)寄存器:用于控制PCF8951的輸入方式、輸入通道、D/A轉換等,是通信時主機發(fā)送的第二字節(jié)數(shù)據(jù)。假若D7~D0=0X00,表示寫入控制字00,即模擬量輸出關閉,選擇通道0,不自動增加通道,模擬量輸入為方式0。器件地址必須是起始條件后作為第一個字節(jié)發(fā)送。發(fā)送給PCF8591的第二個字節(jié)被存儲在控制寄存器,用于控制寄存器的功能。發(fā)送給PCF8591的第三個字節(jié)被存儲到DAC數(shù)據(jù)寄存器。并使用片上D/A轉換成相應的模擬電壓。一個A/D轉換周期總是開始于發(fā)送一個有效讀模式地址給PCF8591之后。A/D轉換周期在應答時鐘脈沖的后沿被觸發(fā)。操作分四步:(1)發(fā)送地址字節(jié),選擇該器件。(2)發(fā)送控制字節(jié),選擇相應通道。
(3)重新發(fā)送地址字節(jié),選擇該器件。(4)接收目標通道的數(shù)據(jù)?!救蝿諏嵤炕赑CF8591的數(shù)字電壓表對應的程序代碼如下:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitsda=P1^4;//自定義由普通IO口模擬I2Csbitscl=P1^5;ucharbuffer[3];ucharcodeDuanArr[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數(shù)點的編碼ucharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰,無小數(shù)點的編碼voidDelay(uintn){ uinti,j; for(i=n;i>0;i--) for(j=110;j>0;j--);}voiddelay()//延時幾微秒。延時函數(shù)在很多函數(shù)里都要用它。至少要大于4.7us{;;}//當你把這個函數(shù)寫在用它這個函數(shù)的前面就不用聲明了voidinit()//初始化總線。將總線都拉高以釋放{ scl=1; delay();//I2C總線使用時一般都要延時5us左右
sda=1; delay();}voidstart()//啟始信號。時鐘信號為高電平期間,數(shù)據(jù)總線產(chǎn)生下降沿。{//為什么要下降沿,且sda先要為1。因為先要保證數(shù)據(jù)線為空才能工作
sda=1;//先釋放數(shù)據(jù)總線。高電平釋放
delay(); scl=1; delay(); sda=0; delay();}voidstop(){ sda=0;//先要有工作狀態(tài)才能釋放,sda=0時在工作狀態(tài)
delay(); scl=1; delay(); sda=1;//釋放數(shù)據(jù)總線
delay();}voidrespons()//應答函數(shù){ uchari=0; scl=1;//每個字節(jié)發(fā)送完后的第九個時鐘信號的開始
delay(); while((sda==1)&&(i<255))//此處i的定義使用了uchar.只要填一個小于255的就行
i++;//此處的sda是從機的
scl=0;//表示主器件默認從器件已經(jīng)收到而不再等待。不再等待之后,時鐘的高電平過了就是低電平,所以scl=0 //此時第幾9個時鐘信號結束}voidwritebyte(uchard)//寫一字節(jié),每次左移一位{ uchari,temp; temp=d;
for(i=0;i<8;i++) { temp=temp<<1; scl=0;//數(shù)據(jù)傳輸期間要想sda可變,先把時鐘拉低。此處要給sda賦值
delay();sda=CY;//CY為左移移入PSW寄存器中的的CY位。
delay(); scl=1;//sda有數(shù)據(jù)了。保持數(shù)據(jù)穩(wěn)定
delay(); } scl=0;//此處是寫數(shù)據(jù),是屬于數(shù)據(jù)傳輸過程中。只有在時鐘信號為低電平期間
delay();//數(shù)據(jù)總線才可以變化。
sda=1;//所以要想釋放數(shù)據(jù)總線,就必須先把時鐘拉低
delay(); /*此處釋放總線寫在末尾是因為調用它時,前面有起始函數(shù)釋放了總線*/}ucharreadbyte(){ uchari,k; scl=0; delay(); sda=1; delay(); /*此處釋放總線放在前面是因為一般都是先寫后讀,保險起見,釋放一下總線*/ for(i=0;i<8;i++) { scl=1;//一個時鐘信號的開始
delay(); k=(k<<1)|sda;//實質是把sda的數(shù)據(jù),最先傳來的放在最高位,依次往下排
scl=0;//一個時鐘信號結束delay(); } returnk;}voiddisplay(uintn){uchari,buffer[3];buffer[0]=n/100; buffer[1]=n/10%10; buffer[2]=n%10;
for(i=0;i<3;i++) { if((i==0)){ P0=DuanArr[buffer[i]]; }else{ P0=Disp_Tab[buffer[i]];} P2=i+5; Delay(5); P0=0x00;//去掉消隱}}ucharread(ucharaddr){ uchardat; start(); writebyte(0x90);//從此處的發(fā)送地址和方向位0到從機
respons();//此處的從機產(chǎn)生應答。屬于“偽寫”。用于確定和哪臺機子通信
writebyte(addr); respons(); start(); writebyte(0x91);//從此處開始,從機向主機寫數(shù)據(jù)。讀的方向位為1 respons(); dat=readbyte(); stop(); returndat;//讀得的數(shù)據(jù)要返回}voidmain(){ ucharADC_Val=0; floatfADC_Val; init(); while(1) { ADC_Val=read(0x00);//寫入控制字0x00,即模擬量輸出關閉,選擇通道0等操作
fADC_Val=(float)ADC_Val*5/256.0; //參考電壓為5V display((uint)(fADC_Val*100)); //將浮點數(shù)轉換成無符號整型,以便數(shù)碼管顯示
}}【進階提高】將本任務中轉化成的數(shù)字量進行DA變化,通過電壓表來觀測?;赑CF8591的A/D和D/A驗證對應的程序代碼如下:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitsda=P1^4;//自定義由普通IO口模擬I2Csbitscl=P1^5;ucharbuffer[3];ucharcodeDuanArr[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數(shù)點的編碼ucharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰,無小數(shù)點的編碼voidDelay(uintn){ uinti,j; for(i=n;i>0;i--) for(j=110;j>0;j--);}voiddelay()//延時幾微秒。延時函數(shù)在很多函數(shù)里都要用它。至少要大于4.7us{;;}//當你把這個函數(shù)寫在用它這個函數(shù)的前面就不用聲明了voidinit()//初始化總線。將總線都拉高以釋放{ scl=1; delay();//I2C總線使用時一般都要延時5us左右
sda=1; delay();}voidstart()//啟始信號。時鐘信號為高電平期間,數(shù)據(jù)總線產(chǎn)生下降沿。{//為什么要下降沿,且sda先要為1。因為先要保證數(shù)據(jù)線為空才能工作
sda=1;//先釋放數(shù)據(jù)總線。高電平釋放
delay(); scl=1; delay();sda=0; delay();}voidstop(){ sda=0;//先要有工作狀態(tài)才能釋放,sda=0時在工作狀態(tài)
delay(); scl=1; delay(); sda=1;//釋放數(shù)據(jù)總線
delay();}voidrespons()//應答函數(shù){ uchari=0; scl=1;//每個字節(jié)發(fā)送完后的第九個時鐘信號的開始
delay(); while((sda==1)&&(i<255))//此處i的定義使用了uchar.只要填一個小于255的就行
i++;//此處的sda是從機的
scl=0;//表示主器件默認從器件已經(jīng)收到而不再等待。不再等待之后,時鐘的高電平過了就是低電平,所以scl=0 //此時第酒個時鐘信號結束}voidwritebyte(uchard)//寫一字節(jié),每次左移一位{ uchari,temp; temp=d; for(i=0;i<8;i++) { temp=temp<<1; scl=0;//數(shù)據(jù)傳輸期間要想sda可變,先把時鐘拉低。此處要給sda賦值
delay(); sda=CY;//CY為左移移入PSW寄存器中的的CY位。
delay();
scl=1;//sda有數(shù)據(jù)了。保持數(shù)據(jù)穩(wěn)定
delay(); } scl=0;//此處是寫數(shù)據(jù),是屬于數(shù)據(jù)傳輸過程中。只有在時鐘信號為低電平期間
delay();//數(shù)據(jù)總線才可以變化。
sda=1;//所以要想釋放數(shù)據(jù)總線,就必須先把時鐘拉低
delay(); /*此處釋放總線寫在末尾是因為調用它時,前面有起始函數(shù)釋放了總線*/}ucharreadbyte(){ uchari,k; scl=0; delay(); sda=1; delay(); /*此處釋放總線放在前面是因為一般都是先寫后讀,保險起見,釋放一下總線*/ for(i=0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物流園區(qū)建設與運營管理合同
- 二零二五年度出口退稅證明開具與國際物流配送服務合同3篇
- 2024物業(yè)租賃合同協(xié)議范本
- 2024網(wǎng)絡游戲代理運營合同
- 2025年度新型材料研發(fā)中心廠房租賃協(xié)議范本4篇
- 2025廠區(qū)食堂承包合同樣本:營養(yǎng)健康食譜定制版3篇
- 2025年度智慧園區(qū)場地服務合同范本7篇
- 2024年03月中國銀行股份有限公司2024年春季招考筆試歷年參考題庫附帶答案詳解
- 2025年度文化產(chǎn)業(yè)園場地承包經(jīng)營合作協(xié)議范本4篇
- 2025年度產(chǎn)業(yè)園區(qū)企業(yè)服務中心租賃合同4篇
- 2023光明小升初(語文)試卷
- 三年級上冊科學說課課件-1.5 水能溶解多少物質|教科版
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設計原則、計算和檢驗
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 小學道德與法治學科高級(一級)教師職稱考試試題(有答案)
- 申請使用物業(yè)專項維修資金征求業(yè)主意見表
- 河北省承德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 實用性閱讀與交流任務群設計思路與教學建議
- 應急柜檢查表
- 通風設施標準
- 酒店市場營銷教案
評論
0/150
提交評論