单片机小制作,LED小灯瓶
有一天在网上看到一个制作——LED电子萤火虫,我感觉电路很有特点,于是就想仿制一个。那个LED电子萤火虫用的是ATtiny13单片机来控制,我也正好有。而且硬件制作比较简单,成本也不高,10元钱都不到,就能DIY一个。虽然简单,但是制作却需要耐心和细心,毕竟需要连接12个LED,焊接的工作量不少,我自己用了一个下午才完成,而程序更是陆陆续续地写了几个小时。
估计你会很好奇地问,一共才6个可用I/O引脚的 ATtiny13,怎么能驱动12个LED呢?其实,我要告诉你,它不仅可以点亮每个LED,而且还能控制每个LED的亮度呢!这才是本次制作的精华。在制作的过程中,发生了一点小小的意外。由于我购买的JST充电线和原来的充电器引脚相反,致使我原本打算使用的小型锂电池损坏,不能充电。在万般无奈的情况下,我只好更换体积更大的锂电池了。
主要材料
图6.1 制作所需的主要材料
这次的主要元器件就是ATtiny13单片机和12个LED。当然还有双绞线、洞洞板、电池、空瓶子、电阻等其他辅助材料,如图6.1所示。
本制作使用的是8个引脚的ATtiny13单片机,这款单片机现在的价格很便宜,4元左右就能买到。ATtiny13 是AVR 单片机,它有1KB 的 Flash、64B 的EEPROM、64B 的SRAM、6 个通用I/O口线、32个通用工作寄存器、1个具有比较模式的8位定时器/计数器、片内/外中断、4路10位ADC、具有片内振荡器的可编程看门狗定时器,以及3种可以通过软件进行选择的省电模式。12个LED为普通的3mm发黄色光的LED。
制作过程
1 焊接单片机插座。
2 焊接两个电阻。
3 双绞线套入热缩管后,焊接LED。焊接好后,用打火机加热热缩管,使其收缩固定。最后,别忘了再扭下热缩管。
4 焊接好的12个LED。
5 双绞线焊接到洞洞板上。
6 洞洞板和双绞线焊接好的效果。
7 焊接JST插头、锂电池和开关。
8 在瓶子上开口。
9 用热熔胶固定。
10 装入瓶子中。
控制原理
为什么6个I/O能控制12个LED呢?它们之间会不会相互影响呢?其实,这样的连接方式不仅能控制每个LED,还能控制其亮度呢!之所以能这样连接,是因为AVR单片机的每个I/O都是3态输出。如果用普通51单片机,这样连接是不行的。
那么又是如何控制LED的亮度呢?控制亮度的关键是ATtiny13的两路PWM,它们可以分别设置连接到PB0和PB1引脚上。在ATtiny13使用内部振荡器的情况下,PWM的最高频率可设置为47.5kHz。而且PWM的极性可以通过设置寄存器而改变,这使得12个LED亮度的控制更加简单了。
先谈谈如何控制每个LED单独的亮和灭。ATtiny13的每个I/O都有4种状态,即输出0状态、输出1状态、高阻态(悬空态)、带上拉电阻的高阻态。要使LED亮,必须要让LED中流过正向的电流,如果要让最左边的LED亮,PB1输出1、PB2输出0即可。但是,其他不相关的引脚需要设置成高阻态。否则,如果PB0此时也为1的话,第2个LED也会亮。总之,为了保证其他LED不受到影响,在设置某个灯亮时,必须先把所有I/O设置成不带上拉的高阻态。
能控制亮和灭有什么了不起?呵呵,其实还能控制每个LED单独的渐变,就是渐渐变亮,渐渐变暗。我举个例子吧,如果要最左边的LED渐渐变亮,就先设置PB2引脚为0电平,PB1引脚设置为高电平驱动的PWM波。然后,程序逐渐控制PB1的PWM状态,通过调整PWM高电平的脉宽长度来实现亮度控制。当PWM高电平的时间长时,LED就变亮了。反之,LED就变暗了。
那么电路原理图(见图6.2)中第7个反过来接的LED怎么实现亮度控制呢?原理还是一样,只是PB2将刚才的0电平设置成1电平,原来PB1为高电平脉冲驱动的PWM波设置成低电平脉冲驱动的PWM波即可。同样,要控制第7个LED的亮度,就控制PWM低电平的脉宽长度,当低电平的脉宽长度长时,LED就变亮了。反之,LED就变暗了。
图6.2 控制电路原理图
那么能实现所有的LED同时发光吗?制作过程中,这个功能的实现倒是困扰了我一会儿。后来,我想到了动态扫描。什么是动态扫描?老式电视机不就是这个原理吗?电视机通过磁场让射线高速地扫描屏幕,从而产生一幅画面。那么,让每个灯分别亮1ms左右,然后像电视机一样不断地扫描,看上去就都亮了。在此基础上,再控制每个灯的亮度数值,就能实现整体亮度控制了。如果LED足够多,单片机引脚也足够多,还可能显示一副灰度画面呢!
3种效果的程序编写
程序的PWM频率设置为最高的37.5kHz。之所以选择这么高的频率是为了不影响动态扫描。试想,如果PWM频率为100Hz,那么还怎么动态扫描呢?在程序中,动态扫描实际的频率为62Hz。这已经足够骗过人的眼睛,让我们看不到灯的闪烁。
在单片机的中断代码中,程序每过26µs就会产生溢出中断一次,通过变量count计数中断次数。当中断的次数达到50次时,就更换下一个LED,显示它对应的亮度。LED的亮度存储到led[ ]这个数组中,每个LED通过载入对应的亮度值,即通过改变PWM产生寄存器的OCR0A与OCR0B,来实际控制高低电平脉宽长度,最终实现亮度的控制。当然,每次通过PWM控制亮度,都要先根据LED的驱动电平方式,重新设置PWM的控制模式。在此之前,还要记得设置不相关的引脚为高阻态。
LED的3种效果控制程序能够实现LED不断地变换,只要调用就能分别实现如下功能:所有LED的呼吸效果、逐个点亮和熄灭LED、LED流水显示的效果。从编程的思路上讲,led[ ]数组存放了12个元素,每个元素所存内容,即对应每个LED灯亮度值。要改变某个LED灯亮度,都是通过设置led[ ]数组中对应元素的 PWM 缓冲数值来实现自动变换。要让所有的灯全亮只需设置数组中的每个元素的数值都为255即可。如果要一半的亮度就设置为128。要让某个灯单独最亮,只要设置这个LED元素数值为255,其他的元素为0。如果任意LED要产生渐渐变亮的效果,那么只要对应数组元素中的数值从0逐渐变为255即可。同理,渐渐变暗,数值就从255变成0。要实现什么样的效果,大家可以通过改变led[ ]数组来实现。
用单片机DIY创意LED灯
当我们刚开始接触单片机的时候,总迫不及待想使用它来制作一个属于自己的东西,而LED灯由于控制起来简单易操作,因此网上也有很多关于用LED灯DIY一些小东西,像时钟,流水灯,交通信号灯,点阵,光立方等等。这些制作起来成本也不是很高,但创意是不得不承认,真的不错,做出来效果也是很好,很美!随着技术的发展,LED灯的颜色不仅限于一种,蓝色,红色,绿色,七彩在生活中也较为常见,如果能够用单片机控制它们轮流点亮,会是怎样的一个场景呢?
今天我们就简单说一下比较火的流水灯和光立方。
先来说下流水灯,流水灯表面意思就是把LED灯轮流点亮,实现流水效果。学电子的朋友可能对流水灯印象较深,因为在一开始步入大学的时候一般会参加一些制作流水灯的比赛,在我上大一的时候对这种类型的比赛积极性特别高,在一开始做出产品看到其效果,也感到惊讶。
还记得在前天的时候我们学习了如何用单片机点亮一个LED灯,其实同样的道理只要我们把各个端口拉低接地,另一端串联一个电阻接到VCC就可以实现点亮所有的LED,在单片机中通用IO口有四大种,共32个IO口(P0、P1、P2、P3,每一种又有8个,所以一共有32个通用IO口),我们把P3^0和P3^1这两个IO口空下来,以便下载程序,剩下的就有30个IO口,按照通用的套路把LED灯与这30个IO口相连,就可以通过程序控制每一个灯亮,由于每个IO口都可独立控制,所以可以按照先后顺序延时点亮每一个LED灯,实现流水的效果。
效果图如下
流水灯是一个平面结构,如果想玩的更难一点更好看一点,可以选择做成光立方(是一种立体结构),其中有一种是8*8*8一共512个LED灯,而51单片机却只有32个IO口,而这单独只用单片机就不能实现这个任务了,一个比较常用的解决方法就是实用锁存器,基本原理和控制一个LED灯类似,我们通过写程序让LED灯正极连在电源正极负极连在负极。
光立方图片
光立方
在单片机中无论是流水灯还是光立方都可以独立控制每一个灯的亮灭,只要我们把需要点亮某个的灯的指令发送给单片机,就可以实现上图中的效果。
光立方和流水灯控制程序都是挺长的,要实现好的效果,少说也得有上千行,但只要我们了解其工作原理,知道控制方法,总有一天会做出一个属于你的DIY。
相关问答
proteus仿真 AT89C51 P2口接 8个 开关,P0口接 8个led 灯 p2开关...就是P2.0开关按制P0.0的LED....这样?连接图很得简单的,一般用低电平点亮。LED阴极接P0口,串一500欧电阻再接到+5V。开关一端如此P2口,另一端接地。你的LED...
单片机 编程控制 8个LED ,先逐个点亮,再逐个熄灭,再逐个点亮,如此循环,变化间隔为1秒左右,用软件循环实现?假如:P0口接8个LED,程序可以这样:#include#defineucharunsignedchar#defineuintunsignedintsbitled1=P2^0...
用51 单片机 做一个最小系统,使, 8个 小灯从右向左依次亮两个,在...[最佳回答]用P1口控制8个LED灯就行,限流电阻用300欧即可,LED接成共阳极的,也就是正极接在一起,及然后接在正电源端!用P1口控制8个LED灯就行,限流电阻用300欧...
单片机 的P0端口外接 8个LED 发光二极管D1~D8,在P2端口外接 8个LED 发光二极管D9~D16实现各种灯亮的效果?这么大的数码管需求量,建议你使用TM1640数码管驱动电路做系统,只需要就可以驱动16位8段数码管,而且只需要2个IO口。这么大的数码管需求量,建议你使用TM1640数...
单片机 流水灯8盏 LED 灯用汇编语言实现p1口首先点亮3,4,5,6。后向左移动,间隔时间1.4s?先做个1.4s的延时子程序;再设计主程序,一个一个的实现8个LED的闪亮。先做个1.4s的延时子程序;再设计主程序,一个一个的实现8个LED的闪亮。
单片机 C51语言如何实现用P2口控制8只 LED 左循环流水灯亮?soeasy。P2=0x01,然后P2=_cror_(P2,1);delayMS(uintx);这就行了soeasy。P2=0x01,然后P2=_cror_(P2,1);delayMS(uintx)...
为什么 单片机LED 灯有p1口和p2口?单片机LED灯有P1口和P2口是因为单片机的I/O口有限,为了连接多个LED灯,需要使用多个I/O口。P1口和P2口是8051单片机中常用的两个8位I/O口,它们可以分别控制8个L...
单片机 汇编语言按键控制流水灯,两个开关k1,k2。实现功能按下k1,流水灯左移动,按下k2,流水灯右移动?假设P0.0接k1,P0.1接k2,k1或k2闭合时,P0.0或P0.1为低电平0,断开时为高电平1;P2口的8位接8个发光二极管的阳极,发光二极管的阴极通过下拉电阻接地,要点亮相...
单片机 用汇编语言编写一个。用十个按钮分别控制十个灯。比如:按下按钮K1 LED 1灯亮。按下"?检测是否有按键按下,相应的指示灯点亮,并熄灭其它的指示灯。至于10S锁住其他按钮,如果程序不做其它的事情,最简单的方法就是点亮指示灯后延时10S,再回到主函...
单片机 如何控制一 个LED 灯闪烁频率不断加快?暂时想到两种解决方案:1.最简方案——利用延时函数:进入主函数后,初始化LED,设置一个延时初始值,然后进入while循环,里边只做四件事,打开LED,利用键盘返回...