51 流水灯 keil+proteus 全网最详细

准备工作:

  1. 1.csdn 搜索 吴小凹

51 流水灯 keil+proteus 全网最详细_第1张图片

  1. 2.下拉找到51系列专栏。

51 流水灯 keil+proteus 全网最详细_第2张图片

  1. 3.找到这篇博客。

51 流水灯 keil+proteus 全网最详细_第3张图片

  1. 4. 选择下载这个文件. 51 流水灯 keil+proteus 全网最详细_第4张图片

如果没有积分的同学可以,关注微信公众号吴小凹,发送点亮led 也可以获取该文件。

修改原理图文件:

1. 找到proteus 工程文件。如果没有安装proteus 可以参考我的这篇博客。

51单片机仿真利器,proteus 8.13安装与激活_吴小凹的博客-CSDN博客

51 流水灯 keil+proteus 全网最详细_第5张图片

51 流水灯 keil+proteus 全网最详细_第6张图片

  1. 2.修改原理图。删除led,鼠标点住右键,选中他们,再按下Delete键即可。

  • 放置总线。

51 流水灯 keil+proteus 全网最详细_第7张图片

点完总线标记后,鼠标在固定位置再左键点击下,即可开始画线。

3.将P0端口都连接到总线上方即可。

51 流水灯 keil+proteus 全网最详细_第8张图片

点击端口末尾,或者快捷键w都可以完成连线。

4.放置8颗LED灯。可以放置一颗摆好位置后面直接复制即可。

51 流水灯 keil+proteus 全网最详细_第9张图片

电阻改成1k,一下即可,但是也不能太小了。

5.完成8颗led的复制。

51 流水灯 keil+proteus 全网最详细_第10张图片

6.关于元器件的选择及其修改参数,可以查看点亮led的那篇文章。

keil+proteus 完成最小系统,点亮led 灯实验_吴小凹的博客-CSDN博客

7.添加网络标号,网络标号就是使用一个字符代表两个地方是连在一起的意思。总线其实就相当于一个束线器而已,并没有连接上.

51 流水灯 keil+proteus 全网最详细_第11张图片网络标号我们选择D1,D2……一直到D8代表8颗灯。

8.两边网络标号添加完成如下图所示。

51 流水灯 keil+proteus 全网最详细_第12张图片

9.给LED添加电源符号。共阳极8颗LED就连接好了。

51 流水灯 keil+proteus 全网最详细_第13张图片

修改程序:

1.选择led.文件夹。

51 流水灯 keil+proteus 全网最详细_第14张图片

2. 双击工程文件。如果没有安装软件可以参考我的这篇博客。

如何安装使用keil c51 安装并激活到2032-CSDN博客

51 流水灯 keil+proteus 全网最详细_第15张图片

3. 首先我们先改下代码,让8颗灯都亮起来。

/*51单片机的头文件*/
#include 
/*主函数*/
int main()
{
    /*拉低P1端口*/
    P0=0;
    /*单片机等待*/
    while(1);
}

4. 编译生成hex,该步骤不在重复,请参考博文:

keil+proteus 完成最小系统,点亮led 灯实验_吴小凹的博客-CSDN博客

5. 此时文件下载到单片机的运行结果如下图。

51 流水灯 keil+proteus 全网最详细_第16张图片

6. 我们先将其修改为闪烁状态,加入延时代码。

/*51单片机的头文件*/
#include 
// 引入stdint.h库,这个库提供了几种固定的整数类型。 
#include  
// 定义一个函数,名称为delay_ms,接受一个无符号16位整数(uint16_t)作为参数,表示延迟的毫秒数。 
void delay_ms(uint16_t nms) 
{ 
 // 定义一个无符号8位整数(uint8_t),名称为i,用于循环控制。 
 uint8_t i; 
 // 进入一个while循环,条件是nms大于0。当nms为0时,跳出循环。 
 while(nms--) 
 { 
 // 进入一个for循环,循环次数是120次,i的值从0递增到119。 
 for(i=0;i<120;i++); 
 } 
}
/*主函数*/
int main()
{
    /*单片机等待*/
    while(1)
    {
        /*拉低P1端口*/
        P0=0x00;
        delay_ms(500);
        /*拉低P1端口*/
        P0=0xff;
        delay_ms(500);
    }

}

下载代码后的效果会按照一定的频率进行闪烁。

51 流水灯 keil+proteus 全网最详细_第17张图片

7. 实现流水灯,我们发现根据我们的电路只需要给它0.就能亮给它1就是灭,我们要实现流水灯,就得每次点亮一颗,然后让其他熄灭。

逻辑1:点亮第一颗灯,其他灯熄灭。

逻辑2:点亮第二颗灯,其他灯熄灭。

……

但是如果是几十颗灯我们不能没个都写一个代码吧,所以我们,定义一个变量,让它每次向左移动一位,就可以了,代码如下。

/*51单片机的头文件*/
#include 
#define uint16_t unsigned short
#define uint8_t unsigned char
		
  
// 定义一个函数,名称为delay_ms,接受一个无符号16位整数(uint16_t)作为参数,表示延迟的毫秒数。  
void delay_ms(uint16_t nms)  
{  
 // 定义一个无符号8位整数(uint8_t),名称为i,用于循环控制。  
 uint8_t i;  
 // 进入一个while循环,条件是nms大于0。当nms为0时,跳出循环。  
 while(nms--)  
 {  
 // 进入一个for循环,循环次数是120次,i的值从0递增到119。  
 for(i=0;i<120;i++);  
 }  
}
/*主函数*/
int main()
{
	uint8_t i;
	/*单片机等待*/
	while(1)
	{
		for(i=0;i<8;i++)
		{
				/*拉低P1端口*/
			P0=0x01<

实验现象:会有一个灯循环的灭。

51 流水灯 keil+proteus 全网最详细_第18张图片

和我们的想法有点差距,但是离胜利不远了,只需修改一句代码即可,

P0=0x01<

修改为

P0=~(0x01<

将所有的灯取反就正好是流水灯的状态,修改完下载代码后效果如下。

51 流水灯 keil+proteus 全网最详细_第19张图片

到此我们流水灯实验就结束咯,我们下次再见,友友们。

你可能感兴趣的:(仿真调试),c语言,51单片机)