微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 流水灯设计的几个程序

流水灯设计的几个程序

时间:11-25 来源:互联网 点击:
第一个程序:让流水灯,从左到右,第一个灯,一瞬间到最高亮度,然后降到最低亮度,之后,就是前两个灯重复第一个灯的情况,然后是前三个灯,然后是前4个灯,直到全部完成
程序如下:
#include
delay(k)//延时函数
{
while(k--)
{}
}

voidmain(void)//主函数
{
unsignedintt=25000,n=1;
P1=0xfe;
for(n = 1;n<=7;n++)//可读性提高
{
delay(t);
P1=(0xfedelay(t);
P1=0XFF;
}
}
开始的时候不会用位运算,把每一步都写出来(一闪一灭,每一次都是用赋值来表示),数着到那一个闪烁,
代码很复杂,经过提醒后,然后通过位运算,大大化简了代码的数量,而且可读性提高不少..
错误的原因是:不了解编译语言是否可以像c语言一样编译,想了一会,就用复杂的代码去写出这个程序.

第二个程序:让流水灯,从右到左,第一个灯从暗到明,然后到最亮程度就保持住这个状态,然后第二个灯紧接着从暗到明,然后是第3个灯,以此类推直到全亮,然后集体熄灭.
程序如下:

#include
delay(k)//延时函数
{
while(k--)
{}
}

voidmain(void)//主函数
{
unsignedintn=1,i=1;//都最后要看看那些是变量,那些是常量
const int t = 600;


P1=0XFF;
for(n = 1;n9;n++)
{
for(i=1;i<=t;i++)
{
delay(t-i);//通过每一次循环暗的时间减少
P1=(0XFF>>n);
delay(i);//通过每一次循环,亮的时间增多,在人的眼睛看来就可以逐渐增亮
P1=(0XFF>>(n-1));
}
}
P1=0XFF;
delay(25000);
}
开始的时候,认为通过闪烁次数和熄灭的次数一样,然后最后就亮了,就可以算是由暗到亮了,这个想法到最后烧写发现变化太快了,由暗到亮的过程不算表示出来,出现了最致命的错误...
其实我们主要是在亮和暗的时间方面做了缓慢的变化就可以表示有暗到亮的过程....

第三个程序:让流水灯,从左到右,第一个灯,从暗到明,然后亮度再降下来,然后是接下一个灯,就是依次明暗亮一个灯,一次只亮暗一个
程序如下:
#include

delay(k)//一个延时的函数
{
while(k--)
{}
}

voidmain()//主函数
{
unsignedintdark=0xfe,i=1,n=1;
constintt=600;//珍惜内存啊,不变的可以用常量来表示

P1=0xff;
for(n=1;n<=8;n++)
{
for(i=1;i{
P1=0XFF;
delay(t-i);
P1=(dark);
delay(i);
}
for(i=i;i>0;i--)//由亮到暗
{
delay(t-i);
P1=(dark);
delay(i);
P1=0XFF;
}
dark=(dark<1)+1;//向左位移后,最右补0,如果没有+1,那就会亮起来,没有一次只亮一个
}
}
开始的时候,也是想到用加法去表示出来,用0xff在其中,for中的语句有一些可读性不高的语句for(;n<9;n++),这些语句,在看程序的时候就要找出那个已经赋值的n在那里,是什么值..最后就把他改为for(n = 1;n<9;n++)
在其中有一个常量用了变量的形式去表示,这个是占用内存的错误,因此,每一次写,就要想好这个量是用常量还是用变量,如果是常量,可以用宏的形式去表示,也可以用const 去表示..用宏更容易维护


最后,我想下一次,每一次烧写我的程序之前,都会用流水灯的程序运行运行一次,确保灯的连线闭路的...
而且,写完运行之后,就找找那些变量是不是变了,是不是可以用常量表示.
自己看自己的程序,是不是可以一路看到最后,走到那个一步是要找出他的大小..会有麻烦,不方便...就看是否可以进行修改...

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top