------------------------------------------------------------------------------------------------------------
例0:
ORG 0000H
SETB TR0 ;启动T0
MOV R2, #250 ;定时计数初值
LOOP:
MOV TH0, #(8192 - 10000) / 32 ;定时10ms
MOV TL0, #(8192 - 5000) MOD 32
JNB TF0, $ ;等待10ms
CLR TF0
DJNZ R2, LOOP ;每隔5ms,R2减一次
CPL P1.0 ;R2为0则LED亮灭转换
LJMP 0000H
END
例1:
ORG 0000H;程序端存放位置
LJMP MAIN;主程序入口
ORG 000BH ;指明内存地址
LJMP T0ISR ;
ORG 0030H;跳过异常向量区
MAIN:
MOV TMOD,#01H ;定时器0,工作方式1
MOV TH0,#HIGH(65536-50000);为了配置定时器溢出周期为50000对TH0写入初值。HIGH()、LOW()都是宏定义,用于取双字节变量的高半字节和低半字节。
MOV TL0,#LOW(65536-50000);
SETB TR0 ;开启定时器0
SETB ET0 ;开启定时器0中断
SETB EA ;开启总中断
CLR P1.0 ;灯灭
MOV R2,#10;定时次数
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000) ;重赋初值
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;定时次数减1直到0,非0时直接转T0E退出
CPL P1.0 ;10次中断到则LED取反
MOV R2,#10;重赋计数值
T0E:
RETI
END
例2:
ORG 0000H
start:
MOV P1,#0FFH
CALL delay
MOV P1,#0H
CALL delay
CALL delay
LJMP start
delay:
MOV R7,#100
d2: MOV R6,#250
d1: DJNZ R6,d1
DJNZ R7,d2
RET
END
;100*250次*2*1us=500ms=0.5s
例3:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
MOV R2,#100
SETB TR0
SETB ET0
SETB EA
CLR P0.0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E
MOV R2,#100
JNZ T001
SETB P0.0
SJMP T0E
T001:
DEC A
MOV R3,A
SETB P0.0
CLR P0.1
SJMP T0E
T0E:
RETI
END