【参考设计一】 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
|
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 ;中断控制实验 |