1. 實驗任務 利用AT89S51單片機來製作一個手動計數器,在AT89S51單片機的P3.7管腳接一個輕觸開關,作為手動計數的按鈕,用單片機的P2.0-P2.7接一個共陰數碼管,作為00-99計數的個位數顯示,用單片機的P0.0-P0.7接一個共陰數碼管,作為00-99計數的十位數顯示;硬體電路圖如圖19所示。 2. 電路原理圖 ͼ4.10.1 3. 系統板上硬體連線 (1. 把“單片機系統”區域中的P0.0/AD0-P0.7/AD7埠用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個a-h埠上;要求:P0.0/AD0對應著a,P0.1/AD1對應著b,……,P0.7/AD7對應著h。 (2. 把“單片機系統”區域中的P2.0/A8-P2.7/A15埠用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個數碼管的a-h埠上; (3. 把“單片機系統”區域中的P3.7/RD埠用導線連接到“獨立式鍵盤”區域中的SP1埠上; 4. 程序設計內容 (1. 單片機對按鍵的識別的過程處理 (2. 單片機對正確識別的按鍵進行計數,計數滿時,又從零開始計數; (3. 單片機對計的數值要進行數碼顯示,計得的數是十進數,含有十位和個位,我們要把十位和個位拆開分別送出這樣的十位和個位數值到對應的數碼管上顯示。如何拆開十位和個位我們可以把所計得的數值對10求余,即可個位數字,對10整除,即可得到十位數字了。 (4. 通過查表方式,分別顯示出個位和十位數字。 5. 程序框圖 ͼ4.10.2 6. 彙編源程序 Count EQU 30H SP1 BIT P3.7 ORG 0 START: MOV Count,#00H NEXT: MOV A,Count MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR MOV P2,A WT: JNB SP1,WT WAIT: JB SP1,WAIT LCALL DELY10MS JB SP1,WAIT INC Count MOV A,Count CJNE A,#100,NEXT LJMP START DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7. C語言源程序 #include unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Count; void delay10ms(void) { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void main(void) { Count=0; P0=table[Count/10]; P2=table[Count%10]; while(1) { if(P3_7==0) { delay10ms(); if(P3_7==0) { Count++; if(Count==100) { Count=0; } P0=table[Count/10]; P2=table[Count%10]; while(P3_7==0); } } } } |