和楼上类似,我用STC单片机做分频,T0设置为外部输入,自动重装模式,而中断用来控制辅助分频器,这样可通过不同的设置搭配获得多种分频值,而又不使中断影响到时钟的稳定性。
;T0设置程序
;push=1, 39 Bytes; 20 cycles for 12 MHz, 23 cycles for 11.0592MHz.
;26 cycles for extenal clock.
_t0setup:
mov TMOD, #00000010B ;模式2
push ACC
mov a, sysclk ;确定时钟频率
cjne a, #t0aid11, tot0aid12 ;若为11.0592MHz;7
mov a, #extclk ;判别是否外部时钟
cjne a, #ask_no, toextclk ;若本机不为外部时钟;10
mov TH0, #t0mst11 ;预置11.0592MHz计数值
mov t0aid, #t0aid11 ;预置分频数
sjmp toother ;16;23
toextclk:
orl TMOD, #00000100B ;外部时钟接入;3;3
tot0aid12:
mov TH0, #t0mst12 ;预置12MHz计数值
mov t0aid, #t0aid12 ;预置分频数;6;4
toother:
pop ACC
setb t0_sys ;T0为系统占用
setb PT0 ;高优先级
setb ET0 ;允许中断
ret ;7;9
;T0中断处理程序
;push=5, 94 bytes
;6 cycles to clock; 36 cycles min, 42 cycles max where is have to task;
;16 cycles min, 22 cycles max where is no task.
org 000BH
ljmp _t0int
t0_cseg segment code
rseg t0_cseg
_t0int:
clr EA ;关中断
djnz t0aid, t0reti ;辅助分频器减一不为零转移;3
mov t0aid, #t0aid12 ;重置辅助分频器
push ACC ;保存A累加器
mov a, prgnow
... ...
|