Bootstrap

手把手教入手编写51单片机流水灯程序(内置三种方法)

目录

开发工具

Keil uVision4

下载软件

PZ-ISP

第一步创建工程

首先先创建一个文件夹

第二步编写程序

LED区域原理图

方法一(代码非常的繁琐但是通俗易懂)

思路

方法二(代码简短,比较推荐)

实现思路如下

方法三(代码简短,比较推荐)

方法思路

最后将写好的程序下载到板子上便可以验证有没有成功


开发工具

Keil uVision4

下载软件

PZ-ISP

第一步创建工程

首先先创建一个文件夹

这个文件夹用来存放项目工程的文件

新建一个文件夹

 创建项目并打开

第二步编写程序

LED区域原理图

方法一(代码非常的繁琐但是通俗易懂)

思路

灯的点亮,从原理图中我们可以看到LED灯的一端为高电平,我们这个时候只需要给一个低电平就可以实现灯的点亮。可以用sbit来控制相应的IO口的电位。来给与相应的端口低电平实现灯的点亮。

sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;

要想实现流水灯,那必须要实现八个灯每隔一段时间都只有一个灯亮,其余灯熄灭,这时候我们就很容易想到要定义一个函数进行时间的延时代码如下

void delay_10us(int ten_us)	  //当ten_us=1时,大概延时10us
{
	while(ten_us--);
}

 编辑完成时间延时函数后,我们还控制每个灯在的点亮与熄灭。这时候我们就可以通过sbit来控制相应的IO口的电位。将一个端口的电平设置为低电平,其余设置为高电平就可以实现一个灯的点亮,其余灯的熄灭,再通过时间函数的延时就可以实现流水灯的循环显示了

一下是代码的实现:

#include "reg52.h"
sbit LED1=P2^0;  //定义IO口
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;

void delay_10us(int ten_us)	  //当ten_us=1时,大概延时10us
{
	while(ten_us--);
}

void main()
{
	while(1)
	{

	LED1=0;		//给这个接口一个低电平 只有LED1灯点亮,其余熄灭
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=0;        //给这个接口一个低电平 只有LED2灯点亮,其余熄灭
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=0;        //给这个接口一个低电平 只有LED3灯点亮,其余熄灭
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=1;
	LED4=0;        //给这个接口一个低电平 只有LED4灯点亮,其余熄灭
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=0;        //给这个接口一个低电平 只有LED5灯点亮,其余熄灭
	LED6=1;
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=0;        //给这个接口一个低电平 只有LED6灯点亮,其余熄灭
	LED7=1;
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=0;        //给这个接口一个低电平 只有LED7灯点亮,其余熄灭
	LED8=1;
	delay_10us(50000);
	LED1=1;		
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=0;        //给这个接口一个低电平 只有LED8灯点亮,其余熄灭
	delay_10us(50000);
	}

}

方法二(代码简短,比较推荐)

实现思路如下

主要是通过位移函数来实现的,首先我们得知道位移函数_crol_的用法,我们先定义了端口P2=~0x01,即P2^0~P27这七个端口的电位为11111110此时只有LED1是点亮的,其余都是熄灭状态。

通过_crol_(P,1)可以实现P2^0~P27这七个端口的电位变为11111101,此时只有LED2是点亮的,其余都是熄灭状态。,如果通过一个for循环的话,下一次P2^0~P27这七个端口的电位变为11111011此时只有LED3是点亮的,其余都是熄灭状态。以此类推将for循环操作,使得灯可以从左往右边依次循环点亮,就达到了流水灯的效果

P2=_crol_(P2,1);

 将代码完整后如下

#include "reg52.h"
#include "intrins.h"	//位移函数的使用需要调用函数库

void delay_10us(int ten_us)	   //定义时间延时函数
{
	while(ten_us--);	
}

void main()
{	
	  int i=0;			//定义初值
	  P2=~0x01;		 // 通过直接给P2口赋值实现灯的的点亮  ~符号表示取反,1变0,0变1
	  delay_10us(50000);	   //进行延时

	  while(1)
	  {

	  	for(i=0;i<7;i++)	 //将led左移一位
			{									  
				P2=_crol_(P2,1);	//  实现灯从左往右灯的点亮
				delay_10us(50000); 	
			}

	  }	
}

方法三(代码简短,比较推荐)

方法思路

我们要实现流水灯还可以用for循环的方法,先将每一个LED单独现实的电位表示出来,并用数组将这些储存起来

LED[8]=	{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;	

其中LED1单独显示的编码为 11111110用十六进制表示为0xfe,LED2单独显示的编码为 11111101用十六进制表示为0xfd后面剩余的LED显示以此类推

后面的代码完善如下

#include "reg52.h"

LED[8]=	{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;	  //将LED1~LED8单独显示时的电位显示存贮在数组里

void delay_10us(int ten_us)	  //当ten_us=1时,大概延时10us
{
	while(ten_us--);
}

void main()
{
	int i ;
	while(1)
	{
		 for(i=0;i<8;i++)
		 {
		 		delay_10us(50000);	  //延时一段时间
		 	 	P2 =  LED[i] ;
		 }
	}

}

最后将写好的程序下载到板子上便可以验证有没有成功

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;