单片机小制作,七彩“魔法瓶”
一看题图,你可能会想,不就是一个普通的玻璃瓶吗?但是这个瓶子的功能却不简单,瓶子会感知周围光线的强度而改变内部的LED流动花式。当你的手背着光源的位置向前靠近时,口里再喃喃几句“魔法咒语”,神奇的现象出现了,本来的花式突然改变了,时而变蓝,时而变红。当你的手继续靠近时,然后可以关灯,这时瓶子闪烁得更加耀眼,更加激烈了,哇,太神奇了,竟然可以“隔空控制”!如果将此作品放在家里客厅或宿舍,一定会吸引很多客人或同学的眼球,而且可以活跃气氛。
“七彩魔法瓶”的奥秘是运用光敏电阻探测出周围光线的强弱,再根据光度由强到弱分成8个区间,每个区间都有一种不同的LED流动花式,第一个区间(也即是光照最强时)“魔瓶”不断显示红、绿、蓝的颜色;第二到第四个区间分别是显示由红色、绿色和蓝色的3种不同颜色的不同显示主题,不同的颜色能改变人的心情,因此随着主题的改变,心情也改变了;第五个区间(光照较暗时)瓶子会逐渐变化出类似彩虹的七彩颜色,因为红、绿、蓝三原色进行不同的组合就会得到不同的颜色;第六个区间是我们熟悉的流水灯,先由前排逐个流动,然后后排逐个流动;第七个区间是我最喜欢的,先逐渐显示单数和双数排的LED灯,同时,在瓶子内部的黄色和绿色草帽高亮LED灯交替亮起,发射出的光线经过洞洞板和玻璃瓶透射出来,显得特别好看;最后一个区间是光照最暗的时候,内部的高亮LED都亮起,同时左右排的LED灯交替亮,之后全部闪烁,达到最激烈的程度。相信在场观众的心情此时会达到高潮,很有创意吧,下面让我们一起来制作!
电路原理
所需器件列表:◆ 20脚的STC12C2052AD单片机1个(或者选用同类有AD功能的单片机)
◆红、绿、蓝贴片LED各4个
◆绿色和黄色的高亮草帽LED各1个
◆ 470Ω贴片电阻6个
◆ 1kΩ贴片电阻2个
◆ 10kΩ贴片电阻1个
◆光敏电阻1个
◆ 7.5cm×7cm的玻纤洞洞板1块(玻纤板透光效果好)
◆排针若干
◆瓶口大小合适的空玻璃瓶子1个
01 用裁刀把7.5cm×7cm的玻纤洞洞板裁成3块的2.5cm×7cm大小的形状,玻纤板有一种半透明感,能把内部的光更好地透射出来,显示的效果更加美观。当然,如果材料有限也可以用其他的洞洞板,只不过效果没那么酷罢了。
02 然后在其中的一块洞洞板背面分别焊接上贴片LED和470Ω的贴片电阻,此作品要求越小越好,因此元器件都选用了贴片封装以减小体积,LED从左往右的排列为红、绿、蓝、红、绿、蓝(对应单片机的P3.0~P3.5引脚)。为了显示出七彩的效果,一定要按照红、绿、蓝的排列顺序,这三原色能组合出多种不同的颜色。注意要在中间间隔两个焊盘的位置,因为这块板子是放在左边的位置,也就是单片机P3组引脚的一边,为了更好地方便后面的对应焊接,中间跳过晶体振荡器引脚部分而焊接,焊接完成后如图所示。
03 在另一块板子,如图所示,连续焊接上贴片LED和470Ω的贴片电阻,此处6个LED灯对应P1.2~P1.7引脚,LED灯按照电路图所示的蓝、绿、红、蓝、绿、红的顺序排列。注意上面两块板子要对应好单片机的引脚位置。
04 分别剪出10针和7针的排针,并且用钳子把其弯曲成120°,如图所示,然后分别焊接在上面两块板子上,10针的对应电路图的左边,7针的对应电路图的右边。注意,要对应好LED灯位置,多出来的排针用于电源之间的连接。
05 在剩下的一块板子上焊接20脚的IC插座,然后把黄、绿两个高亮草帽LED灯的顶部弯曲成90°,如图所示,分别摆放在两端位置,黄、绿两个LED灯的顺序根据个人喜好摆放。
06 在背面焊接上光敏电阻的10kΩ贴片上拉电阻和两个高亮LED的1kΩ限流电阻,焊接完成后如图所示。
07 把左边部分的板子引出的排针对应好单片机的左边引脚位置,一一对应,注意板子背面朝外,大约弯曲成60°,然后用焊锡焊接固定好。
08 再把另一边的板子也按照上一步骤焊接上,也要注意排针对应好单片机的引脚位置,并且把光敏电阻从左边板子穿插进电路板内部,把光敏电阻的两端分别连接在单片机P1.0口和电源负极,这部分完成后如图所示。于是,一个由洞洞板组成的小型“金字塔”就制作完成了。
09 用一条大约1m长的两排排线把电源正、负极引出来,如图所示。你也可以多加两条排线把单片机的两个数据口引出来,方便程序的更新,由于我之前已经调试好了程序,因此在这里没有把数据线引出来。
10 接上电源,用手电筒在较暗的地方不断靠近光敏电阻,看看LED灯的花式显示结果是否如自己编写的程序一致,如图所示。
11 调试好程序后,就可以把它放进一个空玻璃瓶子里了,在底面板子的两端边上粘贴上双面胶,然后用镊子轻轻放进瓶子内部,在适合的位置上粘上去固定好,作品就可以宣布完成了,如图所示。电子爱好者也要加强环保意识,尽量利用废弃的物品来完成我们的电子制作,减少垃圾量,做到以废变新,这是一个不错的主意吧!而且LED灯发出的光在玻璃瓶的内壁折射又反射,显示出来的效果会比想象中要好多了!
12 插上电源,把“魔法瓶”放进较暗的地方,立即会显示出更加灿烂的炫彩闪耀效果,你一定会喜欢的。
程序部分说明
本作品最主要的部分是利用STC单片机内部的A/D转换功能,读取光敏电阻的阻值变化,进而控制LED灯的流动花式。STC12C2052AD内部置有8位AD转换功能,读取到的数为0~255的数值,然后把读到的数值分为几个范围区间,每个区间分别显示不同的LED流动花式。这里要注意的是,编写不同范围程序时,不能直接写成如“if(4040)&&(m<=60))”。
单片机小制作,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[ ]数组来实现。
相关问答
单片机 面包板和那种绿色的板有什么区别吗,都是干什么的?单片机面包板一般都有很多孔,可以根据自己的需求搭建电路,而绿色的板子一种是洞洞板,可以焊接所需的电路,一种是成品的板子,根据PCB打板制作出来的。单片机面...
初学 单片机 需要准备哪些学习套件?一、材料篇单片机学习少不了的常用材料,最好配一块单片机开发板学习。在单片机的学习过程中,切不可有以下错误认识:1、看完学习视频后,认为自己这部分已经...
用 单片机 控制多组LED灯的编程技术对于新手来说好学吗?有哪些好的建议和需要注意的问题?对于新手的话,51比较适合,首先得搞清楚单片机与外设是怎么链接的比如这里的单片机是如何与LED相连接的,51的P0端口好像是要上拉的,所以需要上拉的电阻,所谓...对...
硬件工程师都是怎么设计电源正负极反接保护电路的?欢迎点赞、收藏、评论、转发、关注。关注我头条号:单片机嵌入式爱好者。更多优质内容与你分享!下面是我之前录制的一个防反接原理讲解视频,要是觉得讲的不是...