您的位置 首页 测评

51 单片机编程:双路计数器详解

51 单片机编程:双路计数器详解-利用 51 单片机构成计数器,计数的上限,做的大一些,也不难,几千几万都可以。

使用 51 单片机构成计数器,计数的上限,做的大一些,也不难,几千几万都能够。

下面的电路,小了一点,是个两路两位的计数器。

用来记载乒乓球竞赛,还算能够,用于篮球竞赛,分数超越 99,这个电路就不够用了。

电路图中,用的是共阳数码管;还设置了六个按键,用处,都现已标出。

用 C 言语编写驱动程序,是比较简单的,悉数代码如下:

#include《reg51.h》

unsigned char n1, n2;

//———————————————–

void delay(unsigned int i) //1ms延时程序

{

unsigned char j;

while(i–) for(j = 0; j 《 115; j++);

}

//———————————————–

void disp(void)

{

unsigned char code SEG[] = {

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;

}

//———————————————–

void main(void)

{

unsigned char k, 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;}

else if (k == 2) {n1–; if (n1 == -1) n1 = 99;}

else if (k == 4) {n2++; if (n2 == 100) n2 = 0;}

else if (k == 8) {n2–; if (n1 == -1) n2 = 99;}

else if (k == 16) {n1 = n2 = 0;}

else if (k == 32) {t = n1; n1 = n2; n2 = t;}

} } }

}

//———————————————–

是不是很简单?

用汇编言语来编程,就显得长多了。

和上述 C 言语功用相同的汇编言语程序,悉数代码如下:

ORG 0000H

JMP MAIN

ORG 0030H

;————————-

MAIN:

CALL DISP

MOV A, P2

CJNE A, #0FFH, KEY

CLR 00H

JMP MAIN

;————————-

KEY:

JNB 00H, A_ADD1

JMP MAIN

;———————-

A_ADD1:

SETB 00H

JB P2.0, A_SUB1

MOV A, R0

ADD A, #01H

DA A

MOV R0, A

JMP MAIN

;———————-

A_SUB1:

JB P2.1, B_ADD1

MOV A, R0

ADD A, #99H

DA A

MOV R0, A

JMP MAIN

;———————-

B_ADD1:

JB P2.2, B_SUB1

MOV A, R1

ADD A, #01H

DA A

MOV R1, A

JMP MAIN

;———————-

B_SUB1:

JB P2.3, CLR_0

MOV A, R1

ADD A, #99H

DA A

MOV R1, A

JMP MAIN

;———————-

CLR_0:

JB P2.4, EXCH

MOV R0, #00H

MOV R1, #00H

JMP MAIN

;———————-

EXCH:

JB P2.5, END_K

MOV A, R0

XCH A, R1

MOV R0, A

JMP MAIN

END_K:

CLR 00H

JMP MAIN

;————————-

DISP:

MOV DPTR, #BG

MOV A, R0

SWAP A

ANL A, #0FH

MOVC A, @A + DPTR

MOV P0, A

SETB P1.0

CALL DELAY

CLR P1.0

;———————-

MOV A, R0

ANL A, #0FH

MOVC A, @A + DPTR

MOV P0, A

SETB P1.1

CALL DELAY

CLR P1.1

;———————-

MOV A, R1

SWAP A

ANL A, #0FH

MOVC A, @A + DPTR

MOV P0, A

SETB P1.2

CALL DELAY

CLR P1.2

;———————-

MOV A, R1

ANL A, #0FH

MOVC A, @A + DPTR

MOV P0, A

SETB P1.3

CALL DELAY

CLR P1.3

RET

;————————-

DELAY:

DJNZ R7, $

DJNZ R7, $

DJNZ R7, $

DJNZ R7, $

RET

;————————-

BG:

DB 0C0H,0F9H,0A4H,0B0H, 99H

DB 92H, 82H,0F8H, 80H, 90H

;————————-

END

汇编言语的程序,看起来,比 C 言语的程序,长了不少,可是,编译后生成的机器码,却少于 C 程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/347786.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部