LED控制

本文详细介绍了如何使用单片机通过寄存器控制LED灯的亮灭,包括使用电阻限流、TTL电平驱动、LED正负极判断以及实现LED闪烁和流水灯效果,同时提到了延时器在控制LED闪烁中的作用。
摘要由CSDN通过智能技术生成

根段,root,表示没有主函数,main

发光二极管,直插和贴片

大红旗:负极,小红旗:正极。

贴片led:根据箭头区别正负极

电阻:102=1k 10✖️10^2

471=47✖️10^1=470Ω

171=17✖️10^1=170Ω

串联电阻进行限流,别超过LED额定电流。vcc接正极,单片机引脚接负极,才能接通,所以就变成控制单片机引脚输出高低电平,低电平就接通,LED发光,高电平则不通。

单片机电平:TTL电平,规定5v为高电平,低电平为0v

驱动器:增大电流,增大驱动能力,小电流变成大电流。

单片机怎么控制:1.在单片机内部有很多的寄存器,外面的引脚(8位的)有几个是8个引脚为一组的,内部就有几个寄存器。

2.在这个单片机中有P0, P1,P2,P3,四个8个引脚一组的,所以内部有P0, P1,P2,P3四个寄存器。

3.寄存器可以存储此时由CPU传入的指令(高低电平,0和1),然后寄存器,通过一个驱动器(增强电流,增强驱动能力)在引脚初输出高低电平进行LED开关的控制(低电平开,高电平关)。

二.点亮一个灯

每个寄存器都有8个存储的位置,对应各自的8个引脚,都要安装驱动进行增强驱动能力,所以我们想第一个灯亮(第一个灯是最低位),应该给传入 1111 1110的指令。

由于寄存器是8位的,也就是2^8,四位二进制可以由一位十六进制表示,所以使用十六进制表示二进制指令,也就是1111 1110=0xFE,使用比较方便,转换成hex文件,才能识别。

由于(LED灯对应寄存器P2)P2的还没有定义,所以我们要先写有单片机引脚,或者寄存器的头文件,才能识别P2。

#include <REGX52.H>头文件大小写都可

由于单片机是执行完main文件,再重头进行执行,这样重新执行(工作频率高,速度很快,所以看不出来),这样容易产生错误,不如将指令写入while循环中,条件为1,这样会一直执行循环,而不是再重头只想main函数。

三.LED闪烁

我们想LED灯闪烁,只需要开LED灯,后面关掉LED灯即可。也就是P2先为1111 1110,后为1111 1111

P2=0xFE;

P2=0xFF;

但是由于工作频率高,指令代码执行快,所以肉眼是看不出来有LED闪烁的情况,但是可以看出LED亮度比较暗。

我们可以通过延时器,进行闪烁的延时,(延时器:也就是执行其他代码需要用时间,从而延时)

STC下载串口有延时器的代码生成。(将子函数放在main函数之外,直接在main函数里面进行调用即可)。延时函数:执行延时函数的时间是需要延迟的时间。

延时函数里面有一个nop函数,需要加入这个函数的头文件,#include <INTRINS.H>才能执行这个函数。(对延时时间要求严格调用,不严格可以删掉这个空语句)

四.流水灯

在循环内,亮第一个,延时一会,再亮第二个,再延时再亮第三个,从而形成流水灯。

第一个:1111 1110   0xFE

第二个:1111 1101   0xFD

第三个:1111 1011   0xFB

第四个:1111 0111   0xF7

第五个:1110 1111   0xEF

第六个:1101 1111   0xDF

第七个:1011 1111   0xBF

第八个:0111 1111   0x7F

由于每次需要的延时函数,都要去stc里面生成,比较麻烦,所以我们想写一个子函数,传入参数,即可生成参数对应的延时器。

我们在延时函数中传入的参数,必须是无符号整数类型,因为时间全是正的。我们需要先生成1ms的延时函数,因为执行一次这个函数就是1ms,这样我们在外面再套一个while循环,传入xms(要延迟的时间),执行一次,xms减一,当xms=0时,就跳出循环,此时,这个延时器也就运行了,我们需要延迟的时间,从而达到延迟随机指定时间的效果。

xms也称为形参,只是一个形式,和模型一样,具体调用会传入具体参数

注意,每次先执行main函数,然后调用到传入的延时参数是一个具体数值,然后去生成对应的延时器,从而执行延迟的任务。不止可以随机指定一个,还可以在每次调用的时候都选择不同的参数。延时时间长。在延迟的时间里面会继续执行上一个代码,也就是保存上一个灯亮,所以会发现有的灯变慢,有的变快。

 P2=0xFE; // 亮第一个 1111 1110

  Delay1ms(1000);

  // P2=0xFF; // 全部都灭 1111 1111

  P2=0xFD; // 亮第二个 1111 1101

  Delay1ms(1000);

  P2=0xFB; // 亮第三个 1111 1011

  Delay1ms(100);

  P2=0xF7; // 亮第四个 1111 0111

  Delay1ms(100);

  P2=0xEF; // 亮第五个 1110 1111

  Delay1ms(100);

  P2=0xDF; // 亮第六个 1101 1111

  Delay1ms(100);

  P2=0xBF; // 亮第七个 1011 1111

  Delay1ms(100);

  P2=0x7F; // 亮第八个 0111 1111

  Delay1ms(500);                     

           // 对于延时函数进行改造,不需要重新生成指定时间的延时函数,只传入参数即可生成该延时函数

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值