晶振是12MHz,所以机器周期T=1μs
需定时,C//T=0
30ms/1μs=30000
因为30000>8192,需选择方式1,M1M0=01
TMOD=0000 0001B
计数初值为:
65536-30000=35536=8AD0H
所以
TH0=6AH,TL0=0D0H
因为开放总中断和T0中断,IE=10000010B
TCON=0001 0000B;启动T0,TR0就是TCON中的控制位,也可用位操作指令直接将TR0置1
程序见“做而论道”给的程序。
ORG 0000H
JMP MAIN
ORG 000BH
JMP T0_SR
COUNTER EQU 30H
MAIN:
CALL INIT
JMP $
INIT:
MOV TMOD, #01H
MOV TH0, #HIGH(-1000)
MOV TL0, #LOW(-1000)
SETB TR0
SETB ET0
SETB EA
RET
T0_SR:
MOV TH0, #HIGH(-1000)
MOV TL0, #LOW(-1000)
INC COUNTER
MOV R1, 30H
CJNE R1, #30, LOW_END
MOV R3, #0
CPL P1.0
RETI
LOW_END:
RETI
END
:
ORG 0000H
SJMP START
ORG 000BH ;T0中断入口.
SJMP T0_INT
START:
MOV TMOD, #01H ;设置T0定时方式1
MOV TH0, #(65536-60000/2) / 256 ;送入初始值.
MOV TL0, #(65536-60000/2) MOD 256 ;定时30000us@12MHz
;TH0和TL0的值,可由编译软件来算.
MOV IE, #10000010B ;开放总中断和T0中断.
SETB TR0 ;启动T0,TR0就是TCON中的控制位.
SJMP $ ;等着吧.
T0_INT:
MOV TH0, #(65536-60000/2) / 256 ;重新送入初始值.
MOV TL0, #(65536-60000/2) MOD 256 ;定时30000us@12MHz
CPL P1.0 ;输出方波.
RETI ;中断返回.
END ;完.
需要汇编程序的 还是C的?