利用51單片機構(gòu)成計數(shù)器,計數(shù)的上限,做的大一些,也不難,幾千幾萬都可以。
下面的電路,小了一點,是個兩路兩位的計數(shù)器。
用來記錄乒乓球比賽,還算可以,用于籃球比賽,分數(shù)超過99,這個電路就不夠用了。
電路圖中,用的是共陽數(shù)碼管;還設(shè)置了六個按鍵,用途,都已經(jīng)標出。
用C語言編寫驅(qū)動程序,是比較簡單的,全部代碼如下:
#include
unsignedcharn1,n2;
//-----------------------------------------------
voiddelay(unsignedinti)//1ms延時程序
{
unsignedcharj;
while(i--)for(j=0;j<115;j++);
}
//-----------------------------------------------
voiddisp(void)
{
unsignedcharcodeSEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,//0-4
0x92,0x82,0xf8,0x80,0x90};//5-9
P0=SEG[n1/10];P1=1;delay(2);P1=0;
P0=SEG[n1%10];P1=2;delay(2);P1=0;
P0=SEG[n2/10];P1=4;delay(2);P1=0;
P0=SEG[n2%10];P1=8;delay(2);P1=0;
}
//-----------------------------------------------
voidmain(void)
{
unsignedchark,t;
n1=n2=0;
while(1){
disp();
if(~(P2|0xc0)){
disp();
if(~(P2|0xc0)){
k=~(P2|0xc0);
while(~(P2|0xc0))disp();
if(k==1){n1++;if(n1==100)n1=0;}
elseif(k==2){n1--;if(n1==-1)n1=99;}
elseif(k==4){n2++;if(n2==100)n2=0;}
elseif(k==8){n2--;if(n1==-1)n2=99;}
elseif(k==16){n1=n2=0;}
elseif(k==32){t=n1;n1=n2;n2=t;}
}}}
}
//-----------------------------------------------
是不是很簡單?
用匯編語言來編程,就顯得長多了。
和上述C語言功能相同的匯編語言程序,全部代碼如下:
ORG0000H
JMPMAIN
ORG0030H
;-------------------------
MAIN:
CALLDISP
MOVA,P2
CJNEA,#0FFH,KEY
CLR00H
JMPMAIN
;-------------------------
KEY:
JNB00H,A_ADD1
JMPMAIN
;----------------------
A_ADD1:
SETB00H
JBP2.0,A_SUB1
MOVA,R0
ADDA,#01H
DAA
MOVR0,A
JMPMAIN
;----------------------
A_SUB1:
JBP2.1,B_ADD1
MOVA,R0
ADDA,#99H
DAA
MOVR0,A
JMPMAIN
;----------------------
B_ADD1:
JBP2.2,B_SUB1
MOVA,R1
ADDA,#01H
DAA
MOVR1,A
JMPMAIN
;----------------------
B_SUB1:
JBP2.3,CLR_0
MOVA,R1
ADDA,#99H
DAA
MOVR1,A
JMPMAIN
;----------------------
CLR_0:
JBP2.4,EXCH
MOVR0,#00H
MOVR1,#00H
JMPMAIN
;----------------------
EXCH:
JBP2.5,END_K
MOVA,R0
XCHA,R1
MOVR0,A
JMPMAIN
END_K:
CLR00H
JMPMAIN
;-------------------------
DISP:
MOVDPTR,#BG
MOVA,R0
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
SETBP1.0
CALLDELAY
CLRP1.0
;----------------------
MOVA,R0
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
SETBP1.1
CALLDELAY
CLRP1.1
;----------------------
MOVA,R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
SETBP1.2
CALLDELAY
CLRP1.2
;----------------------
MOVA,R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
SETBP1.3
CALLDELAY
CLRP1.3
RET
;-------------------------
DELAY:
DJNZR7,$
DJNZR7,$
DJNZR7,$
DJNZR7,$
RET
;-------------------------
BG:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
;-------------------------
END