新闻中心

EEPW首页>嵌入式系统>设计应用> 从零开始学51单片机定时器

从零开始学51单片机定时器

作者: 时间:2013-01-16 来源:网络 收藏

CJNE A,#20,T_RET ;30H 单元中的值到了 20 了吗?

T_L1: CPL P1.0 ;到了,取反 P10

MOV 30H,#0 ;清软件计数器

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数

POP PSW

POP ACC

RETI

END

先自己分析一下,看看是怎么实现的?这里采用了软件计数器的概念,思路是这样的,先用定时/计数器 0 做一个 50 毫秒的,定时是间到了以后并不是立即取反 P10,而是将软件计数器中的值加 1,如果软件计数器计到了 20,就取反 P10,并清掉软件计数器中的值,不然直接返回,这样,就变成了 20 次定时中断才取反一次 P10,因此定时时间就延长了成了 20*50 即 1000 毫秒了。

这个思路在工程中是非常有用的,有的时候我们需要若干个,可 51 中总共才有 2个,怎么办呢?其实,只要这几个定时的时间有一定的公约数,我们就能用软件加以实现,如我要实现 P10 口所接灯按 1S 每次,而 P11 口所接灯按 2S 每次闪烁,怎么实现呢?对了我们用两个计数器,一个在它计到 20 时,取反 P10,并清零,就如上面所示,另一个计到 40 取反 P11,然后清 0,不就行了吗?这部份的程序如下

ORG 0000H

AJMP START

ORG 000BH ;定时器 0 的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV 30H,#00H ;软件计数器预清 0

MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

MOV TH0,#3CH

MOV TL0,#0B0H ;即数 15536

SETB EA ;开总中断允许

SETB ET0 ;开定时/计数器 0 允许

SETB TR0 ;定时/计数器 0 开始运行

LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

TIME0: ;定时器 0 的程序

PUSH ACC

PUSH PSW ;将 PSW 和 ACC 推入堆栈保护

INC 30H

INC 31H ;两个计数器都加 1

MOV A,30H

CJNE A,#20,T_NEXT ;30H 单元中的值到了 20 了吗?

T_L1: CPL P1.0 ;到了,取反 P10

MOV 30H,#0 ;清软件计数器

T_NEXT:

MOV A,31H

CJNE A,#40,T_RET ;31h 单元中的值到 40 了吗?

T_L2:

CPL P1.1

MOV 31H,#0 ;到了,取反 P11,清计数器,返回

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数

POP PSW

POP ACC

RETI

END


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭