单片机C语言实例:1、点亮LED的多种方法

不管学习什么单片机,通常点灯是迈入编程的第一步,点灯虽然简单,但是玩出花样来,需要的知识点还是不少的,本文归纳了15种点灯方式,看看自己会几种,看看是否能帮到努力点灯的工程师们。

一、控制单个IO口电平的高低来控制LED灯的亮灭

程序实例1:

#include<reg52.h> 

// 用sbit 关键字 定义 LED到P1.0端口
// LED是自己任意定义且容易记忆的符号
sbit LED=P1^0;
              

void main (void)
{                 
	LED=1; //将P1.0口赋值 1,对外输出高电平
	LED=0;//将P1.0口赋值 0,对外输出低电平

	while (1)  //主循环
	{
      //主循环中添加其他需要一直工作的程序
	}
}

二、控制一组IO口的电平来控制LED灯的亮灭

程序实例2:

#include<reg52.h>

void main (void)
{
    //此方法使用1个字节对单个端口赋值
	//P1口全部为高电平,对应的LED灯全灭掉
	//0xFF换算成二进制是 1111 1111
	P1 = 0xFF;
                  
	//P1口的最低位点亮,可以更改数值是其他的灯点亮
	//0xFE是16进制,0x开头表示16进制数
	//0xFE换算成二进制是 1111 1110 
	P1 = 0xfe;        
                                 
	while (1)         
	{
        //主循环中添加其他需要一直工作的程序
	}
}

三、控制多个IO口的电平来控制多个LED的亮灭

程序实例3:

#include<reg52.h> //包含头文件,一般情况不需要改动

sbit LED0 = P1^0;// 用sbit 关键字 定义 LED到P1.0端口,
sbit LED1 = P1^1;//LED是自己任意定义且容易记忆的符号
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;

void main (void)
{
    //此方法使用bit位对单个端口赋值
	LED0=0;  //将P1.0口赋值 0,对外输出低电平
	LED1=1;
	LED2=0;
	LED3=1;
	LED4=0;
	LED5=1;
	LED6=0;
	LED7=1;
	while (1)        
	{
        //主循环中添加其他需要一直工作的程序
	}
}

四、控制一组IO口的电平高低来控制8个LED灯的亮灭

程序实例4:

#include<reg52.h> //包含头文件,一般情况不需要改动

void main (void)
{
    //此方法使用bit位对单个端口赋值
	P1=0x55;  //换成二进制是0101 0101 

	while (1)        
	{
        //主循环中添加其他需要一直工作的程序
	}
}

五、控制单个LED灯闪烁

程序实例5:

#include<reg52.h> //包含头文件,一般情况不需要改动,

sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
    //此方法使用bit位对单个端口赋值
	while (1)         //主循环
	{
		LED0=0;   //将P1.0口赋值 0,对外输出低电平
		Delay(10000);//调用延时程序;更改延时数字可以更改延时长度,用于改变闪烁频率
                    
		LED0=1; //将P1.0口赋值 1,对外输出高电平
		Delay(10000);                    
  }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

六、不同频率闪烁一个LED

程序实例6:

#include<reg52.h> //包含头文件,一般情况不需要改动,
                  //头文件包含特殊功能寄存器的定义

sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,
               //LED是自己任意定义且容易记忆的符号


void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
    //此方法使用bit位对单个端口赋值
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255

	while (1)         //主循环
	{
		for(i=0;i<10;i++)   //加入 for循环,表明for循环大括号中的程序循环执行10次
		{
			LED0=0; //将P1.0口赋值 0,对外输出低电平
			Delay(5000); //调用延时程序;更改延时数字可以更改延时长度,用于改变闪烁频率

			LED0=1;  //将P1.0口赋值 1,对外输出高电平
			Delay(5000);
		}

		for(i=0;i<10;i++)
		{
			LED0=0; //将P1.0口赋值 0,对外输出低电平
			Delay(60000);//调用延时程序;更改延时数字可以更改延时长度,用于改变闪烁频率

			LED0=1; //将P1.0口赋值 1,对外输出高电平
			Delay(60000);      
		}
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}

七、不同频率闪烁多个LED

程序实例7:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED0 = P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;

void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  //此方法使用bit位对单个端口赋值
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255

	while (1)         //主循环
	{
		for(i=0;i<10;i++)   //加入for循环,表明for循环大括号中的程序循环执行10次
		{
			LED0=0; //将P1.0口赋值 0,对外输出低电平
			LED2=1;
			LED4=0;
			Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;
						//用于改变闪烁频率
			LED0=1; //将P1.0口赋值 1,对外输出高电平
			LED2=0;
			LED4=1;                
			Delay(5000);
		}

		for(i=0;i<10;i++)
		{
			LED0=0;            //将P1.0口赋值 0,对外输出低电平
			LED2=1;
			LED4=0;
			Delay(60000);      //调用延时程序;更改延时数字可以更改延时长度;
					 //用于改变闪烁频率
			LED0=1;            //将P1.0口赋值 1,对外输出高电平
			LED2=0;
			LED4=1;
			Delay(60000);      
		}
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}

8、流水灯,8个LED左移流水

程序实例8:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255
	Delay(50000);
	P1=0xFE;           //赋初始值
	for(i=0;i<8;i++)   //加入 for循环,表明for循环大括号中的程序循环执行8次
	{
		Delay(50000);
		P1<<=1;
	}
	while (1)  //主循环
	{
        //主循环中添加其他需要一直工作的程序
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
     while(--t);
}

9、流水灯,8个LED右移流水

程序实例9:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                 
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255
	Delay(50000);
	P1=0x7F;      //赋初始值
	for(i=0;i<8;i++)   //加入 for循环,表明for循环大括号中的程序循环执行8次
	{
		Delay(50000);
		P1>>=1;
	}
	while (1)//主循环
	{
        //主循环中添加其他需要一直工作的程序
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
     while(--t);
}

10、LED循环左移

程序实例10:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                 
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255
	Delay(50000);
	P1=0xfe;           //赋初始值
	while (1)         //主循环
	{
		for(i=0;i<8;i++)   //加入for循环,表明for循环大括号中的程序循环执行8次
		{
			Delay(50000);
			P1<<=1;
			P1=P1|0x01;     //左移后,最右端自动赋值0,所以需要该语句赋值1
		} 
		P1=0xfe;           //重新赋初始值
  }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

11、LED循环右移

程序实例11:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255
	Delay(50000);
	P1=0x7f;           //赋初始值
	while (1)          //主循环
	{
		for(i=0;i<8;i++)   //加入 for循环,表明for循环大括号中的程序循环执行8次
		{
			Delay(50000);
			P1>>=1;
			P1=P1|0x80;     //右移后,最左端自动赋值0,所以需要该语句赋值1
		} 
		P1=0x7f;           //重新赋初始值
  }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

12、查表法显示LED

程序实例12:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------
                   查表表格
------------------------------------------------*/
unsigned char code table[]={0x7f,0xbf,0xdf,0xef,
                            0xf7,0xfb,0xfd,0xfe,
							0xff,0xff,0x00,0x00,
							0x55,0x55,0xaa,0xaa};
						//rom允许情况可以无限添加
						
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{              
	unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255

	while (1)         //主循环
	{
		for(i=0;i<16;i++)   //加入 for循环,表明for循环大括号中的程序循环,执行16次,表明表格中有16个元素
		{
			P1=table[i];
			Delay(30000);
		}
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

13、双灯左移右移闪烁

程序实例13:

#include<reg52.h> //包含头文件,一般情况不需要改动,
                  //头文件包含特殊功能寄存器的定义

void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{              
	unsigned char i;  //定义一个无符号字符型局部变量 i ,取值范围 0~255
	unsigned char temp;//定义临时变量用于转换
	while (1)          //主循环
	{
		temp=0xfc;
		P1=temp;
		for(i=0;i<7;i++)   //加入 for循环,表明for循环大括号中的程序循环执行7次
		{
			Delay(50000);   //调用延时程序;更改延时数字可
							//以更改延时长度;用于改变闪烁频率
			temp<<=1;
			temp=temp|0x01;    //也可以直接把temp换成P1
			P1=temp;  	//之所以加入temp做中间变量,转换
						//完成后直接赋值到端口,防止直接
						//操作端口造成的短暂闪烁
		}
 
		temp=0x3f;
		P1=temp;
		for(i=0;i<7;i++)   //加入 for循环,表明for循环大括号中的程序循环执行7次
		{
			Delay(50000);  	//调用延时程序;更改延时数字可以
							//更改延时长度;用于改变闪烁频率
			temp>>=1;
			temp|=0x80;        //等效于 temp=temp|0x80
			P1=temp;
		}

		for(i=0;i<3;i++)   //加入 for循环,表明for循环大括号中的程序循环执行3次
		{
			P1=0xff;
			Delay(50000);
			P1=0x00;
			Delay(50000);
		}
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

14、花样点灯

程序实例14:

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------
                  花样表格
------------------------------------------------*/
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,
						  0xf7,0xfb,0xfd,0xfe,
						  0xff,0xff,0x00,0x00,
						  0x55,0x55,0xaa,0xaa
						  };//rom允许情况可以无限添加

void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
	unsigned char i; //定义一个无符号字符型,局部变量 i 取值范围 0~255

	while(1)
    {
		P1=0xFE;                   //第1个LED亮
		for(i=0;i<8;i++)
	    {
			Delay(20000);
			P1 <<=1;
		}

		P1=0x7F;                   //第8个LED亮
		for(i=0;i<8;i++)
	    {
			Delay(20000);
			P1 >>=1;
		}

		P1=0xFE;                  //第1个LED亮
		for(i=0;i<8;i++)
	    {
			Delay(20000);
			P1 <<=1;
			P1 |=0x01;
		}

		P1=0x7F;                  //第8个LED亮
		for(i=0;i<8;i++)
	    {
			Delay(20000);
			P1 >>=1;
			P1 |=0x80;
		}
      //下面通过查表方法获得花样参数
		for(i=0;i<16;i++)//查表可以简单的显示各种花样 实用性更强
	    {
			Delay(20000);
			P1=seg[i];
		}
    }
}

/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}

15、通过PWM调节LED的亮度

程序实例15:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                 
	unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
	while (1)         //主循环
	{
		LED0=1;
		Delay(60000);        //特意加延时,可以看到熄灭的过程
		for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
		{ //PWM_LOW表示低电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
			LED0=0;        //点亮LED  
			Delay(PWM_LOW);//延时长度,600次循环中从1加至599
			LED0=1;        //熄灭LED
			Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1  
		}
		LED0=0;
		for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
		{ //与逐渐变亮相反的过程
			LED0=0;
			Delay(PWM_LOW);
			LED0=1;
			Delay(CYCLE-PWM_LOW);
		}
	}
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
	while(--t);
}