『DIY新做.二十四小时感动之三』饱含了我所有期待的电子管时钟((3)
时间:2017-08-02 13:56 来源:数码之家 作者:yanzeyuan 点击:次
{ if(mask & dr) LEDDATA=1; else LEDDATA=0; LEDCLOCK=1;LEDCLOCK=0; mask>>=1; } mask=0x10; for(k=0;k<5;k++) //输出5位兰色数据 { if(mask & db) LEDDATA=1; else LEDDATA=0; LEDCLOCK=1;LEDCLOCK=0; mask>>=1; } LEDDATA=1;LEDCLOCK=1;LEDCLOCK=0; //首先输出1个'1'起始位 } 接下来调整代表时钟冒号的两点的LED色彩。 因为VFD的那种光介于蓝色和绿色之间,没有单颗的LED能够与它的色彩相对应一致,所以没办法,只能用两颗草帽的RGB LED来调配颜色。后来经过对比,调整好了两颗对应G和对应B的电阻,使其颜色与VFD荧光的颜色一致。 并且这两颗LED是要伸出来的,所以专门买了一些14mm高的支撑柱来支撑这个LED,这样就不会来回摇晃,保证了位置的固定。 SHOW一下效果(相机曝光时间较长,与实际有些色差): ![]() 幻彩背景灯搞定了以后,下面就要上荧光管了。 因为荧光管与所有直插的原器件在一面,所以要将荧光管支撑起来。但是这个荧光数码电子管又没有管座,只能直插焊接,所以用CAD画好图纸,用激光切割了一些支撑座,这样荧光管就能垫高起10mm,而且还能正好坐在RGB LED的上面。 支承座是用透明的亚克力板切割的,正好能将所有的管脚传过去,将管子固定在电路板上,不会摇晃,而且能突出出来。 SHOW一下效果: ![]() ![]() ![]() 将所有的荧光管加上底座以后,焊在电路板上,开始调试驱动部分程序。 静态驱动采用了串行译码器74HC595配合ULN2003来做,一组这样的IC正好驱动一颗荧光管。 74HC595我在QS30-1的辉光钟上就用过,虽然这次采用了STC的MCU,但是原理大致相同,用示波器校正一下时序,完美驱动荧光管。 下面是点亮背景灯和数码管调试时的效果和74HC595的部分通讯源代码: ![]() ![]() ******************************************************************************************************** ** 函数名称: void Send595(uchar count,uint dat) ** 功能描述: 向74HC595发送数据 ** 入口参数: count: 发送数据的位数 ** dat: 发送的数据(MAX 16Bit) ** 创建者: 严泽远 ** 创建时间: 2011-02-04 22:32 ** 版 本: v1.0.0 ******************************************************************************************************** void Send595(uchar count,uint dat) { for(;count>0;count--) { DATA = dat&0x0001;//_nop_(); SHCP = 1;//_nop_(); SHCP = 0;//_nop_(); dat>>=1; } } 红外线遥控部分以前就做过,但是第一次做是在QS30-1的辉光钟上进行应用,那个时候采用的MCU是C8051F310,这款MCU没有外部中断功能,其实用定时器来做也可以做得很稳定很完美。 这次同样,在STC上调试很快就将红外线译码完成。虽然无法在线调试跟踪红外线数据,但是荧光管既然能够驱动并显示数字了,编程调试的时候就用它来显示跟踪过程中的结果,大大提高了效率。 看一下红外接收部分的源代码: ******************************************************************************************************** ** 函数名称: void IR_RX() ** 功能描述: 红外线中断接收处理 ** 创建者: 严泽远 ** 创建时间: 2011-02-04 16:07 ** 版 本: v1.0.0 ******************************************************************************************************** void IR_RX() { uchar SampleTime; IR_SampleCnt++; //Sample + 1 F0 = P_IR_RX_temp; //Save Last sample status P_IR_RX_temp = IR; //Read current status if(F0 && !P_IR_RX_temp) //Last sample is high,and current sample is low, so is fall edge { SampleTime = IR_SampleCnt; //get the sample time IR_SampleCnt = 0; //Clear the sample counter if(SampleTime > D_IR_SYNC_MAX) B_IR_Sync = 0; //large the Maxim SYNC time, then error else if(SampleTime >= D_IR_SYNC_MIN) //SYNC { if(SampleTime >= D_IR_SYNC_DIVIDE) { B_IR_Sync = 1; //has received SYNC IR_BitCnt = D_IR_BIT_NUMBER; //Load bit number } } else if(B_IR_Sync) //has received SYNC { if(SampleTime > D_IR_DATA_MAX) B_IR_Sync=0; //data samlpe time to large else { IR_DataShit >>= 1; //data shift right 1 bit if(SampleTime >= D_IR_DATA_DIVIDE) IR_DataShit |= 0x80; //devide data 0 or 1 if(--IR_BitCnt == 0) //bit number is over? { B_IR_Sync = 0; //Clear SYNC if(~IR_DataShit == IR_data) //判断数据正反码 { if((IR_UserH == (D_IR_usercode / 256)) && IR_UserL == (D_IR_usercode % 256)) //系统码正确 { IR_code = IR_data; B_IR_Press = 1; //数据有效 } } } else if((IR_BitCnt & 7)== 0) //one byte receive { IR_UserL = IR_UserH; //Save the User code high byte IR_UserH = IR_data; //Save the User code low byte IR_data = IR_DataShit; //Save the IR data byte } } } } } 剩下的部分程序稍微有点难度,主要在实现逻辑控制和闹钟等通讯上,DS3231的程序也很简单,懂得IIC通讯的朋友想必一次都能调通,无非就是对某个地址的写操作和读操作。 闹钟的设置和一些参数的保存,都是保存在了STC的内部EEPROM上,其实STC内部的EEPROM不能称之为真正的EEPROM,它需要页擦除,跟FLASH有点像。不过还是挺好用的,省了外置的EEPROM芯片,还能存储一些有用的数据。 完成之后的图片SHOW一下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 临近春节放假之前,早早就把亚克力的外衣用激光切好了,终于要给他穿外衣了,底座先安装好。 SHOW一下底座的样子: ![]() ![]() ![]() ![]() ![]() ![]() ![]() 只有底座不完美,继续采用实木中框,外加不锈钢内六角螺丝,上下光面黑色亚克力板,还有数字的倒影在里面。 拍了一些图片,这里面有些客厅的道具在做辉光钟的时候已经见过了,呵呵 :) 请朋友们敬请欣赏吧 :) ![]() ![]() ![]() ![]() (责任编辑:admin) |