单片机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);
}