LED灯闪烁
前提: 学会工程创建与完成LED点亮实验,如果还未学会,请点击如下跳转:51单片机学习笔记(1)
实验前的思考:上一篇学习笔记,我们已经学会了如何点亮一个发光二极管(LED),那么这次我们如何实现让它闪烁呢?我们知道,发光二极管具有单向导电性,并且只有形成电流回路时才能发光,而在单片机中,发光二极管的一端已经接入正极,我们只需在另外一端(IO口)使其接入低电平(0)即可实现点亮,那么如果我们让另一端随一定的时间周期进行高低电平变换,那么我们不就可以实现发光二极管的闪烁了吗!那我们就开始进行实验吧!
- 新建工程,命名为template
,新建文档命名为main.c
,保存在工程文件夹中。将c文件添加进工程。开始编辑代码。
#include <reg51.h> //引入51单片机的库文件
typedef unsigned int u16; //将unsigned int在代码中以u16来代替,即u16 i;是定义一个无符号整型变量i
sbit led = P2^0; //定义单片机管脚(IO)P2^0为led,该管脚与一个发光二极管连接,并且其一端已接入正极
void delay(u16 i) //定义延时函数
{
while(i--); //使用while函数来实现自减,当i=0时,跳出循环,返回主函数
}
void main() //定义主函数,程序从此处进入
{
while(1) //定义while循环,条件为1(真),即while一直在循环
{
led = 0; //设置P2^0管脚为低电平,形成回路,LED点亮
delay(50000); //调用延时函数,大约延时450ms
led = 1; //设置P2^0管脚为高电平,此时发光二极管两端皆为高电平,LED熄灭
delay(50000); //调用延时函数,大约延时450ms
}
}
- 代码编写完成后,编译一遍,打开烧录软件将编译生成的hex文件写入单片机中进行测试与现象观察。
LED流水灯
实践前的思考: 如何实现LED流水灯?首先我们从流水灯这个概念来理解,流水灯是指当前按循序依次摆放一个又一个的灯泡,然后接下来,灯泡依次点亮,即前者灭后者亮的特殊闪烁方式,上一个实验我们学会了发光二极管(LED)的闪烁,现在我们要实现一排二极管的依此闪烁。首先我们要知道,在单片机的电路里,那一排发光二极管是共阳的,即它们的一端都接入了高电平,那么我们只需依次让每个发光二极管先亮(IO低电平)后灭(IO高电平),即可实现流水灯!那么我们开始实验吧!
- 新建工程,命名为template
,新建文档命名为main.c
,保存在工程文件夹中。将c文件添加进工程。开始编辑代码。
#include <reg51.h> //引入51单片机的库文件
#include <intrins.h> //引入含左右移函数的库文件
typedef unsigned int u16; //将unsigned int在代码中以u16来代替,即u16 i;是定义一个无符号整型变量i
typedef unsigned char u8; //将unsigned char在代码中以u8来代替,即u8 i;是定义一个无符号符号变量i
#define led P2 //使用宏定义,定义变量led为单片机P2.0-2.7管脚
void delay(u16 i) //定义延时函
{
while(i--); //使用while函数来实现自减,当i=0时,跳出循环,返回主函数
}
void main() //定义主函数,程序从此处进入
{
u8 i; //定义无符号型字符变量i
led = 0xfe; //对变量led幅值为0xfe,转换为二进制即 1111 1110,即只有P2.0为低电平
delay(50000); //调用延时函数,大约延时450ms
while(1) //定义while循环,条件为1(真),即while一直在循环
{
for(i=0;i<7;i++) //定义for循环,循环7次
{
led = _crol_(led,1); //调用左移函数,每次左移一位,即1111 1110 ——> 1111 1101,0依次左移一位
delay(50000); //调用延时函数,大约延时450ms
} //左移结束后,led = 0111 1111 0x7f
for(i=0;i<7;i++) //定义for循环,循环7次
{
led = _cror_(led,1); //调用右移函数,每次左移一位,即0111 1111 ——> 1011 1111,0依次右移一位
delay(50000); //调用延时函数,大约延时450ms
}
}
}
- 代码编写完成后,编译一遍,打开烧录软件将编译生成的hex文件写入单片机中进行测试与现象观察。
至此,你又学会了LED闪烁与LED流水灯,祝你一路高歌!