微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 负跳变沿触发中断(汇编程序)

负跳变沿触发中断(汇编程序)

时间:11-18 来源:互联网 点击:
;了解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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top