51单片机编程题,急

正常时8只LED交替全亮全灭,延时1S(系统时钟6MHz),两个外部中断源分别请求中断,从右向左循环点亮或从右向左循环点亮LED。要求外部中断1为高级中断,外部中断0为低级中断。

第1个回答  2017-12-12
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0
ORG 0013H
LJMP EXT1
ORG 001BH
LJMP T1ISR
ORG 0030H
MAIN:
    MOV TMOD,#10H
    MOV TH1,#HIGH(65536-50000)
    MOV TL1,#LOW(65536-50000)
    SETB TR1
    SETB ET1
    SETB EA
    SETB EX0
    SETB EX1
    SETB IT0
    SETB IT1
    SETB PX1
    CLR PX0
    MOV A,#0FEH
    MOV R2,#0
    MOV R3,#20
    MOV B,#0
    SJMP $
EXT0:
    MOV R2,#1
    RETI
EXT1:
    MOV R2,#2
    RETI
T1ISR:
    CLR TR0
    MOV TH1,#HIGH(65536-50000)
    MOV TL1,#LOW(65536-50000)
    SETB TR1    
    DJNZ R2,T1E
    MOV R2,#20
    CJNE R2,#0,T101
    PUSH ACC
    MOV A,B
    CPL A
    MOV P0,A
    MOV B,A
    POP ACC
    RETI
T101:
    CJNE R2,#1,T102
    MOV P0,A
    RL A
    RETI
T102:
    MOV P0,A
    RR A
T1E:
    RETI

本回答被网友采纳
第2个回答  2017-12-12
主程序这样写:
unsigned char flag=0;
void main(void)
{
EX0=1;EX1=1;IT0=1;IT1=1;
EA=1;IP=0X04;
while(1)
{
if(flag==0)
{P0=0;delay_ms(500);P0=255;delay_ms(500);}
if(flag==1)
{
for(i=0;i<8;i++){P0=1<<i;delay_ms(500);}
}
if(flag==2)
{
for(i=0;i<8;i++){P0=0x80>>i;delay_ms(500);}
}
}
}
中断程序中只需改变flag的值即可
相似回答