DIY遥控式旋转显示屏制作

此项目最终实现了仅用一竖排16只LED灯在一个圆柱面上显示出任意字符,节省了LED而且便于控制,并且可以实现用红外遥控器随时切换显示内容的效果。其中主要用到的是51单片机,利用单片机来处理红外遥控器发出的信号并控制LED灯的暗灭以实现预期效果。这个显示屏利用了人眼的视觉暂停效应(Visual staying phenomenon),在高速直流电机的带动下,一排LED灯在同一位置一秒内扫描超过24次,人眼就不会看到闪烁了。另外,由于这个显示屏是旋转式的,因此它理论上可以在360°范围内显示。

执行过程总的可以分为两大部分,即硬件和软件部分。

硬件部分可分为选材、组装、上机测试和优化4步。选材时我从如下四个方面考虑:

  1. 焊接元件用底板,我根据已拥有的资源选择了方便易用的多孔万用板;1
  2. 所需电子元件,首先是单片机最小系统所需的一些元件:单片机(开始选择的型号是STC90C516RD+,最后发现STC89C52RC的单片机就可以实现目前的功能)、晶振(12.000MHz)和复位电路;其次是红外接收模块的红外接收头和位置检测模块的干簧管(结构简单,重量轻)及磁铁;最后是显示用的一排16只LED;
  3. 旋转的实现,最终显示主体会较重,我选择了强磁大扭矩高速的380直流电机;
  4. 供电,电机的供电容易解决,但是单片机的供电较麻烦。由于主要电路是焊接在一张底板上的,而底板最后要在电机的带动下旋转,如果选择传统的电刷供电,则会由于电刷的摩擦而增加电机的负荷。最后,经过考虑我采用了“无线供电”的方式,选择了“无线供电”模块。

组装过程中原件的焊接不难,但是由于要转起来,要考虑到平衡的问题。对此,我采用的是先凭感觉大致确定各原件的位置,焊接完成后再根据实际情况在板子上加小的部件调整重心的方法。

上机测试和优化不是只做一次的,而是反复进行的。上机测试发现问题,优化解决问题。

软件部分可分为分模块(简单的旋转显示和红外解码)程序的编写和总测试程序的编写。最开始写分模块的程序时需要用到延时或计时的地方都是用的延时函数,这样写出来的程序虽然可以单独运行,但是将两部分结合后的程序跑起来却完全乱掉了。最后经过分析发现是红外接收头接收到杂波后也会触发单片机进入红外接收函数,用延迟函数写出来的红外接 收函数运行一次还是要占用CPU一会时间的,因而当CPU处理红外接收函数时是无法及时刷新显示的内容的。后来,在我哥的建议下我选择了用外部中断结合定时器中断来实现更好的效果。主函数&旋转显示    红外接收码红外接收流程

其实主函数完全可以一直等中断请求的到来,然后CPU将所有的事在中断函数中完成,但是中断函数有一个原则,就是尽量简短,能在主函数中处理的尽量在主函数中处理,以免错过下一次中断。因此,从图(1)中的主函数流程可以看出它就是在做中断函数中可以给主函数做的事。旋转显示模块由P3.3口的下降沿(由干簧管提供)触发开始,之后就是隔一段时间(由定时器1提供定时器中断)按照一定的规律刷新一下LED的亮灭情况(如图(2))。图(3)所示的是一串采用UPD6121G编码的红外接收码的波形(发送码和接收码的电位高低情况相反)。平时没有红外信号时, 红外接收头的输出端为高电位;当按下某个按键时,会首先在红外接收头输出端处收到形式为9ms的低电平加4.5ms的高电平的引导码,接下里就是32位的二进制码组了,其中前16位为8位用户识别码和8位用户识别码的的反码后16位为8位操作码(功能码)及其反码。而32位二进制码组是采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。如果一直按着某个按键不松开的话,就会收到连续的由9ms低电平+2.3ms高电平+0.2ms低电平组成的一串接收码。根据这个规则,我按图(4)所示的流程写出了用于红外解码的程序。

6

左图是测试成功的红外键值显示实验,其所对应的键值为0x19(0001 1001)。最后,两个主要模块的程序分开测试都通过后,我将两部分程序进行了整合,经过不断的发现问题—寻找原因—修改程序后,我达到了最初设定的目标,实现想要的效果:旋转稳定显示+红外遥控切换显示内容。(飞到源码)

下面是效果演示的视频:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注