JMP MAIN 跳转到主程序 ORG 03H 外部中断0地址 JMP EXT1 跳转 ORG 13H 外部中断1地址 JMP EXT2 跳转 MAINMOV IE, #85H 使能中断 0,1 SETB TCON2 边沿触发 SETB。
void touch_INT0interrupt 0 pragma asm 汇编语句 pragma endasm 需要打开SRC一右键单击 源程序 文件,选择“Options for ”二选择“Properties ”选项卡 三在右侧,选中这两个选项“Generate Ass。
循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停程序如下ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 外部中断0。
CONT_INT EQU 31H定义中断间隔的计数变量,用于控制20个中断为1秒的时间间隔 ORG 00H AJMP GO ORG 0BH AJMP INT0_1定时器0,工作方式1 GOMOV SP,#60H MOVP1,#00HP1口初始全部关闭 MOV CONT_DISP,#8 查。
1COUNT_INT EQU 30HLEDVALUE EQU 31H ORG 0000H LJMP START ORG 001BH LJMP Timer1InterruptSTART MOV SP,#60H MOV COUNT_INT,#0 MOV LEDVALUE,#01H LCALL InitTimer1LOOP。
ET0 SETB TR0 RET Timer0InterruptPUSH DPH PUSH DPL PUSH ACC MOV TH0,#0FCH MOV TL0,#18H CPL P10 POP ACC POP DPL POP DPH RETI END 这是定时器0的一个1ms中断一次的程序 在P10端口输出1KHz方波。
RETI 返回到 SJMP $SJMP $,是死循环,它的下一条,还是它不用延时程序按一下键,移动一位这是由人按键,来控制延时时间。
主程序是流水灯0到7依次点亮流水灯7到0依次点亮,反复循环外部中断程序是灯全亮全灭3次但是,程序没有开中断的指令,中断程序是不会执行的START 在下面添加SETB EA 开总中断SETB EX0。
MOV IE, #82H 开中断 第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,第五秒L0,L2,L4,L6亮,第六秒钟,L1,L3,L5,L7亮,第七秒钟八个二极管全亮,第八秒钟全灭MOV 30H。
每次经过这里sp都会增加2,那么reti就无法根据sp指向的ram地址保存的值返回到原来的位置了一般push是在一进入中断时将acc和psw压栈保护现场,reti之前出栈还原现场的,你在reti之前用两个push是完全不需要的。
晶振12M DSEG AT 30H timetemp DS 1 LED DS 1 CSEG AT 00H ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt STARTMOV SP,#60H MOV timetemp,#20 MOV P1,#0FFHLED低电平点亮。
51单片机5个中断源的中断程序入口地址分别是INT00003H T0 000BH INT10013H T1 001BH 串口0023H 一般在相应的中断入口位置写一跳转指令LJMP,在中断服务程序最后写返回指令RETI。
ORG 0000H LJMP MAIN 主程序开始 ORG 000BH AJMP PIT0 t0中断入口 ORG 001BH AJMP PIT1 t1中断入口 MAIN MOV SP, #60H 设置堆栈 MOV TMOD, #03H 定时器方式 T0T1都是方式1 MOV TL0, #9CH。
ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ORG 0030H MAINMOV SP,#5FH SETB IT0 SETB EX0 SETB EA MOV A,#0F0H MOV P2,A SJMP EXT0CPL A MOV P2,A RETI END。
编程方法有问题,不管 C 语言 或者 汇编语言,在中断服务程序中 要简洁,不要在中断程序中 调用延时程序 及 处理时间长的 事件, 简单的程序 或许 还能实现,稍微复杂一点 肯定会出错比如在 中断中 设置一个标志位。