51八只LED燈做流水燈實(shí)驗(yàn)知識(shí)分享_第1頁(yè)
51八只LED燈做流水燈實(shí)驗(yàn)知識(shí)分享_第2頁(yè)
51八只LED燈做流水燈實(shí)驗(yàn)知識(shí)分享_第3頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、51八只LED燈做流水燈實(shí)驗(yàn)第一節(jié):?jiǎn)纹瑱C(jī)在上電初始后,其各端口輸出為高電平。如果我們現(xiàn)在想讓接在P1.0口的LED1亮,那么我們只要把P1.0口的電平變?yōu)榈碗娖骄涂梢粤?。想讓LED1滅,LED0亮,只需將P1.0升高,P1.1變低,LED1就熄滅LED2隨后既點(diǎn)亮!依始類(lèi)推如下所示8只LED變會(huì)一亮一暗的做流水燈了。本實(shí)驗(yàn)在SP-51實(shí)驗(yàn)板”學(xué)習(xí)套件上的相關(guān)圖紙:P1.0低、P1.0高、P1.1低、P1.1高、P1.2低、P1.2高、P1.3低、P1.3高、P1.4低、P1.4高、P1.5低、P1.5高、P1.6低、P1.6高、P1.7低、P1.7高、返回到開(kāi)始、程序結(jié)束。我們不能說(shuō)P1.1

2、你變低,它就變低了。因?yàn)閱纹瑱C(jī)聽(tīng)不懂我們的漢語(yǔ)的,只能接受二進(jìn)制的“、0代”碼。我們又怎樣來(lái)用二進(jìn)制語(yǔ)議論使單片機(jī)按我們的意思去工作呢?為了讓單片機(jī)工作,只能將程序?qū)憺槎M(jìn)制代碼交給其執(zhí)行;早期單片機(jī)開(kāi)發(fā)人員就是使用人工編寫(xiě)的二進(jìn)制代碼交給單片機(jī)去工作的。今天,我們不必用煩人的二進(jìn)制去編寫(xiě)程序,完全可以將我們?nèi)菀桌斫獾某绦蛘Z(yǔ)言”通過(guò)翻譯軟件翻譯”成單片機(jī)所需的二進(jìn)制代碼,然后交給單片機(jī)去執(zhí)行。這里的程序語(yǔ)言”目前主要有匯編和C兩種;在這里我們所說(shuō)的翻譯軟件,同行們都叫它為編譯器”,將程序語(yǔ)言”通過(guò)編譯器產(chǎn)生單片機(jī)的二進(jìn)制代碼的過(guò)程叫編譯。前面說(shuō)到,要想使LED1變亮,只需將對(duì)應(yīng)的單片機(jī)引腳電平

3、變?yōu)榈碗娖骄涂梢粤恕,F(xiàn)在讓我們將上面提到的8只LED流水燈實(shí)驗(yàn)寫(xiě)為匯編語(yǔ)言程序。漢語(yǔ)”語(yǔ)言匯編語(yǔ)言開(kāi)始:star:P1.0低clrp1.0P1.0高setbp1.0P1.1低clrp1.1P1.1高setbp1.1P1.2低clrp1.2P1.2高setbp1.2P1.3低clrp1.3P1.3高setbp1.3P1.4低clrp1.4P1.4高setbp1.4P1.5低clrp1.5P1.5高setbp1.5P1.6低clrp1.6P1.6高setbp1.6P1.7低clrp1.7P1.7高setbp1.7返回到開(kāi)始ljmpstar結(jié)束end這里用到了四條匯編指令:clr、setb、Ijmp

4、、end;clr:是將其后面指定的位清為0;setb:是將其后面指定的位置成1;Ijmp:是無(wú)條件跳轉(zhuǎn)指令,意思是:跳轉(zhuǎn)到指定的標(biāo)號(hào)處繼續(xù)運(yùn)行。end:是一條告訴編譯器:程序到此結(jié)束的偽指令。偽指令只告訴編譯器此程序到此有何要求或條件,它不參與和影響程序的執(zhí)行。這里需要說(shuō)明的是,按匯編語(yǔ)法要求,所編制的程序(下稱(chēng)源程序)之格式和書(shū)寫(xiě)要求必須依下列原則:1、源程序必須為純文本格式文件,如用Windows附件沖的記事本”編寫(xiě)的文本文件;2、源程序的擴(kuò)展名應(yīng)是*.ASM;3、一行只能寫(xiě)一條語(yǔ)句,以回車(chē)作為本句的結(jié)束,每一語(yǔ)句行長(zhǎng)度應(yīng)少于80個(gè)字符(即40個(gè)漢字)。4、每行的格式應(yīng)為:標(biāo)號(hào):命令參數(shù);

5、注釋即一行由四部份組成,各部份的順序不能搞錯(cuò),依實(shí)際要求可以缺省其中的一部份或幾部份,甚至全部省去,即空白行。需要使用標(biāo)號(hào)時(shí)標(biāo)號(hào)后面必須有:“”(冒號(hào)),而命令語(yǔ)句和參數(shù)之間必須用空格分開(kāi),如果命令有多個(gè)參數(shù),則參數(shù)與參數(shù)之間必須用,“”(逗號(hào))分開(kāi),需要注釋時(shí)注釋前必須用;”(分號(hào)),;”后面的語(yǔ)句可以寫(xiě)任何字符,包括漢字用于解釋前面的匯編語(yǔ)句,它將不參與匯編,不生成代碼。由于匯編程序?qū)ξ覀冞€不直觀,所以在編寫(xiě)源程序時(shí),應(yīng)當(dāng)養(yǎng)成多寫(xiě)注釋的習(xí)慣,這樣有助于今后源程序的閱讀和維護(hù)。標(biāo)號(hào)是標(biāo)志程序中某一行的符號(hào)名,編譯后標(biāo)號(hào)的數(shù)值就是標(biāo)號(hào)所在行代碼的地址。在宏匯編ASM51中標(biāo)號(hào)的長(zhǎng)度不受限制,但

6、標(biāo)號(hào)中不能包含:或其它的一些特殊符號(hào),也不能用漢字,可以用數(shù)字作標(biāo)號(hào),但必須用字母開(kāi)頭。當(dāng)標(biāo)號(hào)作參數(shù)用(如標(biāo)號(hào)作轉(zhuǎn)移地址),在命令后面岀現(xiàn)時(shí),必須舍去:(如上面程序中的LJMPSTAR中的STAR是不能再有:)。每行只能有一個(gè)標(biāo)號(hào),一個(gè)標(biāo)號(hào)只能用在一處,如果有兩行用了同一個(gè)標(biāo)號(hào),則匯編時(shí)就會(huì)出錯(cuò)。由于標(biāo)號(hào)的長(zhǎng)度沒(méi)有限制,可以用有意義的英文或漢語(yǔ)拼音來(lái)說(shuō)明行,使源程序讀起來(lái)更方便。源程序中的字母不區(qū)分大小寫(xiě),也就是說(shuō)star和STAR是一樣的,請(qǐng)不要用大小寫(xiě)方式去區(qū)分不同的標(biāo)號(hào)。好拉!規(guī)矩知道了,現(xiàn)在該來(lái)看看前面我們編寫(xiě)的源程序該怎樣處理了:編寫(xiě)源程序:先將編譯軟件安裝好(c51eval軟件的安

7、裝)。軟件安裝好我們就可以編寫(xiě)程序了。第一步:雙擊Uvw51圖標(biāo),出現(xiàn)如圖一所示的主界面第二步:新建文件這時(shí)我們就中以在這里編輯程序了。如圖二所示單擊菜單欄內(nèi)的文件-新建”或者單擊圖標(biāo)按鈕則在上圖所示的灰色區(qū)域內(nèi)岀現(xiàn)一個(gè)白色的編輯區(qū),圖二第三步:編程程序建立了一個(gè)新的編程文件后,我們就可以在這里編寫(xiě)我們所需要的程序了,下面我們就來(lái)編寫(xiě)前面所說(shuō)的程序吧。!如圖三所示:第四步:保存文件程序編寫(xiě)好了,我們當(dāng)然要記得保存了,要不我們編寫(xiě)程序就白費(fèi)勁了。好了,下面我們將上面編寫(xiě)的程序保存起來(lái):?jiǎn)螕粑募?保存”或者單擊圖標(biāo)匚,出現(xiàn)如圖四所示的對(duì)話(huà)框:圖四這時(shí)參照?qǐng)D五所示將對(duì)話(huà)框的內(nèi)容設(shè)置好:c51eval

8、保存文件時(shí)默認(rèn)的文件擴(kuò)展是名*.C,請(qǐng)按圖五所示改變?yōu)闉?.a51:圖五我們這里就先將文件保存在D/DDW文件夾中,文件名你可以隨便取,這里先叫他為L(zhǎng)ED.a51;需強(qiáng)調(diào)的是保存文件的文件夾和文件名不能使用中文!即保存文件時(shí)不能以如下格式保存:正確的保存路徑:D/DDW/LED.a51當(dāng)然,保存的文件夾名DDW、編寫(xiě)的程序的文件名LED,你都可以隨意的取一個(gè),可以是D/ABC/000.a51。這就取決于你的興趣了。錯(cuò)誤的保存路徑:D/源程序/DDW/LED.a51,或者是D/DDW流水燈程序.a51??傊谠闯绦虻谋4媛窂较虏荒苡兄形牡膶绗F(xiàn),同時(shí)文件名不能取的太長(zhǎng)。第五步:建立項(xiàng)目將匯編的源程

9、序保存后,還沒(méi)有得到我們所需要的文件,這時(shí)我們還需要再建立項(xiàng)目,以便得到我們所需的hex文件。新建項(xiàng)目的步驟如下:首先先打開(kāi)新建項(xiàng)目的對(duì)話(huà)框文件,如圖六所示:圖六點(diǎn)擊新建項(xiàng)目后岀現(xiàn)如圖七所示的對(duì)話(huà)框,我們將對(duì)話(huà)框的參數(shù)設(shè)定好。將文件名設(shè)置成與剛才源程序的文件名相同,即設(shè)為L(zhǎng)ED.prj,同時(shí)保存的路徑跟前面的源程序保存的路徑一樣,在D/DDW上?,F(xiàn)在就可以把剛才建立的項(xiàng)目文件LED.prj添加到剛保存的LED.A51源程序上了,注意它們都在同一個(gè)根目錄下。圖七按圖七所示操作后,會(huì)出現(xiàn)如圖八所示的對(duì)話(huà)框:圖八點(diǎn)擊“(A)加”出現(xiàn)如圖九所示畫(huà)面:圖九按圖九所示完成操作后,軟件會(huì)自動(dòng)打開(kāi)一個(gè)對(duì)話(huà)框,

10、如圖十所示:圖十如圖十所示點(diǎn)擊保存后,系統(tǒng)會(huì)自動(dòng)回復(fù)到匯編狀態(tài)。這時(shí)點(diǎn)擊*創(chuàng)建所有圖標(biāo)*按鈕,則進(jìn)行了轉(zhuǎn)換,并出現(xiàn)如圖十一所示的狀態(tài)顯示畫(huà)面:圖十一完成上述操作后,在圖十一,我們看到了創(chuàng)建成功了的提示畫(huà)面,這時(shí)我們點(diǎn)擊0K就大功告成了。打開(kāi)我們文件的保存路徑:我的電腦/D/DDW我們可以看到包含hex文件在內(nèi)的所有相關(guān)程序文件了。我們上面的項(xiàng)目文件也在其中了。他的名字叫作LED.hex文件。好啦,到此我們已將第一個(gè)流水燈程序編寫(xiě)、編譯、燒寫(xiě)進(jìn)行完啦,再下來(lái)就是將燒寫(xiě)好的AT89C51從編程器上取下,放到SP-51實(shí)驗(yàn)板”學(xué)習(xí)套件的實(shí)驗(yàn)部份通電讓LED1LED8流水”說(shuō)明:由于單片機(jī)的時(shí)鐘高達(dá)1

11、2MHz,8個(gè)LED發(fā)光與熄滅的時(shí)間很短,實(shí)際實(shí)驗(yàn)結(jié)果憑我們的肉眼是看不到流水效果的!那怎樣才能讓我們?nèi)庋劭吹搅魉睙粜Ч???qǐng)繼續(xù)學(xué)習(xí)下節(jié)課流水燈實(shí)驗(yàn)詳解二上一節(jié)的實(shí)驗(yàn)最后沒(méi)有得到“流水”顯示的效果,主要是單片機(jī)執(zhí)行每條指令的時(shí)間很短,我們?nèi)庋蹮o(wú)法看到LED的熄滅與點(diǎn)亮。單片機(jī)內(nèi)部能按部就班的自動(dòng)工作,正是在系統(tǒng)時(shí)鐘的作用下,內(nèi)部各邏輯硬件產(chǎn)生各種所需脈沖信號(hào)而實(shí)現(xiàn)的。這個(gè)時(shí)鐘信號(hào)(既晶體振蕩信號(hào))的周期稱(chēng)“振蕩周期”。我們這個(gè)實(shí)驗(yàn)中晶體使用的是12MHZ.在單片機(jī)中,要處理最短周期的一條指令需要由12個(gè)振蕩周期(既晶振振蕩周期)組成的,這個(gè)叫“機(jī)器周期”。8051核的單片機(jī),大多數(shù)指令只用

12、一個(gè)機(jī)器周期(既單周期),也有雙周期和四周期的指令。本實(shí)驗(yàn)中用到的SETBP.x和CLRP.x均屬于單周期指令,也就是說(shuō),執(zhí)行一句SETBP.x用時(shí)僅1uS(微秒),CLRP.x也是1uS;難怪我們前面的程序不能看到流水效果?,F(xiàn)在,將程序改動(dòng)一下,在每點(diǎn)亮一個(gè)LED后,讓程序干點(diǎn)別的事,也就是讓它等一會(huì)再將該LED熄滅,繼續(xù)執(zhí)行下面的程序:DDW:;程序開(kāi)始CLRP1.0;LED1亮ACALLDELAY;調(diào)用延時(shí)子程序SETBP1.0;LED1滅CLRP1.1;換燈,同上ACALLDELAYSETBP1.1?CLRP1.2ACALLDELAY帚SETBP1.2?CLRP1.3?ACALLDEL

13、AY?SETBP1.3?CLRP1.4曠ACALLDELAYSETBP1.4CLRP1.5曠ACALLDELAY?SETBP1.5?CLRP1.6?ACALLDELAY?SETBP1.6?CLRP1.7?ACALLDELAY?SETBP1.7?LJMPDDW;返回到開(kāi)始循環(huán)DELAY:?;延時(shí)子程序MOVR1,#50AD10:?MOVR2,#100帚AD11:?MOVR3,#100?DJNZR3,$?DJNZR2,AD11?DJNZR1,AD10?RET;延時(shí)子程序結(jié)束,返回到調(diào)用處的下一句END?請(qǐng)將上面的程序保存為ILED.asm,進(jìn)行編譯,并燒寫(xiě)到AT89S51中,之后將89S51安裝到

14、套件的實(shí)驗(yàn)部份插座上實(shí)驗(yàn),這回顯示的就是“流水燈”的效果了!?回過(guò)頭,讓我們看看延時(shí)子程序是怎樣工作的:?jiǎn)纹瑱C(jī)內(nèi)部有不少寄存器,這些寄存器在單片機(jī)通電時(shí),你可以給他寫(xiě)入數(shù)據(jù)(是單片機(jī)按你程序要求寫(xiě)的數(shù)據(jù),而不是編程器寫(xiě)的),當(dāng)?shù)诙谓o他寫(xiě)入新數(shù)據(jù)時(shí),前次的數(shù)據(jù)就被新數(shù)據(jù)覆蓋;當(dāng)然也可以從寄存器中讀取數(shù)據(jù)。當(dāng)單片機(jī)沒(méi)有電源供給時(shí),寄存器內(nèi)部的數(shù)據(jù)也隨即消失;這些寄存器人們叫他RAM而用編程器將我們編寫(xiě)的程序燒寫(xiě)到單片機(jī)中的存儲(chǔ)器叫ROM現(xiàn)在,我們應(yīng)該清楚:RAM是讓程序去使用的,ROM!我們編寫(xiě)的程序存放的地方!前面說(shuō)過(guò),單片機(jī)內(nèi)部有不少RAM本實(shí)驗(yàn)用的AT89C51有多少寄存器?我們現(xiàn)在不必關(guān)

15、心,現(xiàn)在只須知道單片機(jī)內(nèi)部有名叫R0R7的這8個(gè)寄存器。這8個(gè)寄存器每個(gè)都由8個(gè)單獨(dú)的位寄存器組成,最大存放數(shù)據(jù)為二進(jìn)制的11111111,十六進(jìn)制=FF,十進(jìn)制=255。在使用時(shí)注意不要大于其有效范圍。上面延時(shí)程序中,先用到MOVR1,#50,MO是移動(dòng)的意思,該句是將50這個(gè)十進(jìn)制數(shù)放到R1中;50是立即數(shù),按匯編語(yǔ)言要求前面要加“#”號(hào),匯編語(yǔ)言還規(guī)定,十六進(jìn)制數(shù)后面要加“?H”,十六進(jìn)制數(shù)的高位是字母時(shí)在字母前面還要加“0”,例如:#0F8H;二進(jìn)制數(shù)后面加“B”,例如:#11110000B。十進(jìn)制不加,例如:#100。延時(shí)程序的第二、三句為:MOVR2,#100;MOVR3,#100

16、;這兩句意思同前。第四句中DJNZR3,$的意思是將R3里面的數(shù)減1后如果R3不等于0則跳到后面指定的程序位置,這里的“$”既要跳轉(zhuǎn)的程序位置,“$”代表當(dāng)前語(yǔ)句處,也就是說(shuō),R3不等于0,程序返回再次執(zhí)行本句。如果R3減1后等于0,程序結(jié)束本句,繼續(xù)執(zhí)行下面的語(yǔ)句。延時(shí)程序的最后一句是RET,意思是退岀本子程序,返回到調(diào)用本子程序處的下一句。根據(jù)上面的解釋?zhuān)贿M(jìn)入延時(shí)子程序首先為R1,R2,R3寄存器裝入我們需要的數(shù)據(jù),然后先對(duì)R3進(jìn)行減數(shù),每次減1,R3減完后減R2,減R2時(shí)就費(fèi)事啦,因?yàn)镽2每減1后不為0需要跳轉(zhuǎn)到AD11標(biāo)號(hào)處執(zhí)行下面的語(yǔ)句,此時(shí)R3再次裝入數(shù)據(jù)100,并且還要再次對(duì)R

17、3進(jìn)行減數(shù),R2減完后減R1,減R1的過(guò)程你研究研究看看。每執(zhí)行DJNZ?Rn,rel(Rn指R0R7,rel指轉(zhuǎn)移地址)指令一次,需要2個(gè)機(jī)器周期,單片機(jī)需耗時(shí)2uS(指本實(shí)驗(yàn)),若忽略裝數(shù)等語(yǔ)句,延時(shí)子程序從開(kāi)始到結(jié)束,單片機(jī)共耗時(shí)100*100*50*2nS,既1000000uS=1秒!若加上裝數(shù)等語(yǔ)句的耗時(shí),延時(shí)時(shí)間大于1秒。到此,我們做的流水燈已成功,原理大致也明白啦,若你自認(rèn)為這一課你完全明白了,那請(qǐng)你將“流水燈”的流向改變一下,也可以改為兩邊向內(nèi)流,內(nèi)部向外流,我想你一定能用前面學(xué)到的方法實(shí)現(xiàn)這些功能??赡苡行└呤终f(shuō),前面的編程方法是最最笨的!,不錯(cuò)!但玩單片機(jī)初期不必講究語(yǔ)言的

18、簡(jiǎn)練,只要能完成預(yù)先要求就好,這是初學(xué)者要知道的。那么還有更好的編程思路嗎?有!請(qǐng)繼續(xù)學(xué)習(xí)下節(jié)課做流水燈實(shí)驗(yàn)詳解三在上節(jié)課中讓LED流水是去逐個(gè)控制P1端口的每個(gè)位來(lái)實(shí)現(xiàn)的,那么我們?cè)诔绦蛞婚_(kāi)始就給P1口送一個(gè)數(shù),這個(gè)數(shù)本身就讓P1.0先低,其他位為高,然后讓這個(gè)數(shù)據(jù)向高位移動(dòng)不就實(shí)現(xiàn)流水”效果啦?的確如此!可惜,8051沒(méi)有讓P1數(shù)據(jù)移動(dòng)的指令,但有對(duì)累加器ACC中數(shù)據(jù)左移或右移的指令,ACC是8051單片機(jī)內(nèi)部算術(shù)邏輯單元中的一個(gè)寄存器”(這里叫他寄存器是不正確的,但你可以先這樣理解,ACC在指令中常寫(xiě)為A),他在數(shù)據(jù)傳輸和數(shù)據(jù)處理過(guò)程中作用十分重要,ACC為8位。他可與片內(nèi)所有單字節(jié)寄存器交換數(shù)據(jù),實(shí)際上P1和其他端口在單片機(jī)中也是一個(gè)寄存器。這樣我們可以將需移動(dòng)的數(shù)據(jù)先放到ACC中,讓其移動(dòng),然后將ACC移動(dòng)后的數(shù)據(jù)再轉(zhuǎn)送到P1口,這樣同樣可以實(shí)現(xiàn)流水”效果。程序如下:DDW:?;開(kāi)始MOVACC,#0FEHtACC中先裝入LED1熄滅的數(shù)據(jù)(即二進(jìn)制的11111110)MOVP1,ACC;將ACC的數(shù)據(jù)送P1口MOVR0,#7;因上句送到?p1口的數(shù)據(jù)就熄滅了一位,所以將數(shù)據(jù)再移動(dòng)7次就完成一個(gè)8位流水過(guò)程LOOP:?;數(shù)據(jù)移動(dòng)循環(huán)R

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論