|
1. 實驗任務(wù) 利用AT89S51單片機的P1.0-P1.3接四個發(fā)光二極管L1-L4 , 用來指示當(dāng)前計數(shù)的數(shù)據(jù);用P1.4-P1.7作為預(yù)置數(shù)據(jù)的輸入端,接四個撥動開關(guān)K1-K4,用P3.6/WR和P3.7/RD端口接兩個輕觸開關(guān),用來作加計數(shù)和減計數(shù)開關(guān)。具體的電路原理圖如下圖所示 2. 電路原理圖 圖4.12.1 3. 系統(tǒng)板上硬件連線 (1. 把“單片機系統(tǒng)”區(qū)域中的P1.0-P1.3端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1-L4上;要求:P1.0對應(yīng)著L1,P1.1對應(yīng)著L2,P1.2對應(yīng)著L3,P1.3對應(yīng)著L4; (2. 把“單片機系統(tǒng)”區(qū)域中的P3.0/RXD,P3.1/TXD,P3.2/INT0,P3.3/INT1用導(dǎo)線連接到“四路撥動開關(guān)”區(qū)域中的K1-K4上; (3. 把“單片機系統(tǒng)”區(qū)域中的P3.6/WR,P3.7/RD用導(dǎo)線連接到“獨立式鍵盤”區(qū)域中的SP1和SP2上; 4. 程序設(shè)計內(nèi)容 (1. 兩個獨立式按鍵識別的處理過程; (2. 預(yù)置初值讀取的問題 (3. LED輸出指示 5. 程序框圖 圖4.12.2 6. 匯編源程序 COUNT EQU 30H ORG 00H START: MOV A,P3 ANL A,#0FH MOV COUNT,A MOV P1,A SK2: JB P3.6,SK1 LCALL DELY10MS JB P3.6,SK1 INC COUNT MOV A,COUNT CJNE A,#16,NEXT MOV A,P3 ANL A,#0FH MOV COUNT,A NEXT: MOV P1,A WAIT: JNB P3.6,WAIT LJMP SK2 SK1: JB P3.7,SK2 LCALL DELY10MS JB P3.7,SK2 DEC COUNT MOV A,COUNT CJNE A,#0FFH,NEX MOV A,P3 ANL A,#0FH MOV COUNT,A NEX: MOV P1,A WAIT2: JNB P3.7,WAIT2 LJMP SK2 DELY10MS: MOV R6,#20 MOV R7,#248 D1: DJNZ R7,$ DJNZ R6,D1 RET END 7. C語言源程序 #include <AT89X51.H>
unsigned char curcount;
void delay10ms(void) { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
void main(void) { curcount=P3 & 0x0f; P1=~curcount; while(1) { if(P3_6==0) { delay10ms(); if(P3_6==0) { if(curcount>=15) { curcount=15; } else { curcount++; } P1=~curcount; while(P3_6==0); } } if(P3_7==0) { delay10ms(); if(P3_7==0) { if(curcount<=0) { curcount=0; } else { curcount--; } P1=~curcount; while(P3_7==0); } } } } |