多数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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)