零基础:学51单片机定时器
到了以后并不是立即取反 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- VxWorks下的多重定时器设计(02-16)
- μC/OS-II软件定时器管理算法分析及改进(11-15)
- μC/OSII中软件定时器的优缺点与改进(03-21)
- 基于ARM7 PWM定时器的图像传感器时序信号设计(08-28)
- VxWorks共享看门狗定时机制的设计与实现(10-05)
- 学习单片机不可欠缺的八大步骤(12-01)