利用AT89S51單片機的P1.0-P1.3接四個發光二極管L1-L4,用來指示當前計數的數據;用P1.4-P1.7作為預置數據的輸入端,接四個撥動開關K1-K4,用P3.6/WR和P3.7/RD端口接兩個輕觸開關,用來作加計數和減計數開關。具體的電路原理圖如下圖所示 2. 電路原理圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg 圖4.12.1 3. 系統板上硬件連線 (1. 把“單片機系統”區域中的P1.0-P1.3端口用8芯排線連接到“八路發光二極管指示模塊”區域中的L1-L4上;要求:P1.0對應著L1,P1.1對應著L2,P1.2對應著L3,P1.3對應著L4; (2. 把“單片機系統”區域中的P3.0/RXD,P3.1/TXD,P3.2/INT0,P3.3/INT1用導線連接到“四路撥動開關”區域中的K1-K4上; (3. 把“單片機系統”區域中的P3.6/WR,P3.7/RD用導線連接到“獨立式鍵盤”區域中的SP1和SP2上; 4. 程序設計內容 (1. 兩個獨立式按鍵識別的處理過程; (2. 預置初值讀取的問題 (3. LED輸出指示 5. 程序框圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif 圖4.12.2 6. 匯編源程序 (當P3.0-P3.3接地時,初始運行燈全亮) COUNT EQU30H ORG00H START: MOV A,P3 ANL A,#0FH ; A與立即數#0FH按位'與',結果送入A中 (屏蔽掉P3.4-P3.7) MOV COUNT,A ;將用戶預置的值送到count MOVP1,A SK2: JBP3.6,SK1 ;直接尋址位P3.6,為1轉移 LCALLDELY10MS JBP3.6,SK1 INCCOUNT MOVA,COUNT CJNEA,#16,NEXT MOV A,P3 ANL A,#0FH MOV COUNT,A NEXT: MOVP1,A WAIT: JNBP3.6,WAIT ;直接尋址P3.6為0轉移 LJMPSK2 SK1: JB P3.7,SK2 LCALLDELY10MS JBP3.7,SK2 DECCOUNT ;累加器減1 MOVA,COUNT CJNEA,#0FFH,NEX ;累加器與立即數不等轉移 #0FFH改為16或#0F都可以 MOVA,P3 ANLA,#0FH MOVCOUNT,A NEX: MOVP1,A WAIT2: JNBP3.7,WAIT2 LJMPSK2 DELY10MS: MOVR6,#20 MOVR7,#248 D1: DJNZR7,$ DJNZR6,D1 RET END 7. C語言源程序(當P3.0-P3.3接地時,初始運行燈全滅) #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; /* P3與立即數#0FH按位'與',結果送入curcount中*/ 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); } } } }
|