AT89C51单片机的P1口控制8盏LED流水灯
跪求 展开
# include "reg51.h" // 包含头文件
#define uchar unsigned char
void delay02s(void) // 延时0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函数
{
uchar i,j;
while (1) // 死循环
{
j=0x01; // j初始化为0x01,左移初始值
for(i=0;i<8;i++) // for循环语句,完成8个循环
{
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出
delay02s( ); // 延时0.2s
j= j<<1; // 左移1位
}
j=0x80; // 设置右移初始值j为0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}
这只是延时的方法实现的。
多谢你的回答啊,这是定时器延迟还是软件延迟啊?
延时。定时器的话,你可以试着这样去想一下:
# include "reg51.h" // 包含头文件
#define uchar unsigned char
uchar timeCnt;
void main (void) // 主函数
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
ET0=1;
EA=1;
TR0=1;
while (1) ; // 死循环
}
void Timer0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
timeCnt++;
if(timeCnt==20) P1=0xFE;
if(timeCnt==40) P1=0xFD;
if(timeCnt==60) P1=0xFB;
if(timeCnt==80) P1=0xF7;
if(timeCnt==100) P1=0xEF;
if(timeCnt==120) P1=0xDF;
if(timeCnt==140) P1=0xBF;
if(timeCnt==160) { P1=0x7F; timeCnt=0;}
}
方法大概是这样,我没有上机试过。你可以看看。