关于单片机的led灯的二三事,初学者的开端

2022-05-17   大方老师单片机

原标题:关于单片机的led灯的二三事,初学者的开端

关于单片机led灯的二三事,初学者的开端

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,私信我就可以~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比///

一、点亮

工作原理:

如图,二极管阳极连接电阻,二极管阴极连接单片机引脚D0P20D1P21,,,,,,,都通P2孔进行控制。

二极:

电源正极连接到二极管阳极,负极连接到阴极,二极管正常工作。所以,原理图中,引脚为低电平,连接的是二极管的阴极,阳极通过与电阻连接,电阻连接的是高电平,所以二极管正常工作。电阻的作用为保护二极管。

程序编写

#include"reg52.h"

sbit LED=P2^0 /*sbit用于定义变量LED为自定义变量。P2.0(注意不要写P2.0,应写P^0)孔赋给变LED*/

void main()

{

while(1)

{

LED=0;/*由二极管的工作原理可得,二极管P2.0孔,所以该孔为低电平,0*/

}

}

二、闪烁

工作原理

在点LED灯的基础之上。

原理上基本与点LED灯工作原理相同。

自定义一个延时函数。

主函数先点亮灯,在调用延时函数,在熄灭灯,然后在调用延时函数,将这些放入循环一直执行。完成

代码

#include "reg52.h"

typedef unsigned char u8; //重定义字符型变量

typedef unsigned int u16; //重定义整型变量

/*自定义延时函*/

void dealy(u16 i)

{

while(i--);

}

sbit led=P2^0;

void main()

{

while(1)

{

led=0; //点亮,阴极接低电平

dealy(50000);

led=1; //熄灭,阴极接高电平

dealy(50000);

}

}

三、流水灯

·工作原理

1.LED点亮LED闪烁实验的基础之上。

2.移位函数

crol(a,b):循环左移函数a为左移的值b为左移的位数。

cror(a,b):循环右移函数a为右移的值b为右移的位数。

移位函数包含instrins.h库函数里面。

3.c语言中十六进制的表示

·Ox代表的是十六进制的前缀,不用读。例OXaaOxbb,aabb就行。

·十六进制到二进制转换

十六进制表示:每一位有不同的数0~9A(10),B(11),C(12),D(13),E(14),F(15)

十六进制转二进制:将十六进制的每一位转化为二进制即可。例8FA=>1000 1111 1010

·运作过程

·先看原理图

LED原理图(阳极解高电平),阴极通过电阻接接引脚

引脚默认接高电平,所以,初始时灯为熄灭状态。

·流水实现

利用十六进制位位移函数实现左移和右移

_crol_0xfe,1:0xfe转化为二进制1111 11101代表位数

f代表原理图中4个高位引脚e4个低位引脚。

1111 1110 =>p0=0(低电平,灯)

1111 1101 =>左移p1=0,第二个灯亮

1111 1011 =>p2

…………

_cror_(oxfe,1):与左移原理相同(0111 1111开始向右移)

·代码实现

#include

#include

typedef unsigned char u8; //重定义全局字符型变量

typedef unsigned int u16; //重定义全局整型变量

#define led P2//宏定LEDp2端口

/*延时函*/

void dealy(u16 i)

{

while(i--);

}

void main()

{

u16 i; //定义变i

P2=0xfe; //点亮第一LED灯,1111 1110.

dealy(50000); //450ms

while(1)

{

for(i=0;i8LED灯,利for循环一直执行

{

led=_crol_(led,1); // 1111~1110~0111 1111,左移

dealy(50000);

}

for(i=0;i8LED灯,利for循环一直执行

{ led=_cror_(led,1); //0111 1111变小,呼吸灯效果就出来了。单片机用来控制频率,得计RC的振荡频率