目录

  • 背景
  • 硬件驱动器
  • 软件驱动器
    • 像航障灯那样闪烁
    • 想怎么闪就怎么闪

本文记录一段旅程–让一颗LED灯闪烁起来。

背景

我随手拿了一块普中的51单片机的开发板,上面恰好有很多led灯,我想让其中一个按我想象的方式闪烁起来。

硬件驱动器

虽然开发板上已经有了硬件驱动,我并不需要走这一段路,但对于旅行来说,更引人入胜的或许是沿途的一簇花草,一片树叶,终点也只不过是下一段旅途的起点。

先来瞧一瞧开发板上的LED驱动器罢。8个LED被接成了共阳极的形式,LED的阴极接了470R的排阻,另一端引到单片机的IO口。

我不想给自己增添麻烦,我决定只观察D1二极管,我需要另外画一个更简单的电路来分析。

上手之前先查查攻略,看看大家怎么说。

红色发光二极管的正向导通压降一般是1.8-2.2V,工作电流一般是5-20mA,用于指示灯的话一般10mA就比较亮了。

回过头来看这个电路,当VCC=5V,b点的电位为0V的时候,主干线上的电流与a点的电位是像下面这样子的。实际分析的电路设计参数与网上的描述有所差异,但看起来感觉应该可以,实际效果好与不好就在实际中大锤八十小锤一百地验证看看。

发光二极管压降(自变量) Va(因变量) 主干线电流(因变量)
1.8V 3.2V 6.8mA
2.2V 2.8V 5.9mA

针对这个感觉可以就可以的二极管驱动器,不讨论单片机的噪声容限,不讨论能让led亮起来的电压范围,我们对控制电压进行数字抽象,想让二极管亮起来的时候就在b点送入逻辑0,想让二极管熄灭的时候就在b点送入逻辑1。

软件驱动器

控制LED灯的单片机端口是P2.0端口。要点亮LED灯就往P2.0端口寄存器写0,要熄灭就写1。这是一个非常简单的操作,但也值得去摸一摸。

#include "reg52.h"sbit LED1=P2^0;void main(){ LED1=0;    //点亮//LED1=1;  //熄灭while(1){   }
}

灯亮了,现在可以顺手看一下硬件驱动器部分的分析与实际情况的对比。使用万用表简单测量一下VCC,a点和b点的电位,下面的图是b点的电位,图太多会影响观感,就用表格看看好了。

VCC Ea Eb Vled=VCC-Ea I
5.15V 3.258V 0.302V 1.892V 2.97mA

实际开发板上使用的限流电阻标称值是是1k,测量下来996R,所以主干线电流是2.97mA,但是看起来LED灯的亮度感觉就很行,完全依靠经验与度娘不可取,不同厂家、不同型号的器件有差异,多看手册多动手才是避坑的秘籍。

像航障灯那样闪烁

我想让它像高楼大厦楼顶的航空障碍灯那样闪烁,粗略地查了一下,我觉得40闪/分比较好看。40闪/分意味着每1.5S发光管要切换一次状态,那么LED的控制信号应该是下面这样子的,1和0每次的保持时间为1.5s。

接下来开始设计程序,目标是在单片机的P2.0口上产生上面的无限循环周期逻辑。开发板有一个demo程序,忍不住ctrl+c,ctrl+v。但是demo中的延时函数void delay_10us(u16 ten_us)并不能直接实现1.5s延时,因为ten_us的最大值只能为65535,假定这个函数是精确的单位10us延时,当ten_us=65535时,延时时间为655.35ms,小于需要的1500ms,我们可以简单粗暴地堆叠3个延时为500ms的延时单元来处理这个问题。

while循环语句可以让一个过程无限循环下去,所以我们只需要实现一个周期:点亮保持–>延时1.5s–>熄灭保持–>延时1.5s,这是一个简单的逻辑。

#include "reg52.h"typedef unsigned int uint16_t;sbit LED1=P2^0;void delay_10us(uint16_t ten_us){while(ten_us--);
}void main(){   while(1){LED1=0;   //点亮delay_10us(51176); //11.0592MHz,延时500msdelay_10us(51176);delay_10us(51176);LED1=1; //熄灭delay_10us(51176);delay_10us(51176);delay_10us(51176);  }
}

出于各种原因,通过理论推算延时函数所需要传入的值有些许复杂,耍个花招,通过实际调试来确定数值。修改调试环境中晶振值和开发板上的值相同,这里是11.0592MHz,然后启动软件模拟调试,运行到光标所在行,感觉可以就可以。

想怎么闪就怎么闪

冲一杯茶,歇一歇,收拾收拾心情,我不知道是从哪架飞机翅膀上看见的,它那个灯隔段时间闪一下,也有隔段时间闪两下的,我觉得隔段时间闪两下的灯比较漂亮,就这么决定了。


为了让时间的计算更加简单准确,配置过程更快捷,我决定用定时器的办法来抵达这个目标,因为里面有两种不同的时间,也或许有更多不同长度的时间片段。

我们构造一个趁手的工具–虚拟定时器virtualTimer,它由一个递减计数器,重载时间和重载标志组成,如果定时器的重载标志为1,那么它就是一个周期定时器,反之它是一个单次定时器。
虚拟定时器由一个硬件定时器驱动,硬件定时每滴答作响一次,虚拟定时器的递减计数器就减一个数,所以我们需要精心地设计硬件定时器的滴答时间和虚拟定时器的重载值来配置实际时间。
在虚拟定时器的递减计数器倒计时的过程中,我们通过指定在不同的计数区间led的不同状态来实现亮灭的随意操控,也就是想怎么闪就怎么闪。

最后付上代码

#include "reg52.h"#define TIMER0_MIDDLE_VALUE 9174 //11.0592MHz晶振,10ms溢出一次,定时器数9174个数typedef unsigned int uint16_t;
typedef struct virtualTimer {   //虚拟定时器,定时时间与使用的定时器定时间隔有关系unsigned short counter;unsigned short reloadTime;unsigned short reloadFlag;
}virtualTimer_t;sbit LED1=P2^0;
virtualTimer_t LEDStateIndicatorTimer = {0,450,1};void main(){TMOD = 0x01;        //T0方式1->16位不自动重装定时器TMOD &= ~(1<<2);    //T0定时器模式TMOD &= ~(1<<3);    //T0启停仅受TCON的TR0控制TH0 = (65535 - TIMER0_MIDDLE_VALUE) / 256;    TL0 = (65535 - TIMER0_MIDDLE_VALUE) % 256;ET0 = 1;    //T0中断使能EA = 1;     //总中断使能TR0 = 1;    //T0使能  while(1){if(LEDStateIndicatorTimer.counter > 50 || (LEDStateIndicatorTimer.counter < 35 && LEDStateIndicatorTimer.counter >= 15))LED1=1; //熄灭elseLED1=0;    //点亮    }
}void T0_interrupt(void) interrupt 1 {TH0 = (65535 - TIMER0_MIDDLE_VALUE) / 256;    //重装初值TL0 = (65535 - TIMER0_MIDDLE_VALUE) % 256;if(LEDStateIndicatorTimer.counter != 0)--LEDStateIndicatorTimer.counter;if(!LEDStateIndicatorTimer.counter && LEDStateIndicatorTimer.reloadFlag)LEDStateIndicatorTimer.counter = LEDStateIndicatorTimer.reloadTime;
}

【电子电路基础实验】LED闪烁实验相关推荐

  1. 【电子电路基础实验】数码管

    文章目录 前言 一.硬件特性 二.软件驱动器 1.软件与数码管的接口 2.多路数据块复用器 3. 回到开头的进度条 文章记录一段旅程–使用数码管显示它能显示的任何内容. 前言   数码管的特点是比较亮 ...

  2. 【电子电路基础实验】无源蜂鸣器

    文章目录 背景 一.硬件驱动器 二.软件驱动器 本文记录一段旅程–控制无源蜂鸣器嗡嗡作响. 背景 小时候,看科幻电影都是瞪大了眼睛,竖直了耳朵,生怕错过了精彩的情节.仙女座星系,宇宙飞船距某颗类地行星 ...

  3. WLGK-51单片机接口技术基础实验 —LED闪烁灯

    WLGK-51单片机接口技术基础实验--LED闪烁灯 当我们开始接触单片机,首先接触的第一个实验就是LED灯的使用,类似于我们学习软件开始接触的第一个程序"HelloWorld", ...

  4. WLGK-51单片机接口技术基础实验 ——LED闪烁灯

    WLGK-51单片机接口技术基础实验-LED闪烁灯 当我们开始接触单片机,首先接触的第一个实验就是LED灯的使用,类似于我们学习软件开始接触的第一个程序"HelloWorld",这 ...

  5. Ardino基础教程 2_LED闪烁实验

    实验二:LED 闪烁实验 LED 小灯实验是比较基础的实验之一,上一个" Hello World!"实 验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和 ...

  6. 电子电路、射频(高频)通信系统实验装置

    ZN-535H电子电路.射频(高频)通信系统实验装置 一.概述 ZN-535H电子电路.射频(高频)通信系统实验装置是结合公司第三款实验系统的设计方式,由北京邮电大学全国多所院校等老师提出设计方案并改 ...

  7. 51单片机学习:LED闪烁实验

    实验名称:LED闪烁实验 接线说明:     实验现象:下载程序后"LED模块"的D1指示灯闪烁 注意事项:                                     ...

  8. 十速单片机学习归纳总结(四):LED闪烁实验

    前言 通过前一篇文章的分享,我们已经成功搭建好了一个普适性的单片机框架,而这篇文章我们将开始编写第一个实验:LED闪烁实验. 代码的编写均在VSCode编辑器中进行:编写代码的文件为main.c文件和 ...

  9. 【ZYNQ】从入门到秃头05 LED闪烁实验 按键控制LED实验Verilog(PL)

    文章目录 LED闪烁实验Verilog(PL) 硬件设计 程序设计 创建Verilog HDL文件 编写Verilog 添加管脚约束 添加时序约束 生成BIT文件 Vivado仿真 下载 按键控制LE ...

  10. 51单片机 | 点亮第一个LED | LED 闪烁实验 | LED流水灯实验

    文章目录 一.51单片机GPIO介绍 1.GPIO概念 2.GPIO 结构框图与工作原理 2.1 P0端口 2.2 P1端口 2.3 P2端口 2.4 P3端口 2.5 要点 二.LED简介 三.硬件 ...

最新文章

  1. matlab实现音频信号的左右声道信号分离_立体声分离度与立体声相关系数
  2. 关于A/D方面的小结
  3. SpringBoot项目@Email不起作用
  4. 求助了,园子里的高手们,软件运行报401错误
  5. Tomcat学习总结(4)——基于Tomcat7、Java、WebSocket的服务器推送聊天室
  6. mybatis 高级映射和spring整合之与Spring整合(6)
  7. android studio飞机大战游戏带注释源码教程(多线程)
  8. 研发进阶之项目管理(附腾讯内部满分项目管理PPT)
  9. 【已解决】最新版本的Chrome浏览器如何设置网页编码
  10. 突破运营商 QoS 封锁,WireGuard 真有“一套”!
  11. 数字化转型的必要性和意义
  12. 计算机一直在启动界面进不去怎么办,Win7系统开机一直停留在“Windows正在启动”界面怎么办...
  13. Carla学习(一) 小车简单直线行走
  14. android课程设计体重测量仪,智能体重检测仪设计与实现
  15. sql server 2008 R2 与 sql server 2012 下载地址(包括x86、x64)
  16. 上海职称不用考计算机和英语翻译,英语翻译专业资格考试替代职称评定
  17. B站学习云开见明:Python数据分析入门到精通学习笔记
  18. 【iconfont图标】vue引入并使用阿里巴巴iconfont图标流程【uniapp引入iconfont真机APP不显示问题解决,移动端引入报错解决】
  19. 批处理批量替换word内容的思路
  20. CountDownLatch的用法,配图版

热门文章

  1. 粒子滤波和蒙特卡洛定位
  2. IE8主页不能修改的案例研究
  3. 用matlab实现女声变男声步骤,男声变女声matlab程序
  4. 各种超酷网站收集(103个经典)
  5. 乐安全 支持x86_国产扛鼎之作 市售高质量平板电脑推荐
  6. 设计原则与思想:规范和重构(11讲)
  7. 王叁寿:只有数据源服务商才有资格构建大数据生态圈
  8. 天涯明月刀php文件,天涯明月刀OL显卡设置教程
  9. NR小区选择和重选总结(一)
  10. 【转载】android开发新浪微博客户端 完整攻略