;了解8051的timer0中止的程序写法,用中止法发生守时,是灯明一下,暗一下,假如呈现外部中止的时分,在进入外部中止服务程序
COUNTEQU9217 ;关于11.0592的晶振来说,延时10ms
LED1EQUP1.1
LED2 EQUP1.3 ;作为外部中止0的显现来用
;
ORG 0000H
LJMP RESET ;跳转到初始化程序中
ORG 0003H ; INT0(外部中止0)
LJMP INT_ET0;跳转到外部中止0服务程序中去(此程序中止便是从这进入的)
ORG000BH;TIMER0(守时器/计数器T0)
LJMPINT_TIMER0;跳转到守时器/计数器中止服务程序中去
//ORG0013H;外部中止1
//RETI;中止的回来指令
//ORG001BH;TIMER1(守时器/计数器T1)
//RETI
//ORG0023H;串行口中止
//RETI
;
ORG0030H
RESET: MOVR0,#00H
DJNZR0,$;刚开端,先进行少数的延时,是各种作业寄存器准备好
SETBLED1
SETBLED2
;设置守时器中止
MOVTMOD,#00000001B
MOVTH0,#HIGH(65536-COUNT)
MOV TL0,#LOW(65536-COUNT)
//MOVTH0,#(65536-COUNT)/256;取高八位数据
//MOVTL0,#255;取底五位(为最大了)
CLRTF0;先把溢出标志位清零
SETBTR0;开端计时
SETBET0;ET0为守时器/计数器T0溢出中止答应位
;设置外部中止0
SETBIT0;设置外部中止0为跳变言触发方法
CLRIE0
SETBEX0
SETBEA
MOVIP,#00000001B;设置PX0为高优先级中止(外部中止0)
MOVR1,#00H;作为守时器累加器运用
LOOP:SJMPLOOP ;在此等候
;
;IE0=1
INT_ET0://CLRLED2
CPLTR0
//CPLLED1
ACALLDELAY
CLRIE0
CPLLED2
RETI
;TF0=1
INT_TIMER0:
INCR2;使R1自增一
CLRTF0;CLEAR TF0 AGAIN
MOVTH0,#(65536-COUNT)/256;取高八位数据
MOVTL0,#255;取底五位(为最大了)
CJNER2,#10,L0;不相等则搬运指令,这个数能够进行调理
CPLLED1 ;取反指令
MOVR2,#00H
L0: RETI
;延时子程序,12M晶振延时约R4
DELAY: ;大约值:2us*256*256*2=260ms,也能够以为为250ms
PUSH PSW ;现场维护指令(有时能够不加)
MOV R4,#4
L3:MOV R2 ,#00H
L1: MOV R3 ,#00H
L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,假如比1大,则转向L2)
DJNZ R2 ,L1 ; 中层循环:256次
DJNZ R4 ,L3 ;外层循环:2次
POP PSW
RET
END