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

发布时间:2024-03-21  

利用 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 程序。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    51单片机定时/计数器详解(工作原理及模式、应用);51单片机是基础入门的一个单片机,还是应用最广泛的一种。本文主要介绍51单片机定时/计数器,首先介绍了51单片机定时/计数器的工作原理,其次......
    定时计数器_单片机_普中;1 定时/计数器介绍 定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THX和TLX组成。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器......
    出水的功能,且实时地显示当前剩余时间。程序流程图如图4所示。 图4 程序流程图 3.1、定时器/计数器程序控制 本设计的程序软件主要是依靠单片机的定时器/计数器的功能去实现功能的要求。单片机定时......
    stm32定时器时间计算;  STM32定时器的工作原理   STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)   T=1/F (F为频率)   例如:我们以51单片机举例,假设单片机......
    零基础:学51单片机定时器;   我们学单片机是首先学的就是 led 闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机......
    AT89S51单片机定时计数器的使用技巧详细说明;1. 实验任务 用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始......
    单片机的定时器;TMOD:定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 D7 D6 D5 D4 D3 D2 D1 D0 GATE......
    处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用 51单片机定时原理 定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器......
    80C51单片机的定时计数器的结构和工作原理;单片机怎么学,先从哪入手开始学,怎么开始入门 无论是对于新手还是已经在行内的朋友,学习单片机技术,实战动手能力十分重要,如果......
    内部包含2个定时计数器,将其中一个定时计数器用于软时钟设计的方法,可以大大节省硬件开销。本文提出了如何提高软时钟的定时精度,以及在软时钟存在的情况下,如何提高以MCS-51单片机......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>