流水灯实验过程

流水灯

1.基本思路

  1. 先让P1口全为高电平(灯不亮)
  2. 通过为左移/位右移动来实现依次点亮LED灯一个具有注脚的文本。1
  3. 用for循环语句嵌套
  4. 写程序
#include //用到的头文件
void main()
{
     	
	int i;	
	P1=0xff;//给每个位高电平11111111
	for(i=8;i>0;i--)//8个灯,位左移8次
	{
     
		P1=P1<<1;//位左移的
	}
}
  1. 结果:灯全部亮了,因为程序运行的很快
    流水灯实验过程_第1张图片

  2. 找学姐讨论
    流水灯实验过程_第2张图片

  3. 其他问题
    Keil5无法写中文注释
    解决方法见链接:如何写中文注释

2.延时程序的加入

#include 
void main()
{
     	
	int i,a;
	P1=0xff;//位操作,给每个位高电平11111111,灯不亮
	while(1)//让灯不断地亮和灭
	{
     
	for(i=8;i>0;i--)//8个灯,位左移8次
	{
     
		P1=P1<<1;//位左移
		for(a=60000;a>0;a--)//延时程序
		{
     
			;//结构体为空,但是要记得加分号
		}	
	}
	P1=0xff;//给每个位高电平11111111,让全亮的灯灭掉
	for(a=60000;a>0;a--)//重灭到开再延时,要不然
		{
     ;}
	}
}

结果:还是全亮,真的不知道为什么,现在也没有搞明白(询问????????????)

更改后,可以运行,不会再全部灯亮

#include 
void main()
{
     	
	int i,a;
	P1=0xff;//位操作,给每个位高电平11111111,灯不亮
	while(1)//让灯不断地亮和灭
	{
     
	for(i=8;i>0;i--)//8个灯,位左移8次
	{
     
		P1=P1<<1;//位左移
		for(a=30000;a>0;a--)//延时程序把a的值改小了,之前有符号int的范围和无符号的搞混了
		{
     
			;//结构体为空,但是要记得加分号
		}	
	}
	P1=0xff;//给每个位高电平11111111,让全亮的灯灭掉
	for(a=30000;a>0;a--)//重灭到开再延时,要不然
		{
     ;}
	}
}
原因:数据类型int的范围搞错,超了

流水灯实验过程_第3张图片

3.上网搜

结果:找到了很多的方法,但基本都需要调用函数,我看不懂

4.去B站找

结果:发现把自己的延时程序变成用while语句实现的就可以了

//从左到右点亮
#include 
void main()
{
     	
	int i,a;
	P1=0xff;//位操作,给每个位高电平11111111,灯不亮
	while(1)//让灯不断地亮和灭
	{
     
	for(i=8;i>0;i--)//8个灯,位左移8次
	{
     
		P1=P1>>1;
		a=65535;
		while(a--);//延时程序
	}
	P1=0xff;//给每个位高电平11111111,让全亮的灯灭掉
	a=65535;
		while(a--);//重灭到开再延时,要不然程序运行太快有是一直亮着
	}
}




//右到左
#include 
void main()
{
     	
	int i,a;
	P1=0xff;//给每个位高电平11111111
	while(1)
	{
     
	for(i=8;i>0;i--)
	{
     
		P1=P1<<1;//就这里不一样
		a=65535;
		while(a--);
	}
	P1=0xff;//给每个位高电平11111111
	a=65535;
		while(a--);
	}
}

当时最开始只是亮了一个灯流水灯实验过程_第4张图片


#include //声明头文件
void main()
{
     	
	int i,a;
	P1=0xff;//给每个位高电平11111111
	while(1)
	{
     
	for(i=8;i>0;i--)
	{
     
		P1=P1<<1;
		a=65535;
		while(a);
	}
	P1=0xff;//给每个位高电平11111111
	a=65535;
		while(a);//a出问题了
	}
}

原因:while里面的a没有“减减”

5.其他问题

  1. 字母P一定要大写,它头文件里面是这样子定义的
  2. 花括号成双成对,出现了程序写太长结果花括号漏掉或者重复的情况
  3. 把注释符号“//”写在了分号“;”前面,结果编译一堆错误
  4. 板子烧录程序与视频讲解的略有不同,就“冷启动”那里,但都是先点下载再开开关
  5. Keil头文件名字要大写,视频里由于版本的原因是小写,可右键直接添加头文件流水灯实验过程_第5张图片
  6. 放大直接ctrl+滚轮
  7. 再一个个亮后加了延时程序,结果灭后面没有加延时程序,导致第一个灯就没有灭过
  8. 数据类型没搞对,赋值太大,超过范围

  1. 当时想了两种流水灯情况,但是第一种要用到循环左移/循环右移,我写不出来,所以想了第二种的
    ↩︎

你可能感兴趣的:(单片机,c语言)