哪些网站可以找兼职做室内设计,打车软件开发,网站建设当中的技术解决方案,养老网站建设合同51单片机之LED灯 #x1f334;前言#xff1a;#x1f3ee;点亮LED灯的原理#x1f498;点亮你的第一个LED灯#x1f498;点亮你的八个LED灯 #x1f4cc;让LED灯闪烁的原理#x1f3bd; LED灯的闪烁#x1f3d3;错误示范1#x1f3d3;正确的LED闪烁代码应该是这样前言点亮LED灯的原理点亮你的第一个LED灯点亮你的八个LED灯 让LED灯闪烁的原理 LED灯的闪烁错误示范1正确的LED闪烁代码应该是这样错误示范2错误示范3 点亮LED流水灯的原理循环左移函数_crol_()循环右移函数_cror_() LED流水灯 ⭕总结 前言 我们在学习单片机的时候最好还是以实物的学习为主因为兴趣是最好的老师实物的视觉冲突比仿真的效果要更好每一个系列的开发板由于原理图不同他们对应的IO口控制的东西就不一样如果你是使用实物来学习51单片机在进行软件编程前一定要学会看原理图即找到某一个器件是由哪个IO口来控制的。 今天给大家带来点亮LED灯的原理及对应的程序讲解和实物演示效果展示。 点亮LED灯的原理
点亮一个LED灯我们在初中物理电路中应该就学习过很简单的电路就可以实现即一个电阻、一个电源、一个LED灯、一个连通的回路。 这个电路图相信大家都很容易理解那在用单片机IO口控制LED灯的点亮原理也是类似我们看我们板子的的LED模块的原理图 我们板子的LED模块一共有8个LED小灯由P2口的每一个小的IO口控制由于P2口可以进行位寻址所以我们可以操作它的每一位进而控制每一个LED灯的亮灭。
另外观察电路图他们是共阳的意思是有共同的正极我们只需要让每一个LED电路的另一端IO口输出低电平就可以了因为有上拉电阻这个电阻的功能是让IO口处于高电平下次我们在具体的分析每个小的IO口的初始状态都是高电平与VCC的电压相同所以每一个LED的电路没有电压差就不会导通我们想点亮其中一个只需要将那一个接的IO口设置为低电平0就可以点亮。
点亮你的第一个LED灯
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED P2^0;//设置需要点亮的LED灯的IO口int main()
{while(1){LED 0;//将其设置为低电平使电路导通}return 0;
}实物效果演示 当我们使用烧录软件把程序烧录进去之后你会发现此时D1灯亮了当然你也可以编写一个程序让他们全亮。
点亮你的八个LED灯
点亮一个LED的原理和代码都清楚了我们来试试点亮8个LED灯吧。
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P2//将P2口宏定义为LED增强代码可读性和健壮性int main()
{while(1){LED 0;//将整个P2口都设置为低电平}return 0;
}实物演示 可以看到和我们预期的一样全部点亮了当然你也可以分别设置P2口的每个位地址为0但是这样的话代码量会增加很多。
让LED灯闪烁的原理
理解了点亮的原理控制LED闪烁就非常简单了你只需要知道当对应IO口输出高电平的时候LED就会亮输出低电平的时候就会灭。你可能会这样写 LED灯的闪烁
错误示范1
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED P2^0;//设置需要点亮的LED灯的IO口int main()
{while(1){LED 0;//将其设置为低电平使电路导通LED 1;将其设置为高电平使电路截止}return 0;
}我可以很负责任的告诉你这段代码的的确确实现了闪烁但是你会发现当你去将这段代码通过下载软件下载到板子中时板子的效果是D1常亮这是为什么呢 LED从点亮到熄灭的时间就是程序执行一条语句的实现计算机的速度是很快的我们可以使用keil调试来测试一下 我们设置断点启动调试程序执行到LED 1;时的时间是 0.00038900 0.00038900 0.00038900秒我们不需要这个时间我们只需要执行当前语句的时间我们点击下图左上角RST将时间归0下图左边调试窗口sec显示的有程序执行到当前语句的时间你可以手动归0。 此时我们已经成功归0了接下来执行这条语句。 所以执行这条语句的时间是 0.00039 0.00039 0.00039秒人眼正常的极限分辨率是50hz或60hz从亮到灭这个过程频率是一个吓人的数字2500hz大概是人眼是不可能看到这个变化的过程的因为实在是太快了
我们想解决这个问题就需要自己写一个延时函数
void delay(u16 i)
{while(i--);
}i为1的时候大概是延时了1us大家可以自己去调试。
正确的LED闪烁代码应该是这样
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED P2^0;//将P2口宏定义为LED增强代码可读性和健壮性void delay(u16 i)
{while(i--);
}
int main()
{while(1){LED 0;//将其设置为低电平使电路导通delay(50000);//0.5s左右LED 1;将其设置为高电平使电路截止delay(50000);//0.5s左右}return 0;实物演示 注意我们每设置一个状态都必须延时一段时间否则从这个状态到另外一个状态太快了人眼无法观测到前一个状态就会一直维持那个可以观察到的状态。
错误示范2
看下面代码试思考其展示结果
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED P2^0;//将P2口宏定义为LED增强代码可读性和健壮性void delay(u16 i)
{while(i--);
}
int main()
{while(1){LED 0;//将其设置为低电平使电路导通delay(50000);//延时0.5sLED 1;将其设置为高电平使电路截止}return 0;
}实物效果展示 可以看到亮的效果但是看不到灭的效果这是因为从亮到灭有延时我们可以观察到亮的过程但是从灭到亮太快了我们眼睛还没察觉到灭这个灯就已经亮了。
错误示范3
同样的我们在来看这段代码思考它的实物效果
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED P2^0;//将P2口宏定义为LED增强代码可读性和健壮性void delay(u16 i)
{while(i--);
}
int main()
{while(1){LED 0;//将其设置为低电平使电路导通LED 1;将其设置为高电平使电路截止delay(50000);}return 0;
}实物效果展示 可以看到眼睛并没有看见灯亮这是因为在设置完D1 IO口为高电平后延时了一段0.5s所以我们可以看到灭的效果但是延时之后执行LED 0LED 1由于没有延时所以我们还没有察觉到灯亮它就已经熄灭了。
相信现在你应该可以很好的理解LED闪烁的原理了那如果我们想控制所有的灯点亮闪烁该怎么办呢你可以这样去写
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P2//将P2口宏定义为LED增强代码可读性和健壮性void delay(u16 i)
{while(i--);
}
int main()
{while(1){LED 0;//将其设置为低电平使电路导通delay(50000);LED 0xff;将其设置为高电平使电路截止delay(50000);}return 0;
}实物效果演示 可能又有小伙伴有疑惑了这个0我可以理解但是你这个0xff是什么意思呢P20~P27对应8个小的IO口一共有8个bit位把他们都设置为1就是1111 1111表示为16进制就是0xff。
如果你不想用十六进制来赋值你还可以使用十进制但是必须先用计算器把这个值算出来0xff十进制表示是255。 那样的话代码也可以改成这样
#includereg52.h
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P2//将P2口宏定义为LED增强代码可读性和健壮性void delay(u16 i)
{while(i--);
}
int main()
{while(1){LED 0;//将其设置为低电平使电路导通delay(50000);LED 255;将其设置为高电平使电路截止delay(50000);}return 0;
}点亮LED流水灯的原理 流水灯顾名思义就是这些灯看起来像在流水一样我们的板子里面有八个灯我们可以设计一个程序让他们依次点亮但是记得延时如果没有延时那就是全亮了因为流动的太快了就好像他们都一直亮着一样。 我们先来认识两个函数
循环左移函数_crol_()
这个函数的功能是把一个变量大小的二进制代码进行循环左移举个例子
这个函数有两个参数第一个参数是需要进行循环左移变量第二参数是循环左移的次数。
循环右移函数_cror_()
这个函数的功能是把一个变量大小的二进制代码进行循环右移参数和上面一个函数类似。
这个函数的定义在头文件intrins.h中我们在调用这两个函数时需要加这个#includeintrins.h双引号可以换为尖括号。
流水灯程序设计思路 LED流水灯
#includereg52.h
#includeintrins.h
typedef unsigned int u16;
typedef unsigned int u8;
#define led P2void delay(u16 i)
{while(i--);
}
int main()
{u8 i;led 0xfe;//1111 1110while(1){led 0xfe;delay(25000);//0.25sfor(i 0;i 7;i){led _crol_(led,1); //0xfe 0x1111 1110 - 0x1111 1011 0x1110 1111 0x1011 1111delay(25000);//0.25s}for(i 0;i 6;i){led _cror_(led,1); //0xfe 0x1111 1110 - 0x1111 1011 0x1110 1111 0x1011 1111delay(25000);//0.25s}}return 0;
}实物演示效果 可能有小伙伴有一些疑惑为什么第二个循环右移只循环了6次呢也就是最后一次执行完是0x11111101这是因为最后一次和初始化重复了如果执行7次这次D1亮的时间就变成了了0.5秒和预期不符。当然你也可以通过if条件语句来控制让其执行7次效果却不受影响。
⭕总结
这篇博客主要谈到了使用51控制LED的一些状态如果你有兴趣的话可以利用proteus仿真做一个爱心的流水灯送给你的女神哦开玩笑的。另外若本篇博客有任何问题欢迎指出。下面是本篇博客的思维导图