一、實驗目的與要求 1.熟悉 Keil C51 集成環境軟件的使用方法。 2.熟悉 MCS51 匯編指令,能自己編寫簡單的程序,控制硬件。 3.熟悉暢學開發平臺,掌握單片機最小系統及 IO 口的簡單控制及不同組 IO 口的特點。
二、實驗內容1、熟悉Keil C51集成環境軟件的安裝和使用方法。 2、照接線圖編寫程序,完善給出程序,實現以下功能。 要求LED燈實現從上到下依次點亮,再從下到上依次點亮。完成后實現從兩側向中間循環點亮,再從中間往外循環點亮。功能完成后循環上述過程。 3、觀察實驗結果,驗證程序是否正確。
2.1 實驗完成內容1、延時實現LED流水燈效果,p1端口的八個燈作跑馬燈。在本實驗中,p1作為輸出口,接8只發光二極管,編寫程序,使發光二極管循環點亮。 本例實驗主要用到了延時子程序,CLR、AJMP、RRC、RLC、CALL等指令,通過輪流點亮p0.0,….p0.7實現效果。 2、照接線圖編寫程序,完善給出程序,實現功能:LED燈實現從上往下依次點亮,在從下往上依次點亮。完成后實現從兩側到中間循環點亮,在從中間向外循環點亮。功能完成后循環上述過程。
2.2 芯片選型STC12C5A60S2 2.3 電路原理圖2.4 關鍵資源說明(所應用單片機內部資源及外圍接口芯片的核心說明)暢學系列開發平臺一套; PC 機一臺; 內部:累加器A,寄存器R4和進位標志位C以及外部外部I/O接口與P1口。
2.5 設計分析為了實現跑馬燈的效果,即:LED依次點亮(循環),就是要求從P1口: P1.0至P1.7依次輸出低電平,當某引腳為低電平時,其余引腳都輸出高電平。 從輸出的數據分析: 第一個LED點亮時,對應的是P1.0的位為0,其余位為1,組合為一個二進制位從高到低為:1111 1110,即十六 進制數0xFE;同理,第二個LED點亮對應的數為:1111 1101,化為十六進制數為0xFD。 依次類推,逐次點亮LED所對應的數據為:1111 1110、1111 1101、1111 1011、1111 0111、 1110 1111、1101 1111、1011 1111、0111 1111。 規律:數據中的二進制數0的位置依次往左移動了一位。 
2.6程序流程圖
四、實驗運行效果及說明LED燈實現從上往下依次點亮,再從下往上依次點亮。完成后實現從兩側到中間循環點亮,在從中間向外循環點亮。 五、思考題1、循環間隔時間通過延時怎么控制?答:通過延時程序可以控制循環間隔的時間,無論是C語言還是匯編,延時起到的作用都是不可或缺的。 Delay: MOV R0,#10 ;(1) Delay1: MOV R1,#100 ;(1*10) DJNZ R1,$ ;(2*100*10) DJNZ R0,Delay1 ;(2*10) ret ;(2) total=1+1*10+2*100*10+2*10+2=2033 time=total*1/(focse/12)
void Delay(unsigned int uiCount) { unsigned char j = 244; for(;uiCount > 0;uiCount--) while(--j); }
2、跑馬燈模式如何實現間隔亮、多位同時亮等其他效果?答:間隔亮可以利用子函數DELAY三重循環控制,多位同時亮可以給多位賦初值來體現。 ORG 0000H LJMP MAIN ORG 0020H MAIN: MOV R6,#07H MOV R7,#FEH ;1111 1110 LOOP1: MOV P1,R7 LCALL DELAY MOV A,R7 RLC A MOV R7,A DJNZ R6,LOP1 MOV R6,#07H MOV R7,#7FH ;0111 1111 LOOP2: MOV P1,R7 LCALL DELAY MOV A,R7 RRC A MOV R7,A DJNZ R6,LOP2 LJMP MAIN DELAY: MOV R3,#0FFH LOOP3: MOV R4,#0FFH LOOP4: NOP DJNZ R4,LOP4 DJNZ R3,LOP3 RET END
六、實驗分析與小結通過匯編語言和C語言程序分別實現使八個跑馬燈從上往下,在從下往上的循環亮燈,以及實現從中間到兩邊,在從兩邊到中間的循環亮燈。此次實驗中,從開始的蜂窩鳴叫測試,到后續自己編寫,燒錄跑馬燈程序,雖然過程因為開始的不懂原理有點繞路,到后來循序漸進,還是一個比較有趣的過程。將想法變為現實,與以往的設計軟件不同,此次通過程序指令使得硬件實現自己想要的功能。讓自己實打實的,眼看手做去實現,挺好的。
- 三、實驗程序
- 匯編:
- ORG 0000H
- LJMP START
- ORG 0100H
- START:
- MOV A , #0FFH
- CLR C
- MOV R4 , #08H
- LOOP1:
- RRC A
- MOV P1 , A
- LCALL DELAY
- DJNZ R4 ,LOOP1
- MOV A , #0FFH
- CLR C
- MOV R4 , #08H
- LOOP2:
- RLC A
- MOV P1 , A
- LCALL DELAY
- DJNZ R4 ,LOOP2
- JMP START
-
- DELAY:
- MOV R1 , #20H
- D0:
- MOV R2 , #00H
- D1:
- MOV R3 , #00H
- DJNZ R3 , $
- DJNZ R2 , D1
- DJNZ R1 , D0
- RET
- END
- 從中間往兩邊依次點亮,再從兩邊往中間依次點亮
- ORG 0000H
- LJMP START
- ORG 0100H
- START:
- MOV A,#0EFH
- MOV P1,A
- MOV R2,#08H
- LOOP1:
- MOV R6,A
- RRC A
- MOV P1,A
- LCALL DELAY
- MOV A,R6
- RLC R6
- MOV P1,A
- LCALL DELAY
- DJNZ R4,LOOP1
- MOV R4,#08H
- MOV A,#0EFH
- MOV P1,A
- MOV R4,#08H
- LOOP2:
- MOV A,#FEH
- MOV P1,A
- LCALL DELAY
- MOV R7,A
- MOV A,#07H
- MOV P1,A
- LCALL DELAY
- MOV A,R7
- RLC A
- MOV P1,A
- LCALL DELAY
- DJNZ R4,LOOP2
- CLR C
- JMP START
- DELAY:
- MOV R1,#20H
- D0:
- MOV R2,#00H
- D1:
- MOV R3,#00H
- DJNZ R3,$
- DJNZ R2,D1
- DJNZ R1,D0
- RET
- END
-
- C語言:
- #include <reg51.H>
- //延時函數,uiCount-延時參數,每加1增加0.5ms
- void Delay(unsigned int uiCount)
- {
- unsigned char j = 244;
- for(;uiCount > 0;uiCount--) while(--j);
- }
- unsigned char code table[]={ 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,
- };
- void Delay(unsigned int); //延時函數
- //主函數,控制LED
- void main(void)
- {
- unsigned char i;
- while(1)
- {
- for(i=0;i<16;i++) //依次點亮和熄滅8個LED
- {
- P1=table[i];
- Delay(1000);
- }
- P1=0x7f; //賦初始值
- for(i=0;i<8;i++) //循環右移點亮LED
- {
- Delay(500);
- P1>>=1;
- P1=P1|0x80; //右移后,最左端自動賦值0,把第7位置1
- }
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
跑馬燈.docx
(332.88 KB, 下載次數: 20)
2018-12-1 16:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|