;************************************************************* ;功能描述:工程中需要多个定时器的解决方法 ; 两个灯同时闪烁,一个是1S闪一次,一个是2S闪一次 ; 可适当调整第一、二行后的数值,按比例扩大或缩小 ;************************************************************ TM1 EQU 20 ;软件计数器的设定值1 TM2 EQU 40 ;软件计数器的设定值2 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所有的灯 MOV R6,#00H ;软件计数器预清0 MOV R7,#00H MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#3CH MOV TL0,#0B0H ;即数15536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;这里可写任意程序 ;定时器0的中断处理程序 TIME0: INC R6 INC R7 ;两个计数器都加1 MOV A,R6 CJNE A,#TM1,T_NEXT ;30H单元中的值到了5了吗? T_L1: CPL P1.0 ;到了,取反P10 MOV R6,#0 ;清软件计数器 T_NEXT: MOV A,R7 CJNE A,#TM2,T_RET ;31h单元中的值到10了吗? T_L2: CPL P1.1 MOV R7,#0 ;到了,取反P11,清计数器,返回 T_RET: MOV TH0,#3CH MOV TL0,#0B0H ;重置定时常数 RETI END