下面這段程序大致效果是通過一個按鍵切換8的LED燈組成的流水燈模式的變換。那如何添加定時程序,使它不論在什么模式下只要總體運行30秒后8的燈不在亮。
單片機源程序如下:
#include<reg51.h>void delay(unsigned char ms)
{
unsigned char i,j,k,n;
for (k=0;k<ms;k++)
for(i=0;i<20;i++)
for(j=0;j<13;j++)
for(n=0;n<2;n++);
}
void code moshi0()
{
P0 = 0xff;
}
void code moshi1()
{
unsigned char i,j;
j=0x01;
for(i=0;i<8;i++)
{
P0=~j;
delay(5000);
j<<=1;
}
}
void code moshi2()
{
P0=0Xaa;
delay(2000);
P0=~0Xaa;
delay(2000);
}
void code moshi3()
{
char a;
a=8;
P0=0x7f;
while(a--)
{
delay(5000);
P0=(P0>>1)+0x80;
}
}
void code moshi4()
{
char a,b;
char x;
x=3;
P0=0xe7;
delay(2000);
while(x--)
{
a=P0&0xf0;
b=P0&0x0f;
a=(a<<1)+0x10;
b=(b>>1)+0x08;
P0=a+b;
delay(2000);
}
}
void code moshi5()
{
P0 = 0x00;
delay(50);
P0=0xff;
delay(50);
}
void code moshi6()
{
P0 = 0xf0;
delay(2000);
P0=~0xf0;
delay(2000);
}
unsigned char i=0;
sbit key = P2^0;
void (* moshi)() = moshi0;
void key_scan()
{
TR0 = 0;
TH0 = 0x3c;
TL0 = 0xb0;
TR0 = 1;
key = 1;
delay(1);
if (key == 0 )
{
delay(10);
if (key == 0 )
{
i++;
if(i>7) i=0;
switch(i)
{
case 0 : moshi=moshi0;break;
case 1 : moshi=moshi1;break;
case 2 : moshi=moshi2;break;
case 3 : moshi=moshi3;break;
case 4 : moshi=moshi4;break;
case 5 : moshi=moshi5;break;
case 6 : moshi=moshi6;break;
}
while( key == 0)
delay(10);
}
}
}
void timer0 () interrupt 1
{
key_scan();
}
void main()
{
TMOD = 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
moshi();
}
}
|