COUNT EQU 9217 ;对于11.0592的晶振来说,延时10ms
LED1 EQU P1.1
LED2 EQU P1.3 ;作为外部中断0的显示来用
;
ORG 0000H
LJMP RESET ;跳转到初始化程序中
ORG 0003H ; INT0(外部中断0)
LJMP INT_ET0 ;跳转到外部中断0服务程序中去 (此程序中断就是从这进入的)
ORG 000BH ;TIMER0(定时器/计数器T0)
LJMP INT_TIMER0 ;跳转到定时器/计数器中断服务程序中去
// ORG 0013H ;外部中断1
// RETI ;中断的返回指令
// ORG 001BH ;TIMER1(定时器/计数器T1)
// RETI
// ORG 0023H ;串行口中断
// RETI
;
ORG 0030H
RESET: MOV R0,#00H
DJNZ R0,$ ;刚开始,先进行少量的延时,是各种工作寄存器准备好
SETB LED1
SETB LED2
;设置定时器中断
MOV TMOD,#00000001B
MOV TH0,#HIGH(65536-COUNT)
MOV TL0,#LOW(65536-COUNT)
//MOV TH0,#(65536-COUNT)/256;取高八位数据
// MOV TL0,#255 ;取底五位(为最大了)
CLR TF0 ;先把溢出标志位清零
SETB TR0 ;开始计时
SETB ET0 ;ET0为定时器/计数器T0溢出中断允许位
;设置外部中断0
SETB IT0 ;设置外部中断0为跳变言触发方式
CLR IE0
SETB EX0
SETB EA
MOV IP,#00000001B;设置PX0为高优先级中断(外部中断0)
MOV R1,#00H ;作为定时器累加器使用
LOOP: SJMP LOOP ;在此等待
;
;IE0=1
INT_ET0://CLR LED2
CPL TR0
//CPL LED1
ACALL DELAY
CLR IE0
CPL LED2
RETI
;TF0=1
INT_TIMER0:
INC R2 ;使R1自增一
CLR TF0 ;CLEAR TF0 AGAIN
MOV TH0,#(65536-COUNT)/256;取高八位数据
MOV TL0,#255 ;取底五位(为最大了)
CJNE R2,#10,L0 ;不相等则转移指令,这个数可以进行调节
CPL LED1 ;取反指令
MOV R2, #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
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』