2010-12-25 23:01 | by 2ndboy
在把玩开发板之余,打算做点实际的东西出来,最先想到的就是电子温度计。
关键部件就是温度传感器和用来显示温度的数码管,实际搭建电路之前,现在 Proteus 里做了模拟,原理图如下:

位于 51 左边的除了 18B20 和他的上拉电阻之外,就是一个最小系统了。右边的是 4 位 7 段数码管及其驱动电路。74HC138 用来做共阴极数码管的位选,接 51 的 P3。74HC573 用来点亮数码管,接 P2。本来是想接 P0 的,但是模拟老是不成功,Google 了一下才知道,P0 如果要作为输出使用的话,是要加上拉电阻的,为了减少器件使用,所以改用 P2 来接 573。573 的输出通过限流电阻接至数码管。
18B20 操纵起来比较麻烦,程序尚在调试中:)
Posted in 电子电路 | No Comments »
2010-11-27 22:09 | by 2ndboy
人这一辈子就是由一系列的选择构成的,一个接着一个,选着选着,也就老了:)
昨晚,在进行了一次不是很愉快的谈话之后,我终于结束了最近这段时间以来的纠结,顿时人也觉得轻松了很多。
之所以会这么纠结是因为这是一个会影响我未来三到五年,甚至更长时间的一个选择。现在尘埃落定,未来要继续加油、努力!
不愿虚度青春的人注定会苦一些吧,而我,无悔! ;-D
Posted in 随便说说 | 3 Comments »
2010-11-19 22:20 | by 2ndboy
看看豆瓣上的评价不错,所以今晚抱着聊胜于无的心态看了《老男孩》,结果被感动了一把!
一时间想起很多事情,有过去的,有现在的,想不出此刻该说些什么,引用一下片尾的那句话——
“梦想这东西和经典一样,永远不会因为时间而褪色,反而更显珍贵。”
Posted in 电影,浓缩艺术 | No Comments »
2010-11-2 21:11 | by 2ndboy
今天上午是个值得纪念的日子(对我来说:))!路考通过,拿到驾照了,考试过程相当顺利,本来是要加到 5 档把车跑起来的,不过我只加到 3 档就被考官要求靠边停车,签字通过了,爽!
回想过去的几个月,拿个驾照还真是不容易,上理论课(必须到场 5 次)、理论考试、上模拟器(必须上两次)、场考一直到今天的路考。这其中场考是最难熬的,我就在圆饼上栽了一次。话说这个圆饼,想想实际生活当中有什么用呢?!反而是曲线行驶和上坡起步会比较有用。第一次场考怕什么来什么,我圆饼一直不稳定,考试的时候偏偏就抽到圆饼,认栽!当然每个人的弱项不一样,比如很多人怕的单边桥,我从第一次学单边桥开始就从来没上不去或掉下来过:) 所以只怪运气不好。补考抽到的是曲线,我的强项,所以轻松通过。
路考训练的时候一直比较顺手,所以今天的结果还是不意外的。这下好了,完成了今年的一桩心事。不过现在杭州车满为患,我上班又近,所以暂时还没打算给杭州再添个堵。这个事做完以后,也该想想再找个什么事情来折腾一下了:)
Posted in 随便说说 | 5 Comments »
2010-10-30 17:08 | by 2ndboy
开发板买来半个月,有空就会玩儿玩儿,不过我玩儿的都还是比较初级的东西,所以感觉也没什么可写的,今天就把搞定数码管动态显示的东西记一下吧。
常见的数码管(7-segment display)封装形式有一位数字的,也有多位数字的。在只有一位数字的数码管上显示一个数字(或者在多位封装的数码管上显示若干个一样的数字)叫做静态显示,静态显示不是说显示的数字不可变,而是意味着在显示这个数字期间,数码管的状态不变,是静态的。数码管的动态显示用于多位数码管,拿 4 位数码管来举例,4 位数码管的所有段(segment)引脚是公用的,然后由 4 个位选引脚来决定哪个数字位有效。比如说我们想显示在这个 4 位数码管上显示 0123,那么实际上要做的事情其实是:
- 用位选选中 4 位数码管中的第一个数字位
- 给数码管送 0 这个数字的字模
- 关闭数码管的显示
- 用位选选中 4 位数码管中的第二个数字位
- 给数码管送 1 这个数字的字模
- ……以此类推……
从上面过程可以看出来,就算我们想显示的是一串恒定的数字 0123,但对于 4 位数码管来说,这个过程是一个动态的逐位显示的过程,所以叫动态显示。
环境准备
以下描述都以我手上的普中 HC6800 为准:
- 用跳线帽连接 J15 和 J16
- 用排线连接 JP10(P0)和 J12
- J21 接 VCC
原理
这里我们用 74HC138 这个译码器(Decoder)来实现 2 个 4 位数码管的位选:

74HC138 的真值表如下:

74HC138 有 3 个输入(接 P2.2、P2.3、P2.4),8 个输出,从真值表上可以看出,74HC138 的作用就相当于把一个 3 位二进制数的输入转换成某个输出脚上的低电平。2 个 4 位数码管,做位选刚好够用:)
HC6800 用的 2 个 4 位数码管是共阴极数码管,用 74HC573 锁存器(Latch)来驱动:

74HC573 有 8 个输入,8 个输出:

由于 J21 接了 VCC(LE 高电平),-OE 接了 GND,所以 74HC573 工作在 transparent mode,Dn 如果是低电平,对应的 Qn 也是低电平;如果 Dn 是高电平,对应的 Qn 也是高电平。74HC573 的作用应该是提供点亮数码管所需的电流(这里暂时存疑)。J12 和 JP10 连接以后,P0 就是 74HC573 的输入。
代码
SSD.h
- #ifndef __SEVEN_SEGMENT_DISPLAY__20101030__
- #define __SEVEN_SEGMENT_DISPLAY__20101030__
-
- unsigned char
- GetSSDCode(
- unsigned char n,
- bit bWithDP, // Decimal Point
- bit bCC ); // Common Cathode(-) or Common Anode(+)
-
- unsigned char
- GetEmptySSDCode( bit bCC ); // Common Cathode(-) or Common Anode(+)
-
- #endif // __SEVEN_SEGMENT_DISPLAY__20101030__
SSD.c
- unsigned char code SSDCodes[] =
- {
- 0x3F, // 0 = ABCDEF
- 0x06, // 1 = BC
- 0x5B, // 2 = ABGED
- 0x4F, // 3 = ABCDG
- 0x66, // 4 = BCFG
- 0x6D, // 5 = ACDFG
- 0x7D, // 6 = ACDEFG
- 0x07, // 7 = ABC
- 0x7F, // 8 = ABCDEFG
- 0x6F, // 9 = ABCDFG
- 0x77, // A = ABCEFG
- 0x7C, // b = CDEFG
- 0x39, // C = ADEF
- 0x5E, // d = BCDEG
- 0x79, // E = ADEFG
- 0x71, // F = AEFG
- };
-
- unsigned char
- GetSSDCode(
- unsigned char n,
- bit bWithDP, // Decimal Point
- bit bCC ) // Common Cathode(-) or Common Anode(+)
- {
- unsigned char SSDCode;
- if( n >= 0 && n < sizeof( SSDCodes ) / sizeof( SSDCodes[0] ) )
- SSDCode = SSDCodes[n];
-
- if( bWithDP )
- SSDCode |= 0x80;
-
- return( bCC ? SSDCode : ~SSDCode );
- }
-
- unsigned char
- GetEmptySSDCode( bit bCC ) // Common Cathode(-) or Common Anode(+)
- {
- return( bCC ? 0 : 0xFF );
- }
main.c
- #include <reg52.h>
- #include "SSD.h"
-
- sbit DecoderA = P2^2;
- sbit DecoderB = P2^3;
- sbit DecoderC = P2^4;
-
- void Display( unsigned char pos, unsigned char n )
- {
- switch( pos )
- {
- case 0: DecoderC = 0; DecoderB = 0; DecoderA = 0; break;
- case 1: DecoderC = 0; DecoderB = 0; DecoderA = 1; break;
- case 2: DecoderC = 0; DecoderB = 1; DecoderA = 0; break;
- case 3: DecoderC = 0; DecoderB = 1; DecoderA = 1; break;
- case 4: DecoderC = 1; DecoderB = 0; DecoderA = 0; break;
- case 5: DecoderC = 1; DecoderB = 0; DecoderA = 1; break;
- case 6: DecoderC = 1; DecoderB = 1; DecoderA = 0; break;
- case 7: DecoderC = 1; DecoderB = 1; DecoderA = 1; break;
- }
- P0 = GetSSDCode( n, 0, 1 );
- }
-
- void main()
- {
- unsigned char i = 0;
- do
- {
- for( i = 0; i < 8; ++i )
- {
- Display( i, i );
- P0 = GetEmptySSDCode( 1 );
- }
- }
- while( 1 );
- }
程序烧进 89C52 以后会看到 2 个 4 位数码管上显示 0 到 7 这 8 个数字。
Posted in 电子电路 | No Comments »