RUNLED电子版本_第1页
RUNLED电子版本_第2页
RUNLED电子版本_第3页
RUNLED电子版本_第4页
RUNLED电子版本_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。RUNLED-基本輸出埠實習霹靂燈實習目的:瞭解MCS-51基本輸出埠的使用瞭解MCS-51組合語言的寫法以MCS-51的輸出埠控制LED實習功能:利用8個LED,作霹靂燈由最左邊第一個LED先亮再來亮第二個LED,第三個LED每次只亮一個LEDLED亮到最右邊的時候,重新開始重複上述LED亮的動作,永不停止每次轉換LED時間為0.5秒顯示圖型:表LED亮:表LED熄硬體分析:要達成本實習所需的功能,除了MCS-51外,尚須LED的驅動電路,以驅動LED,因此其硬體方塊圖如下:硬體方塊圖:MCS-51L

2、ED電路(含驅動電路)(含:重置(Reset)電路振盪電路)圖4-1.1霹靂燈方塊圖MCS-51電路:MCS-51電路包含了,重置(Reset)電路,OSC振盪電路,這部份如果使用者,使用ICE(模擬器)作實驗,亦可不接,因為ICE內部,己經有這些電路,但接了也無妨,可以經由一般的ICE功能選項中,選擇要用內部振盪器(ICE內),或是外部振盪器(自己接的振盪電路),其詳細電路如下:目前使用內部記憶體接VCC若用外部記憶體則接GND振盪電路,若用ICE可以不接重置按鈕,當機時用RESET電路,利用開機時電容的充電時間,作自動重置的工作,若用ICE可以不接圖4-1.2MCS-51CLK和OSC電路

3、LED驅動電路:當PORTx.x為Lo時LED導通會亮導通時R為限流電阻,可決定LED的亮度所以適當的控制PORTx.x為Lo或Hi即可控制LED是否亮(PORTx.x為8051四個埠中任一位元皆可)圖4-1.3LED驅動電路注意:一般目前使用的MCS-51大都是CMOS元件,因此輸出時電流較小,LED可能不太亮,因此建議可在MCS-51和LED之間再加一個緩衝器(74244)以增加驅動能力,提高LED的亮度如下:可用排阻圖4-1.4以緩衝器(74LS244)驅動LED在本實習中,以埠(Port2)來驅動LED,使用者亦可使用其它的I/O埠,但若使用埠(Port0),則注意須在Port0加提昇

4、電阻,否則將無法驅動LED亮。完整電路圖:將上述兩個電路圖結合起來,即為本實習之完整的電路圖。如下:VCC:20PinGND:10PinVCC:40PinGND:20Pin圖4-1.5霹靂燈完整電路圖實習接線:若以本書之ALI_MCS-51實驗板作本實習,則僅需依下列步驟即可完成本實習之硬體電路:JP1開路(使用內部記憶體);JP2開路,JP3短路(以JUMP連接,使用12MHz之振盪器);將LED板(ALI_MCS-51_002),以排線或直接插入實驗母板(ALI_MCS-51_001)上的PORT2-1上。如圖4-1.6:圖4-1.6實驗模板之接線軟體分析:在本實習中,將以三種較常用的方法

5、,介紹如何控制LED的亮或熄,來達到本實習的功能要求,此三種方法分別為:立即定址法、旋轉法、查表法,以下分別介紹這三種方法:方法一:立即定址法此種方法是將欲顯示的LED,透過控制埠(本實習使用埠2),直接送”Lo”,而對不顯示的LED則送”Hi”即可。軟體架構:LED_PORT:REGP2(使用埠2來控制LED)宣告用那一個埠控制LEDORG0H(8051重置後會從位址0H,開始執行程式)宣告記憶體載入位址(讓CPU能正確的到此位址執行程式)宣告段主程式段$1:MOVLED_PORT,#01111111B(使用埠2來控制LED)將第一個LED控制訊號送到LED控制埠(P2)ACALLDELAY

6、0.5秒(呼叫時間延遲副程式)LED要亮0.5秒必須延遲0.5秒時間CPU執行延遲副程式0.5秒後返回主程式執行延遲程式延遲時間0.5秒ACALLRETMOVLED_PORT,#10111111B(使用埠2來控制LED)將第二個LED控制訊號送到LED控制埠(P2)SJMP$1(重頭開始循環顯示)第八個LED動作完畢後應跳回步驟一重新顯示END(程式段到此結束)結束圖4-1.7以立即定址法製作霹靂燈之軟體架構使用指令:MOV(搬移指令):用來將資料送到控制埠;ACALL(副程式呼叫指令):用來呼叫延遲副程式,此副程式控制LED變化時間;SJMP(短程跳躍指令):用來造成無窮迴圈,使LED燈號循

7、環顯示。主程式段流程如下:開始$1:MOVLED_PORT,#01111111BACALLDELAY0.5S$1亮第個LED延遲0.5秒MOVLED_PORT,#10111111BACALLDELAY0.5S亮第二個LED延遲0.5秒MOVLED_PORT,#11011111BACALLDELAY0.5S亮第三個LED延遲0.5秒MOVLED_PORT,#11101111BACALLDELAY0.5S亮第四個LED延遲0.5秒MOVLED_PORT,#11110111BACALLDELAY0.5S亮第五個LED延遲0.5秒MOVLED_PORT,#11111011BACALLDELAY0.5S

8、亮第六個LED延遲0.5秒MOVLED_PORT,#11111101BACALLDELAY0.5S亮第七個LED延遲0.5秒MOVLED_PORT,#11111110BACALLDELAY0.5S亮第八個LED延遲0.5秒SJMP$1跳回亮第一個LED圖4-1.8立即定址法製作霹靂燈之主程式流程圖主程式解析:上述流程圖中,其對應的指令,如:MOVLED_PORT,#11111110B其中:LED_PORT:表示本實習控制LED的輸出埠,此埠視實際硬體電路而定,在本實習中,使用埠2,所以在程式的初始位置要加以定義如下:LED_PORTREGP2;表示LEDPORT使用埠2#11111110B:表

9、示使用立即定址法,最低位元(BIT0)為”Lo”,其餘為”Hi”,後面的B表示使用二進位表示法。ACALLDELAY0.5;表示呼叫延遲0.5這個副程式SJMP$1;直接跳回區域標題$1的地方繼續執行另外要注意的是,程式中若有使用標題的地方,如$1則在撰寫程式(KEYIN)時,標題名稱需在該行第一個位置的地方,其它指令,則至少要空一個空格。;副程式解析:本程式應使用延遲0.5秒副程式,所以還需寫一個延遲0.5秒的副程式。延遲0.5秒:最方便的延遲方法即是用迴圈方式延遲,因每一個指令執行,都佔一定的時間,因此可利用同一個指令被重複執行多次,來.達到時間延遲的目的。使用指令:MOV(搬移指令):用

10、來設定迴圈數DJNZ(遞減分支指令):用來控制迴圈數RET(副程式返回):在任何副程式結尾,皆須使用此一指令在MCS-51中的迴圈指令有DJNZ,其指令格式如下:DIR為一直接定址或暫存器(R0R7)定址REL為一標題名稱DJNZDIR,RELDJNZ其動作為先將DIR的內容減一,減完後會自動檢查是否為,若是執行下一行指令,若不等於執行REL所指位址上的指令。其流程如下:(DIR)(DIR)-1執行REL所指位址上的指令否(DIR)=0?執行下一行指令是圖4-1.9指令DJNZ的執行流程DJNZ指令每執行一次要花費二個機械週期(24個Clock)的時間,相當於2us(使用12MHz的Clock

11、),所以只要適當的控制該指令中REL所指的位址,即可重複執行本指令,亦即將REL指到自己。如下指令格式,及流程:$1:DJNZ,$1$1(DIR)(DIR)-1否(DIR)=0?是圖4-1.10以DJNZ產生時間延遲的方法在上圖中,吾人只要適當的設定DIR的內容值即可達到延遲不同時間的功能,例如使用R0當DIR,而要延遲200us,則只要將R0的值設定為100,即可重複執行100次,每次2us所以可以延遲200us。如下:$2:MOVR0,#100(設定迴圈執行100次)$2(R0)100$1(R0)(R0)-1$1:DJNZR0,$1(重複執行100次)否(R0)=0?是圖4-1.11產生2

12、00us時間延遲的方法上述迴圈R0被設定為100,因此DJNZ這一行指令,將被執行100次,每次2us,將可延遲200us,若以同樣方法將上述指令再重複執行100次,即可延遲100*200us20ms,也就是在上述的迴圈外面再加一層迴圈。如下:外層執行100次延遲100(200+1)us約20ms$3:MOVR1,#100(R1)100$2$2:MOVR0,#100(R0)100$1內層執行100次共延遲200us(R0)(R0)-1$1:DJNZR0,$1否(R0)=0?是(R1)(R1)-1(R1)=0?DJNZR1,$2圖4-1.12以雙層迴圈產生20ms時間延遲的方法同理如果要延遲0.

13、5秒,則利用上述方法,將延遲20ms的程式再重複執行25次即可,因25*20ms=0.5s,設使用R2來重複執行25次,其流程如下:最外層執行25次延遲25(20ms+1us+2us)約0.5秒MOVR2,#25$3:第二層執行100次延遲100(200+1)us約20msMOVR1,#100$2:MOVR0,#100最內層執行100次共延遲200us$1:DJNZR0,$1DJNZR1,$2DJNZR2,$3圖4-1.130.5秒時間延遲說明所以延遲0.5秒的片段程式即如上所示:如需改變延遲時間,則修改R0、R1、R2的值即可延遲時間為Delaytime=R2*(R0*2)+3)*R1+3)

14、us約為R2*R1*R0us而要達到由左至右循環的霹靂燈功能的完整程式如下:程式4-1.1以立即定址法撰寫霹靂燈;使用I/O埠宣告;LED_PORT:REGP2;以埠2控制LED(視硬體實際接法而定);起始位址宣告;因MCS-51經重置以後,會從位址0H的指令開始執行,所以要宣告從0開始;ORG0H;告訴編輯程式程式碼0H開始;主程式;使用副程式:延遲0.5秒(DELAY0.5s);$1:MOVLED_PORT,#01111111B;亮左邊第一個LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式MOVLED_PORT,#10111111B;亮左邊第二個LEDACALLDELAY0.5S

15、;呼叫延遲0.5秒副程式MOVLED_PORT,#11011111B;亮左邊第三個LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式MOVLED_PORT,#11101111B;亮左邊第四個LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式MOVLED_PORT,#11110111B;亮左邊第五個LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式MOVLED_PORT,#11111011B;亮左邊第六個LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式MOVLED_PORT,#11111101B;亮左邊第七個LEDACALLDELAY0.5S;呼叫延遲0.5秒副

16、程式MOVLED_PORT,#11111110B;亮最右邊的LEDACALLDELAY0.5S;呼叫延遲0.5秒副程式SJMP$1;回到步驟重新開始;延遲0.5秒;DELAY0.5S:;延遲0.5秒副程式MOVR2,#25;設定最外層迴圈25次$3:MOVR1,#100;設定第二層迴圈100次$2:MOVR0,#100;設定最內層迴圈100次$1:DJNZR0,$1;最內層迴圈延遲200usDJNZR1,$2;第二層迴圈延遲20msDJNZR2,$3;最外層迴圈延遲0.5sRET;副程式返回,配ACALL指令;程式結束;END;告訴編輯程式,結束編輯;利用此種立即定址法所撰寫之程式,最為簡單易

17、懂,但程式較無彈性,日後若要修改顯示的燈號,須到程式中,一行一行指令慢慢的修改,所以在本實習另介紹兩種寫程式的方法。方法二:旋轉法在MCS-51中共有四個旋轉指令供使用者使用,而這四個旋轉指令的運算元都是累加器A也就是說使用者僅能在累加器A中完成旋轉的動作,其四個指令為:RLA:左旋轉,將累加器A的各位元往左移一位元累加器A往左旋轉A7A6A5A4A3A2A1A0動作:累加器A的各位元往左移一位元原第七位元(A7)移到第0位元(A0)RLCA:左旋轉含進位旗標累加器A進位旗標往左旋轉A7A6A5A4A3A2A1A0C動作:累加器A的各位元往左移一位元原第七位元(A7)移到進位旗標(C)原進位旗

18、標(C)移到第0位元(A0)RRA:右旋轉,將累加器A的各位元往右移一位元累加器A往右旋轉A7A6A5A4A3A2A1A0動作:累加器A的各位元往右移一位元原第位元(A0)移到第七位元(A7)RRCA:右旋轉含進位旗標累加器A進位旗標往右旋轉A7A6A5A4A3A2A1A0C動作:累加器A的各位元往右移一位元原第位元(A0)移到進位旗標(C)原進位旗標(C)移到第七位元(A7)在本實習中,可以用右旋轉的方式,來達到LED往右移的目的,其軟體架構如下:軟體架構LED_PORT:REGP2(使用埠2來控制LED)宣告用那一個埠控制LEDORG0H(8051重置後會從位址0H,開始執行程式)宣告記憶

19、體載入位址(讓CPU能正確的到此位址執行程式)宣告段主程式段MOVA,#01111111B(只有累加器A才可以旋轉)設定LED初始圖樣(初始圖樣存在累加器A)(以利旋轉指令的操作)$2:MOVLED_PORT,A(LED控制埠為埠2)$2顯示LED(累加器的值放到LED埠)LED要亮0.5秒必須延遲0.5秒時間ACALLDELAY0.5秒(呼叫時間延遲副程式)CPU執行延遲副程式0.5秒後返回主程式ACALL執行延遲程式延遲時間0.5秒RETRRA(右旋轉LED會往右移一個)將累加器A的值右旋轉(LED往右移)SJMP$2(回步驟2繼續執行)跳回步驟2繼續顯示結束圖4-1.14以旋轉法製作霹靂

20、燈之軟體架構由於只有累加器A才可以旋轉,所以把要顯示的第一個圖放在累加器A中,以後要顯示時就將累加器A的值搬到LED埠即可。使用旋轉方式完成本程式:優點:程式流程較為簡捷修改顯示圖案時,只要修改第一個原始圖案(LED)即可缺點:顯示的圖案較無變化,僅能作移位、旋轉的變化程式4-1.2使用旋轉法撰寫霹靂燈;使用I/O埠宣告;LED_PORT:REGP2;以埠2控制LED(視硬體實際接法而定);起始位址宣告;因MCS-51經重置以後,會從位址0H的指令開始執行,所以要宣告從開始;ORG0H;告訴編輯程式程式碼0H開始;主程式;使用副程式:延遲0.5秒(DELAY0.5S);MOVA,#011111

21、11B;設定顯示LED最左邊亮$2:MOVLED_PORT,A;顯示LEDACALLDELAY0.5S;延遲0.5秒RRA;LED往右移一個位置,右旋轉一位元SJMP$2;跳到步驟(繼續顯示);延遲0.5秒;DELAY0.5S:;延遲0.5秒副程式MOVR2,#25;設定最外層迴圈25次$3:MOVR1,#100;設定第二層迴圈100次$2:MOVR0,#100;設定最內層迴圈100次$1:DJNZR0,$1;最內層迴圈延遲200usDJNZR1,$2;第二層迴圈延遲20msDJNZR2,$3;最外層迴圈延遲0.5sRET;副程式返回,配ACALL指令;程式結束;END;告訴編輯程式,結束編輯

22、;方法三:查表法使用本方法首先必須建立一個顯示圖表檔(即先把要顯示的資料放入記憶體中),如下:欲顯示的資料以二進制方式存入亦可以其它方式存入108H107H11111110B設顯示圖案從位址100H開始存放本存放位址使用者可自行決定(以ORG指定)亦可由編輯程式安排106H11111101B105H11111011B104H11110111B103H11101111B102H11011111B101H10111111B100H01111111B圖4-1.15查表法讀取顯示圖表內的資料,在MCS-51中讀取表格的方式只有兩種讀取程式記憶體用MOVC(讀取致能為PSEN),亦可讀取內部記憶體指令格

23、式:MOVCA,A+DPTR功能:以DPTR+累加器A的值為位址,將該位址的值放入累加器A中。例:(DPTR)=100H,(A)=3,則MOVCA,A+DPTR2DPTR+A=100H+3H=103H累加器A在執行前的值1108H107H11111110B403H106H11111101B累加器A在執行後的值105H11111011B104H11110111B103H11101111B0EFHDPTR102H11011111B3101H10111111BDPTR目前為100H100H01111111B取出位址103H內的,資料放入累加器A圖4-1.16MOVC指令執行動作說明讀取外部記憶體用M

24、OVX(讀取致能為RD)指令格式:MOVXA,A+DPTR功能:將DPTR所指位址內的資料讀到累加器A。例(DPTR)=100HMOVXA,A+DPTR取出DPTR所指位址的資料放入累加器A21累加器A在執行前的值108H107H11111110B303H106H11111101B累加器A在執行後的值105H11111011B104H11110111B103H11101111B7FHDPTR102H11011111B101H10111111B100H01111111B圖4-1.17MOVX指令執行動作說明將記憶體內的值逐一讀出,放入輸出埠(本實驗使用埠2),便可顯出逐一讀取表格內資料埠2110

25、8HLED驅動電路107H11111110B106H11111101B105H11111011B104H11110111B103H11101111B102H11011111B101H10111111B100H01111111B圖4-1.18以查表法控制霹靂燈之說明因為本實習使用內部記憶體,所以使用MOVC這個指令,其軟體架構如下:使用指令:CLR(清除指令):清除累加器A的值MOVC(搬移指令):將DPTR+A,所指的位址內資料,搬到累加器AINC(遞增指令):用來使指標指到下一個顯示的資料位址宣告用那一個埠控制LED軟體架構LED_PORT:REGP2(使用埠2來控制LED)ORG0H(80

26、51重置後會從位址0H,開始執行程式)宣告記憶體載入位址(讓CPU能正確的到此位址執行程式)宣告段主程式段LED_TAB:.DB01111111B.DB10111111B.DB11011111B.DB11101111B.DB11110111B.DB11111011B.DB11111101B.DB11111110B共八筆資料$1$1:MOVDPTR,#LED_TABDPTR要指到表格的第一筆資料所在位址MOVR3,#8(共有8種亮法,必須在表格中建八筆資料)設定LED共有幾種亮法$2:CLRAMOVCA,A+DPTR(讀取表格資料並存在A)清除累加器的值讀取表格資料(使用MOVC須確定累加器A的

27、值)MOVLED_PORT,A(把累加器A的值放入埠2)將讀到的資料送到LED埠(埠2)顯示ACALLDELAY0.5秒(呼叫時間延遲副程式)LED要亮0.5秒必須延遲0.5秒的時間執行延遲程式延遲時間0.5秒ACALLCPU執行延遲副程式0.5秒後返回主程式RETINCDPTR(指標指到下一筆資料)要讀取表格下一筆資料須將指標加一DJNZR3,$2SJMP$1(若R3=0,表示八種圖樣,都顯示完了,須重新開始。)(若R30表示表格內尚有資料未被讀取,須繼續讀取並顯示)檢查顯示幾筆資料了(R3)-1看是否為0)否顯示完成是結束圖4-1.19以查表法製作霹靂燈之軟體架構程式4-1.3使用查表法撰

28、寫霹靂燈;使用I/O埠宣告;LED_PORT:REGP2;以埠2控制LED(視硬體實際接法而定);起始位址宣告;因MCS-51經重置以後,會從位址0H的指令開始執行,所以要宣告從開始;ORG0H;告訴編輯程式程式碼0H開始;主程式;使用副程式:延遲0.5秒(DELAY0.5S);$1:MOVDPTR,#LED_TAB;指標指到圖表開頭MOVR3,#8;設定顯示圖樣數$2:CLRA;將累加器A清除為MOVCA,A+DPTR;讀取指標資料MOVLED_PORT,A;顯示所讀取的圖案ACALLDELAY0.5S;延遲0.5秒INCDPTR;指標指到下一個圖案DJNZR3,$2;圖案是否顯示完了,否:跳2SJMP$1;是:跳到(從頭開始);延遲0.5秒;DELAY0.5S:;延遲0.5秒副程式MOVR2,#25;設定最外層迴圈25次$3:MOVR1,#100;設定第二層迴圈100次$2:MOVR0,#100;設定最內層迴圈100次$1:DJNZR0,$1;最內層迴圈延遲200usDJNZR1,$2;第二層迴圈延遲20msDJNZR2,$3;最外層迴圈延遲0.5sRET;副程式返回,配ACALL指令;顯示圖型宣告;LED_TAB:;表格名稱.DB01111111H;最左的LED亮.DB10111111H;左邊第二個LED亮.DB11011111H;左邊第三個LED亮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论