炫彩LED二进制时钟
学习数字电路的二进制之后,觉得二进制数很神奇,例如现在的电脑都是采用二进制。二进制容易实现,运算规则简单,只有0和1,两种状态的转换速度极快,从而由简单的0和1构成了复杂的计算机世界。我国古代的一本奇书《易经》中说“万事万物都有阴阳”,似乎有异曲同工之妙,这些都让我对二进制数产生好奇。直到有一天我在网络上看到一个这样的题目:
一片果林的成熟季节又到了,大批量的水果就要和买主交易,然而,买主来收购之前给农户出了一个“难题”:将1000个水果事先放在10只箩筐里,待其到来时如果能整筐整筐地搬出来并凑够临时指定的数量,买卖照做还坚持长期合作;如果做不到,预约好的买卖取消,今后也不来打交道了。
题目出得很巧妙,我一想想不出来就查看答案,原来是一个跟二进制数相关的问题,第一个箩筐装1个,第二个箱子装2个,后面的箩筐的数量都是前一个箩筐的一倍(最后一个除外),所以各个箩筐的数量分别为:1、2、4、8、16、32、64、128、256和489,这样的话就可以任意取出所需的数量了。一看答案,惊叹二进制数的神奇之处,竟然能这样任意表达出所需的数量。
二进制时钟诞生记
正好这几天研究着用DS1302时钟芯片和单片机制作一个时钟,突然想到,既然二进制能用“10个箱子”任意取出“1000内的数”,那么是否可以制作出一个跟二进制数相关的时钟呢?当两种思维结合在一起的时候,就可以产生出很多有趣的事情来。这么一来,就很自然地想出了制作一个二进制时钟,但是用什么方式来显示呢?看到手头上有多种颜色的LED灯,于是想到就用发光二极管呗,灯亮就是“1”,灯灭就是“0”,一排LED的亮就形成一个二进制数,从而读出相应时间。这个想法让我兴奋不已,于是我开始着手单片机的编程,用单片机把在DS1302上取出的时间的BCD码转换成10进制数直接放在一组I/O口上面,单片机会自动把十进制数转换成以1和0表示的数放在一组的8个I/O口上,这样一来,在相应I/O口上连接LED灯就能显示出“时间”来了。由于小时最多为“24”,因此只需要5个LED灯就可以完整表示,而“分”和“秒”部分要6个LED灯才能完整表示。
注意事项
因为我们一般采取上拉电流方式接正极驱动LED灯, 输出为“0”时LED灯亮,所以我们还要把取来的数进行取反放在相应组位,单片机C语言中的取反为“~”,例如取来的“秒”放在P1组口,就这样表示:“P1=~miao”,用“~”号就可以轻易取反。
还有需要注意的地方是,我们平常读数是从左到右读高位数到低位数,但是大多单片机的I/O口组是从低位到高位的,因此我们制作时要特别注意焊接LED灯的顺序,或者把单片机翻转摆放就可以解决这个问题。
读时钟的方法
如题图所示的每组数就是“10110”、“101011”、“100001”,在脑袋里进行简单的运算就可以得出时间为:“22:43:33”。科学发现,经常运算可以防止老年痴呆症^_^,因此,二进制时钟就有了它的意义所在了。
单片机 51单片机 MCU 单片机视频教程 单片机开发 ARM单片机 AVR单片机 PIC单片机 Atmel stm32 单片机学习 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)