问有关用C语言单片机做的流水灯的问题

2025-02-25 17:46:39
推荐回答(3个)
回答1:

这个核心的东西是单片机控制的原理,代码比较简单。
我想你不明白的是管脚是如何被控制的:
单片机的通用端口可以通过控制输出高、低电平,想输出高电压那就给控制此管脚的寄存器赋值1,低电压那么就给值0。
这里P1寄存器控制着8个管脚,每个管脚控制着一个灯。同样P0也控制着8个灯。这里P1即表示寄存器。
硬件电路上,灯的两个脚接的都是高电平,那么没有电流通过,不亮。当有一个脚电平变低,那么有了电压降,灯亮了。
P1=0xFE,2进制是1111 1110,表示p1.0=0,即第一个管脚是0值,低电平,而其他的管脚都是高。那么第一个灯亮了。
通过延时,让第一个灯亮了一会。
P2=0xFD,即1111 1101,关了第一个灯,然后让第二灯亮了。
其他同理。

从数组的值,可以看出灯亮灭的顺序:
1111 1110
1111 1101
1111 1011
1111 0111
1110 1111
1101 1111
1011 1111
0111 1111
....

此数组值是先让灯亮一个,从头到尾灯挨个亮,接着再从头跑一遍。
然后反方向跑一遍,再1遍。
最后全亮,全灭,全亮,全灭
再从头循环..........

你如果设计8个,那么就用P0或者p1中的一个即可。
即删除程序中的:
P0=table[i];//P0灯亮
或者
P1=table[i];//P0灯亮

流程如下:
开始
进入主循环
判断是否到一次跑马灯结束
是结束就将i值为0,即从头开始又一轮的跑马灯。
否就继续本轮的跑马灯
先让给P1赋值让P1上指定的灯亮。
然后延时让这个灯亮一会。
接着给P0赋值让P0上指定的灯亮。
继续主循环

回答2:

void main()//主程序
{
while(1) { //无限循环
if(table[i] != 0x01) { //如果数组中第i个数据,不是1
P1 = table[i]; //就送到P1口
delay(); //延时几十毫秒
P0 = table[i]; //再送到P0口
i++; //序号递增
}
else { //如果数组中第i个数据,是1
i = 0; //就令序号为0
}
}
}
本程序中,序号i会自动递增,从而就可以由数组中,逐个的取出元素,送到P1和P0口。如果取出的数据是1,就令i归零。

由于i是CHAR型,所以数组中,最多可以容纳256个元素,把这些元素编写好,不仅仅可以看到流水灯的效果。

每个灯,发光的时间,取决于 delay() 函数的执行时间。

回答3:

做流水灯那用这么复杂的程序哟
试试这个
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp;
void delay(uint);
void main()
{
temp=0xfe;
P1=temp;
while(1)
{
temp=_crol_(temp,1);
delay(500);
P1=temp;
}

}
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}