|
1. 實(shí)驗(yàn)任務(wù) 如圖4.3.1所示,AT89S51單片機(jī)的P1.0-P1.3接四個(gè)發(fā)光二極管L1-L4,P1.4-P1.7接了四個(gè)開(kāi)關(guān)K1-K4,編程將開(kāi)關(guān)的狀態(tài)反映到發(fā)光二極管上。(開(kāi)關(guān)閉合,對(duì)應(yīng)的燈亮,開(kāi)關(guān)斷開(kāi),對(duì)應(yīng)的燈滅)。 2. 電路原理圖 
圖4.3.1 3. 系統(tǒng)板上硬件連線 (1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.3用導(dǎo)線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1-L4端口上; (2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.4-P1.7用導(dǎo)線連接到“四路撥動(dòng)開(kāi)關(guān)”區(qū)域中的K1-K4端口上; 4. 程序設(shè)計(jì)內(nèi)容 (1. 開(kāi)關(guān)狀態(tài)檢測(cè) 對(duì)于開(kāi)關(guān)狀態(tài)檢測(cè),相對(duì)單片機(jī)來(lái)說(shuō),是輸入關(guān)系,我們可輪流檢測(cè)每個(gè)開(kāi)關(guān)狀態(tài),根據(jù)每個(gè)開(kāi)關(guān)的狀態(tài)讓相應(yīng)的發(fā)光二極管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令來(lái)完成;也可以一次性檢測(cè)四路開(kāi)關(guān)狀態(tài),然后讓其指示,可以采用MOV A,P1指令一次把P1端口的狀態(tài)全部讀入,然后取高4位的狀態(tài)來(lái)指示。 (2. 輸出控制 根據(jù)開(kāi)關(guān)的狀態(tài),由發(fā)光二極管L1-L4來(lái)指示,我們可以用SETB P1.X和CLR P1.X指令來(lái)完成,也可以采用MOV P1,#1111XXXXB方法一次指示。 5. 程序框圖 
圖4.3.2 6. 方法一(匯編源程序) ORG 00H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A XOR A,#0F0H MOV P1,A SJMP START END 7. 方法一(C語(yǔ)言源程序) #include <AT89X51.H> unsigned char temp; void main(void) { while(1) { temp=P1>>4; temp=temp | 0xf0; P1=temp; } } 8. 方法二(匯編源程序) ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 9. 方法二(C語(yǔ)言源程序) #include <AT89X51.H> void main(void) { while(1) { if(P1_4==0) { P1_0=0; } else { P1_0=1; } if(P1_5==0) { P1_1=0; } else { P1_1=1; } if(P1_6==0) { P1_2=0; } else { P1_2=1; } if(P1_7==0) { P1_3=0; } else { P1_3=1; } } } |