51单片机LED点灯实验(闪烁,点亮,流水灯)

led点亮
工作原理

在这里插入图片描述
如图,二极管阳极连接电阻,二极管阴极连接单片机引脚。D0对应P20,D1对应P21,,,,,,,都通过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灯的基础之上。
    原理上基本与点亮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);
  }
}
LED流水灯
工作原理

1.在LED点亮、LED闪烁实验的基础之上。
2.移位函数
crol(a,b):循环左移函数,a为左移的值,b为左移的位数。
cror(a,b):循环右移函数,a为右移的值,b为右移的位数。
移位函数包含在instrins.h库函数里面。
3.c语言中十六进制的表示

  • Ox代表的是十六进制的前缀,不用读。例如OXaaOxbb,只看aa,bb就行。
  • 十六进制到二进制转换
    十六进制表示:每一位有不同的数码0~9,A(10),B(11),C(12),D(13),E(14),F(15)
    十六进制转二进制:将十六进制的每一位转化为二进制即可。例如8FA,=>1000 1111 1010
  • 运作过程
  • 先看原理图
    在这里插入图片描述
    LED原理图(阳极解高电平),阴极通过电阻接接引脚
    在这里插入图片描述
    引脚默认接高电平,所以,初始时灯为熄灭状态。
  • 流水实现
    利用十六进制位位移函数实现左移和右移
    crol(0xfe,1):0xfe转化为二进制为1111 1110;1代表位数
    f代表原理图中的4个高位引脚,e代表4个低位引脚。
    1111 1110 =>p0=0(低电平,灯亮)
    1111 1101 =>左移,p1=0,第二个灯亮
    1111 1011 =>p2
    …………
    crotl(oxfe,1):与左移原理相同(从0111 1111 开始向右移)
  • 代码实现
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量
#define led P2//宏定义LED为p2端口
/*延时函数*/
void dealy(u16 i)
{
while(i--);
}

void main()
{
  u16 i;                   //定义变量i
  P2=0xfe;               //点亮第一个LED灯,即1111 1110.
  dealy(50000);       //延时450ms
  while(1)
  {
     for(i=0;i<7;i++)                //8个LED灯,利用for循环一直执行
	 { 
	   led=_crol_(led,1);            //  1111~1110~0111 1111,左移
	   dealy(50000);
	 }
	  for(i=0;i<7;i++)               //8个LED灯,利用for循环一直执行
	 { led=_cror_(led,1);            //0111 1111~1111 1110	 ,右移
	   dealy(50000);
	 }
  }
	 
}
  • 11
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值