眼镜蛇 发表于 2010-5-21 13:49:47

单片机外部中断实验汇编程序(急救车与交通灯)

【参考设计一】
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

眼镜蛇 发表于 2010-5-21 13:51:49

【参考设计二】--------------------这个貌似是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);
}

}
}

眼镜蛇 发表于 2010-5-21 14:12:16




【参考设计三】
-----------------------------------
参考程序:
         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]
查看完整版本: 单片机外部中断实验汇编程序(急救车与交通灯)