您的位置:首页 > 其它

单片机AT89c51——流水灯设计

2012-05-09 17:05 701 查看
单片机AT89c51——流水灯设计

本人新手,现在刚开始学习单片机,学的是AT89C51,第一次写博客,路过的轻喷。

现在,开始设计一个流水灯程序,该程序需要实现,流水灯的正向行走和逆向行走。
1、先用proteus画出电路图。



2、在keil里面写下代码,编译好,来控制P0口。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code display[9]={0xfe,0xfd,0xfb,
0xf7,0xef,0xdf,
0xbf,0x7f,0xff};  //设置P0口的代码
delay(uint k){							//延时
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<2000;j++);
}
void main(){
uchar i =0;
uchar olm = 0;			//标志变量,标志流水灯的走向
P0 = 0xFF;

while(1){
if(display[i]!=0xff&&olm==0){   //判断8盏灯没有亮完,而且判断是否流水灯是正向走动
P0 = display[i];
i++;
delay(100);
}
else  {					//判断8盏灯已经亮完
olm = 1;
i--;
P0 = display[i];

delay(100);
if(i==0){		//逆走向是否亮了第一盏灯
olm = 0;			//告诉程序灯应该正走向
}
}

}
}


程序实现了流水灯的正逆走向,但是感觉这段程序可读性太差。

2、重新写了一段,加了两个for循环。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code display[9]={0xfe,0xfd,0xfb,
0xf7,0xef,0xdf,
0xbf,0x7f,0xff};  //设置P0口的代码
delay(uint k){					//延时
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<2000;j++);
}
void main(){
uchar i =0;

P0 = 0xFF;

while(1){
for(i=0;i<7;i++){		   //正向循环
P0 = display[i];
delay(100);

}
for(i=8;i>0;i--){		//逆向循环
P0 = display[i];
delay(100);
}
}
}
感觉这段代码可读性好了一点,但是效率嘛。。。。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: