|

楼主 |
发表于 2010-12-6 23:18:00
|
显示全部楼层
这是全部焊好元器件的板子被面,也跟没有焊元器件之前的空板来个合影吧。
因为这颗MCU支持在线编程和调试,所以需要有一个JTAG接口与编程器相连,MCU上面的那个1.25mm间距的6PIN端子座就是了。
除了那颗高压电容,其他所有电容都采用贴片铝电解电容和钽电容,还有一些0805封装的小瓷片电容。电阻也全部采用0805封装的小电阻。焊完这些东西已经天黑了,眼睛也快废了......
五、制作带底座的高脚氖灯灯管(用于指示星期和时间冒号) 因为辉光管和管座加起来的高度比较高,而氖灯体积太小,太矮,如果直接焊在电路板上感觉很不协调,所以一直在为这个不协调而绞尽脑汁。后来淘到一批小试管(是我见过的直径最小的试管了),外径6mm,内径5mm,长度大概3cm左右,正好跟辉光管+底座以后的高度相同,所以就产生了一个想法,把氖灯放进这个试管里,用这个玻璃试管做一个长度3cm直径6mm的氖灯灯管。
氖灯有很多种,现在有些氖灯还能发出绿色红色的光。当然,最早的氖灯也叫氖泡,就是我们常用的测电笔上的那种氖泡,发出的是橘红色光,正好跟辉光管发出的光颜色一样,所以才想到用氖灯来做搭配,指示冒号等小点点。
不过在选用这个氖灯的时候也走了很多弯路。一开始淘了一些直径4mm左右的氖灯,回来测试了一下,必须在电压高于190v的时候才能被点亮,而且一致性不好,有些210v都不亮,而且外径很不均匀,有些不是很圆,放不进小试管里面去。后来好不容易淘到了一批进口的3mm直径的氖灯,效果很好,90v就能点亮,而且亮度很一致。也做了反复的实验,在180V的时候,串联240K的电阻,能够在亮度满意的情况下达到理想的亮度,并且使耗电电流降到最低(0.8mA)。
但是这个玻璃管怎么固定在电路板上呢?毕竟玻璃没法焊接,而且氖灯的焊脚很细,只有0.5mm,也无法支撑的那么好那么一致,这要焊上去一排灯管结果东倒西歪岂不是大煞风景。后来想到了一个办法,用5mm直径的LED来制作管座。因为小试管的内径是5mm,LED的外径小于等于5mm,正好能套上,并且LED的管脚硬,还带个底座,能够很牢靠的固定在焊盘上,所以找来了这些东西以后,开始动手做,先看一下制作氖灯灯管的材料:
这是把LED套进小试管的效果,比较理想。
然后要做的,就是要利用LED的这两个管脚,连上氖灯的管脚。
为了不破坏LED的底座和管脚,并且又能把氖灯的两个脚连接到LED的管脚上,所以用大偏口钳把LED的上面半部分的透明塑料钳掉了,这样就露出了两个管脚的末端,当然,LED也就不能用了,在这里只是用它的底座和这两个管脚,就是下图的样子:
然后将氖灯管脚剪去一部分,在加工过的LED焊脚顶部镀上锡,将氖灯焊接在LED管脚顶部。这个过程比较费劲,因为有时候用钳子并不能完美的在LED需要的嵌断的地方夹断它,夹多了就破坏LED底座,夹少了金属管脚露不出来又没法焊接,一共为了制作13个氖灯灯管,费了20多颗5mm直径的LED。还好,这些都是以前不知道做什么剩下来的透明外壳LED,至于通电什么颜色也都不知道了,呵呵。
焊上氖灯以后的效果见下图:
13个带底座的氖灯全部制作完成,剩下的就是如何将小试管固定在底座上。
一开始的想法很有新意,我打算买一个透明的蜡烛,然后取下一块蜡,用热风台加热成液体,然后将它倒进这个试管里,趁它还没有凝固的时候,将加工好的带底座的氖灯放进试管里,这样就氖灯就可以牢牢地被玻璃试管包裹了。后来为此我还专门跑了一趟宜家,后来没有买到透明体的蜡烛(不过后来发现淘宝上有),所以这个想法也就没有实现。
最终固定这个玻璃试管的办法被我想的太复杂,无意中请示了一下老婆大人,结果老婆一语道破天机,用502胶 ^_^。
说实话我对502胶的印象并不怎么好,感觉它不是很管用,而且容易溅的到处都是,很难弄掉。不过后来用了以后发现,用它来把玻璃试管粘到LED底座上还是很好使的,呵呵,这就是完全制作好的氖灯灯管了,一共13颗:
用于指示星期和冒号的氖灯灯管做好了,这下可以跟辉光管完美搭配了,因为有了底座,所以很容易固定在电路板上,所以马上把它们各就各位,效果出乎我的想想,实在是太般配了。
看一下整体效果吧,高度几乎一致,而且氖灯位于顶端,发光的位置也刚好,并且粗细作为小点来说刚刚合适,不粗也不细。
SHOW一下:
六、编写译码电路驱动程序
74HC595是很常用的器件,3线串口通讯,每个驱动芯片提供8个译码输出,以前常用于LED数码管的驱动,加上小数点正好8段。但这次使用的是辉光管,每显示一个数字就需要有一个驱动,所以为了6个辉光管每个数字都能亮,一共需要60个译码输出,这就要用到8片74HC595芯片。
这颗芯片很常用,看了一下DATASHEET,很快就做好了通讯程序,下面我把74HC595的通讯代码及控制各辉光管显示数字的代码部分贴出来:
/********************************************************************************************************
** 功能描述: 向74HC595发送数据
** 入口参数: count: 发送数据的位数
** dat: 发送的数据(MAX 16Bit)
** 创 建 者: 严泽远
** 创建时间: 2010-11-21 13:09
** 版 本: v1.0.0
********************************************************************************************************/
void send_data(uchar count,uint dat)
{
for(;count>0;count--)
{
DATA = dat&0x0001;_nop_();
SHCP = 1;_nop_();SHCP = 0;_nop_();
dat>>=1;
}
}
/********************************************************************************************************
** 功能描述: 刷新QS30-1辉光管的显示数字
** 入口参数: N1: 第一位显示的数
** N2: 第一位显示的数
** N3: 第一位显示的数
** N4: 第一位显示的数
** N5: 第一位显示的数
** N6: 第一位显示的数
** 创 建 者: 严泽远
** 创建时间: 2010-11-21 14:23
** 版 本: v1.0.0
********************************************************************************************************/
void DispNum(uchar N1,uchar N2,uchar N3,uchar N4,uchar N5,uchar N6)
{
uchar buf,buf2;
if(N1>9) buf = 0x00;
else buf = 0x08>>N1;
send_data(8,buf); //U1
if(N1>9) buf = 0x00;
else buf = 0x80>>(N1-4);
if(N2>9) buf2= 0x00;
else buf2= 0x02>>N2;
send_data(8,buf|buf2); //U2
if(N2>9) buf = 0x00;
else buf = 0x80>>(N2-2);
send_data(8,buf); //U3
if(N3>9) buf = 0x00;
else buf = 0x80>>N3;
send_data(8,buf); //U4
if(N3>9) buf = 0x00;
else buf = 0x80>>(N3-8);
if(N4>9) buf2= 0x00;
else buf2= 0x20>>N4;
send_data(8,buf|buf2); //U5
if(N4>9) buf = 0x00;
else buf = 0x80>>(N4-6);
if(N5>9) buf2= 0x00;
else buf2= 0x08>>N5;
send_data(8,buf|buf2); //U6
if(N5>9) buf = 0x00;
else buf = 0x80>>(N5-4);
if(N6>9) buf2= 0x00;
else buf2= 0x02>>N6;
send_data(8,buf|buf2); //U7
if(N6>9) buf = 0x00;
else buf = 0x80>>(N6-2);
send_data(8,buf); //U8
STCP = 1;_nop_();STCP = 0;_nop_(); //数据锁存}
这段程序调试成功了以后就能够在每个辉光管上显示任意字符了,有模有样的效果出来啦,SHOW一下:
七、编写DS1302时钟芯片读写程序
DS1302也是很常用的一款时钟芯片,外围元器件非常少,仅一个电池,一颗晶体,一颗电容即可,通过3线与MCU通讯, 具体介绍网上一搜一大把,时序也很简单,以前在其他作品上用过这个芯片,程序也很简单,调试几分钟就OK,下面我也把代码贴出来,可以给朋友们做个参考:
/****************************************Copyright (c)**************************************************
**
** 项目名称: QS30-1辉光钟 目标板试验程序
** 文件名称: DS1302.c
** 模块功能: 实现DS1302时钟芯片的完全控制
**
**------------------------------------------------------------------------------------------------------
** 创 建 者: 严泽远
** E-mail : yanzeyuan@163.com
** QQ : 6626209
** Mobile : 18602007878
** 创建时间: 2010-11-19
** 版 本: v1.0.0
** 描 述: 基础程序
**
********************************************************************************************************/
#include <C8051F310.h> //加载C8051F310.h头文件
#include <Define.h> //加载Define.h头文件
#include <DS1302Function.h> //加载DS1302Function.h头文件
#include <DS1302Extern.h> //加载DS1302Extern.h头文件
/********************************************************************************************************
** 功能描述: 往DS1302写入1Byte数据
** 入口参数: ucDa 写入的数据
** 创 建 者: 严泽远
** 创建时间: 2010-02-05 23:52
** 版 本: v2.1.3
********************************************************************************************************/
void v_RTInputByte(uchar ucDa)
{
xdata uchar i;
xdata uchar j;
j = ucDa;
for(i=8; i>0; i--)
{
T_IO = (j&0x01); /*相当于汇编中的 RRC */
T_CLK = 1;
_nop_();_nop_();
T_CLK = 0;
j=j>>1;
}
}
/********************************************************************************************************
** 功能描述: 从DS1302读取1Byte数据
** 出口参数: ACC
** 创 建 者: 严泽远
** 创建时间: 2010-02-06 00:11
** 版 本: v2.1.3
********************************************************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
uchar j;
for(i=8; i>0; i--)
{
j=j>>1;
if(T_IO){j|=0x80;}else{j&=0x7f;}
T_CLK = 1;
_nop_();_nop_();
T_CLK = 0;
}
return(j);
}
/********************************************************************************************************
** 功能描述: 往DS1302写入数据
** 入口参数: ucAddr: DS1302地址
** ucDa: 要写的数据
** 创 建 者: 严泽远
** 创建时间: 2010-02-06 00:11
** 版 本: v2.1.3
********************************************************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();_nop_();
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************************************************
** 功能描述: 读取DS1302某地址的数据
** 入口参数: ucAddr: DS1302地址
** 创 建 者: 严泽远
** 创建时间: 2010-02-06 00:17
** 版 本: v2.1.3
********************************************************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();_nop_();
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************************************************************
** 功能描述: 设置初始时间
** 入口参数: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
** 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
** 创 建 者: 严泽远
** 创建时间: 2010-02-06 01:02
** 版 本: v2.1.3
********************************************************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************************************************
** 功能描述: 读取DS1302当前时间
** 入口参数: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
** 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
** 创 建 者: 严泽远
** 创建时间: 2010-02-06 01:02
** 版 本: v2.1.3
********************************************************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
|
|