单片机51的流水灯
不死心的我尝试了硬件,作为一个硬件特别菜的我,我只能说,我真的尽力了~~~~
好了,马上开始我的表演
这个是我的单片机板子,相当精致了,是吧,这个是我们实训室的师兄做的,skr~
马上严肃,首先为了让灯亮,你要想一个问题,他为什么会亮,这是受高低电频的影响呀,所以我使用了一个我自认为最简单的方法来做这个实验,大家都会十六进制的算法吧【此处默认都会】
算法是这个算法的,比较好懂吧,那我们直接上程序
unsigned char code MovinglightArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
这句代码的意思就是找个数组,把流水灯运动时所有的亮灭的过程放在这个数组里,比方说,这里的0xfe,它不就是二进制的11111110吗?所以这里它是从右手这边开始亮,然后依此想左开始亮,如果不信的小伙伴可以自己尝试算一下。
这里我得说一句,共阴和共阳也是不一样的,比如他们完全相反,一个是0是亮,一个是1是亮,大家因板而异,不要强求
我们将它做成一个数组,有没有一个冲动,想把它做成一个方法,在main方法里调用它?
无论各位有没有这个冲动,反正我有。申明一个方法,方法名字尽量和这个数组名字差不多,不然我怕大家会忘记这个方法是干嘛用的。
void Movinglight();
这个方法里应该有什么呢,当然是来回跑的循环呀
void Movinglight()
{
while(1)
{
for(i = 0;i < 8;i++){
P1 = MovinglightArray[i];
delaySec(TIME);
}
}
OK,这是从左到右的跑,我们要实现来回跑,那我们只要再加一个for循环就okk了。
for (i=7;i>=0;i--){
P1 = MovinglightArray[i];
delaySec(TIME);
}
最后使用main调用Movinglight()
int main()
{
Movinglight();
return 0;
}
这是整个思路的整理,我要上整个程序:
void delaySec(unsigned char n);
void Movinglight();
unsigned char code MovinglightArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i,n = 1;
int main()
{
Movinglight();
return 0;
}
void Movinglight()
{
while(1)
{
for(i = 0;i < 8;i++){
P1 = MovinglightArray[i];
delaySec(TIME);
}
for (i=7;i>=0;i--){
P1 = MovinglightArray[i];
delaySec(TIME);
}
}
void delaySec(unsigned char n)
{
unsigned int i,j,l;
for(l = 0;l < n;l++)
for(i = 0;i < 1000;i++)
for(j = 0;j < 114;j++);
}
LED灯和P1连,就OK了
转载:https://blog.csdn.net/qq_44965498/article/details/101033429
查看评论