找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 6169|回复: 2

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

[复制链接]
眼镜蛇 发表于 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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表