51 单片机编程:双路计数器
扫描二维码
随时随地手机看文章
利用51单片机构成计数器,计数的上限,做的大一些,也不难,几千几万都可以。
下面的电路,小了一点,是个两路两位的计数器。
用来记录乒乓球比赛,还算可以,用于篮球比赛,分数超过99,这个电路就不够用了。
电路图中,用的是共阳数码管;还设置了六个按键,用途,都已经标出。
用C语言编写驱动程序,是比较简单的,全部代码如下:
#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