介绍计数器 定时器 程序 的编写步骤 (C语言的)

介绍计数器 定时器 程序 的编写步骤 (C语言的),第1张

注意:

多数C语言编译器不支持多线程,而且ANSI C也没有线程库,因此C语言无法实现实际意义上的定时器(即包含触发机制的定时器)。

回到本问题:

1 计数器

简单的int变量(一般为全局或相对全局)就可以实现。

2 计时器:

包含time.h,使用clock相关函数,通过运行时间差来实现计慎衫时功能。示例:

/*@*/ clock_t startstart = clock()

……

/*@*/ clock_t endend = clock()

float start2end = (float)(endend-startstart)/CLOCKS_PER_SEC

// 这里的start2end就是时间差陵滑

3 定时器

使用系统API,比如Windows下的Sleep()函数(注意,是大尺孝腊写),原型如下:

VOID Sleep(

DWORD dwMilliseconds // sleep time in milliseconds

)

单片机定时器/计数器程序如何掌握,我不会写。

这很正常,万事开头好薯难。

为便于理解,我用打比方的形式说明。

1、为什么叫定时器/计数器?因为可以对内部时钟计数(定时器)也可以对外部脉冲计岁握数(计数器)。

2、好比你有一个水桶(相当于定时器/计数器),这个桶是有一定容量的(定时器/计数器使用两个字节计时/计数),现在拿一个碗从水池向桶内装水(一碗水相当于一个计时/计数脉冲),装水满了会怎么样?外溢(相当于定时器/计数器溢出)。一般我们利用的就是这个溢出功能(也有例外),因为这时候他会通知你(有溢出标志)。

3、51单片机定时器/计数器是加计数,两字节计数寄存器计数最大数65535,再多一个计数单位就回零了,同时置位溢出标志(开了中断还会引起中断)。

4、因为是加计数,你期望的计数值不一定从零开始,那就要“垫底”(赋初值)。

理顺消化一下,看是不是明白了。

编写单片机定时器/计数器程序就是设置与单片机定时器/计数器有关的寄存器乎袜庆,理解上边的就好办了。

按照图示,应该用P1.7向T1送入计桐蠢数脉冲

送去弯或4000个,即达到了1s

下列程序,在PROTEUS中仿真通过

---------------------------------

ORG

0000H

JMP

START

ORG

000BH

JMP

T0_INT

ORG

001BH

JMP

T1_INT

ORG

0030H

START:MOV

SP,#60H

MOV

TMOD,#52H

T1计数方式1

T0定时方式2

MOV

TH0,

#(256-250)

T0定时250us@12MHz

MOV

TL0,

#(256-250)

SETB

TR0

MOV

TH1,

#(65536-4000)

/

256

T1计数4000

MOV

TL1,

#(65536-4000)

MOD

256

即1s

SETB

TR1

SETB

ET0

SETB

ET1

SETB

EA

MOV

R2,

#3

WAIT:

SJMP

WAIT

等待中断

----------------------------------

T0_INT:

T0方埋轮伍式2,不用重新送初始值.

CLR

P1.7

向T1送计数脉冲.

NOP

SETB

P1.7

RETI

----------------------------------

T1_INT:

每当收到4000个脉冲,即1s中断一次.

MOV

TL1,

#(65536-4000)

MOD

256

重新送入初始值.

MOV

TH1,

#(65536-4000)/256

T1计数4000

CLR

P1.0

DJNZ

R2,

T1_END

SETB

P1.0

MOV

R2,

#3

T1_END:

RETI

----------------------------------

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12427806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存