setb p1^0
pUSH 04H
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
DELAY5S_1:MOV R6,#245
DJNZ R6,$
DJNZ R5,DELAY5S_1
DJNZ R4,DELAY5S_0
POP 06H
POP 05H
POP 04H
clr p1^0
pUSH 04H
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
DELAY5S_1:MOV R6,#245
DJNZ R6,$
DJNZ R5,DELAY5S_1
DJNZ R4,DELAY5S_0
POP 06H
POP 05H
POP 04H
pUSH 04H
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
DELAY5S_1:MOV R6,#245
DJNZ R6,$
DJNZ R5,DELAY5S_1
DJNZ R4,DELAY5S_0
POP 06H
POP 05H
POP 04H
ORG 0000H
LJMP MAIN
ORG 000B ;定时器T0中断程序入口地址
LJMP IST0
ORG 0030H
MAIN: JNB P3.0 NEXT ;P3.0接开关
LJMP MAIN
NEXT:CLR P1.0
MOV 30H,#00H ;用软件计数器
MOV 31H,#00H
MOV TMOD,#01H ;用定时器T0,并设置在方式1,在定时状态。
MOV TH0,#3CH ;设置初值15536,让定时器定时50000us。
MOV TL0,#B0H
SETB ET0 ;打开T0中断。
SETB EA ;打开中断总开关。
MOV TCON,#10H(或者:SETB TR0) ;开启定时。
LJMP $
IST0:PUSH ACC ;中断服务子程序。
PUSH PSW
INC 30H
INC 31H
MOV A,30H
CJNE A,#100,NEXT1 ;让其定时50000us X 100=5s。
SETB P1.0 5s后P1.0灭。
MOV 30H,#00H
MOV TH0,#3CH ;重装初值,需要继续引起中断。
MOV TL0,#B0H
NEXT1:MOV A,31H ;继续定时。
CJNE A,#200,LOOP1 ;定时10s后,P1.1亮。
CLR P1.1
MOV 31H,#00H
LOOP1:MOV TH0,#3CH 重装初值。。
MOV TL0,#B0H
POP PSW
POP ACC
RETI 中断返回
END
说明:此程序未在实验板上验证过,只提供一种思路。。。
#include <reg51.h>
sbit led = P1^1;
sbit key = P1^0;
unsigned char x,y;
void delay(void)
{
unsigned char i,j,k;
for(..;...;..)
for(..;...;..)
for(..;...;..);
} //延时1秒;
void main(void)
{
if(key==0)
{
led=0;
for(x=5;x>0;x--) //点亮5秒;
{
delay();
}
led=1; //熄灭10s;
for(x=10;x>0;x--)
{
delay();
}
led=0;
}
}
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |