一片果林的成熟季节又到了,大批量的水果就要和买主交易,然而,买主来收购之前给农户出了一个“难题”:将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”。科学发现,经常运算可以防止老年痴呆症^_^,因此,二进制时钟就有了它的意义所在了。