单片机外部中断实验汇编程序(急救车与交通灯)
【参考设计一】ORG 0
JMP START
ORG 03H
JMP INT0_0
ORG 13H
JMP INT1_1
START:
MOV P1,#0FFH ;关p1口
MOV IE,#85H ;开总中断,INT0,INT1
SETB IT0
SETB IT1
MOV TMOD,#01H
MOV SP,#30H
/*东西方向:P1.0红灯,P1.1黄灯,P1.2绿灯。南北方向: P1.3红灯,P1.4黄灯P1.5绿灯。INT0手动开关。INT1急救车通行。*/
LOOP:
MOV P1,#11011110B ;东西红,南北绿,25s
CALL DELAY
MOV R0,#5
D0: MOV R1,#20 ;换灯时南北方向:先关绿灯,黄灯闪烁5s,用定时器0定时
D0_0: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB P1.5
CPL P1.4
JNB TF0,$
CLR TF0
DJNZ R1,D0_0
DJNZ R0,D0
MOV P1,#11110011B ;东西绿,南北红,25s
CALL DELAY
MOV R1,#50 ;换灯时东西方向:先关绿灯,黄灯闪烁5s,用定时器0定时,模式1
D1: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB P1.2
CPL P1.1
JNB TF0,$
CLR TF0
DJNZ R1,D1
JMP LOOP
INT0_0:
PUSH PSW
PUSH ACC
SETB RS0
JNB P3.2,LOOP0
LOOP0:
MOV P2,#0FFH ;置P2为输入,开关控制灯
MOV A,P2
MOV P1,A
JB P3.2,OUT
JMP LOOP0
OUT: POP ACC
POP PSW
RETI
INT1_1:
PUSH PSW
PUSH ACC
JNB P3.3,$
CLR RS0
SETB RS1
MOV P1,#0FFH
CLR P1.0
CLR P1.3
CALL DELAY1
POP ACC
POP PSW
RETI
DELAY: ;延时25s,令R7=250即可
MOV R7,#50
D2: MOV R6,#200
D3: MOV R5,#250
DJNZ R5,$
DJNZ R6,D3
DJNZ R7,D2
RET
DELAY1: ;延时10s
MOV R7,#100
D4: MOV R6,#200
D5: MOV R5,#250
DJNZ R5,$
DJNZ R6,D5
DJNZ R7,D4
RET
END START 【参考设计二】--------------------这个貌似是C程序·····
实验程序:
include <reg51.h>unsigned char xdata *code L=0xCFA0;/*扩展口地址*/unsigned char D;void display(){
*L=~D;}void delay(unsigned int ms){/*延时函数*/
unsigned char i;
unsigned int j;
for(j=0;j<ms;j++){
for(i=0;i<60;i++){
;
}
}}void int_0() interrupt 0{/*外部中断0执行的子程序*/
int i;
for(i=0;i<15;i++){/*两边黄灯闪烁15次*/
D=0x42;
display();
delay(1000);
D=0x00;
display();
delay(1000);
}}void int_1() interrupt 2{/*外部中断2执行的子程序*/
int i;
for(i=0;i<15;i++){/*两边黄灯闪烁15次*/
D=0x42;
display();
delay(1000);
D=0x00;
display();
delay(1000);
}}main(){/*程序解析见实验三*/
int i=0;
IP=0x02;/*置int0中断高优先级*/
IE=0x85;/*int0,int1开中断,cpu开中断*/
D=0x81;
display();
delay(3000);
while(1){
D=0x21;
display();
delay(10000);
for(i=0;i<5;i++){
D=0x41;
display();
delay(1000);
D=0x01;
display();
delay(1000);
}
D=0x81;
display();
delay(500);
D=0x84;
display();
delay(10000);
for(i=0;i<5;i++){
D=0x82;
display();
delay(1000);
D=0x80;
display();
delay(1000);
}
}
}
【参考设计三】
-----------------------------------
参考程序:
NAME T5 ;中断控制实验
OUTPORT EQU 0CFB0H ;端口地址
SAVE EQU 55H ;save保存从端口cfa0输出的数据
CSEG AT 0000H
LJMP START
CSEG AT 4003H
LJMP INT
CSEG AT 4100H
START: SETB IT0
SETB EX0
SETB EA
MOV A,#11H ;置首显示码
MOV SAVE,A ;保存
ACALL DISP ;显示输出
ACALL DE3S ;延时3秒
LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮
MOV SAVE,A
ACALL DISP
ACALL DE10S ;延时10秒
MOV A,#10H ;东西路口绿灯灭
MOV SAVE,A
ACALL DISP
MOV R2,#05H ;东西路口黄灯闪烁5次
TTT: MOV A,#14H
MOV SAVE,A
ACALL DISP
ACALL DE02S
MOV A,#10H
MOV SAVE,A
ACALL DISP
ACALL DE02S
DJNZ R2,TTT
MOV A,#11H ;红灯全亮
MOV SAVE,A
ACALL DISP
ACALL DE02S ;延时0.2秒
MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮
MOV SAVE,A
ACALL DISP
ACALL DE10S ;延时10秒
MOV A,#01H ;南北路口绿灯灭
MOV SAVE,A
ACALL DISP
MOV R2,#05H ;南北路口黄灯闪烁5次
GGG: MOV A,#41H
MOV SAVE,A
ACALL DISP
ACALL DE02S
MOV A,#01H
MOV SAVE,A
ACALL DISP
ACALL DE02S
DJNZ R2,GGG
MOV A,#11H ;红灯全亮
MOV SAVE,A
ACALL DISP
ACALL DE02S ;延时0.2秒
JMP LLL ;转LLL循环
DE10S: MOV R5,#100 ;延时10秒
JMP DE1
DE3S: MOV R5,#30 ;延时3秒
JMP DE1
DE02S: MOV R5,#02 ;延时0.2秒
DE1: MOV R6,#200
DE2: MOV R7,#126
DE3: DJNZ R7,DE3
DJNZ R6,DE2
DJNZ R5,DE1
RET
INT: CLR EA
PUSH ACC ;中断处理
PUSH PSW
MOV A,R5
PUSH ACC
MOV A,#11H ;红灯全亮,绿、黄灯全灭
ACALL DISP
DEL10S: MOV R3,#100 ;延时10秒
DEL1: MOV R2,#200
DEL2: MOV R5,#126
DEL3: DJNZ R5,DEL3
DJNZ R4,DEL2
DJNZ R3,DEL1
MOV A,SAVE ;取SAVE中保存数据输出到cfa0端口
ACALL DISP
POP ACC ;出栈
MOV R5,A
POP PSW
POP ACC
SETB EA ;允许外部中断
RETI
DISP: MOV DPTR,#OUTPORT
CPL A
MOVX @DPTR,A
RET
END
页:
[1]