学习单片机心得

学习单片机的心得

一般我们现在用的比较多的的MCS-51的单片机,它的资料比较多,用的人也很多,市场也很大,我们平时说的C51,C52,S51,S52都是51内核的,只是内存容量有差别,或是烧写程序的方法不同。只要你学会了51,那什么凌阳,AVR,什么样原理都是一样。触类旁通。
        先说说就我个人的体会怎么样才能更快的学会单片机这门课。单片机这门课是一项非常重视动手实践的科目,不能总是看书,但是学习它首先必须得看书,因为从书中你需要大概了解一下,单片机的各个功能寄存器,而说明白点,我们使用单片机就是用软件去控制单片机的各个功能寄存器,再说明白点,就是控制单片机那些管角的电平什么时候输出高,什么时候输出低。而由这些高低电平的变化来控制由单片机为核心的系统板。从而实现我们需要的各个功能。对于看书,我们只需大概看看了解一个单片机各个管角都是干什么的?都有什么样的功能,能实现什么样的功能?其实第一次,第二次你可能都看不明白,但这不要紧,因为你没有和实际的物体建立起来这样一种互通的观念,所以我总是说,学单片机看书看两三天的时间就够了,看小说你一天能看五六本,看单片机你两三天看两三边就够了,而且可以不用很仔细的看。推荐一本书,就这一本就足够,书名忘了,是哈尔滨工业大学出版社出的的,作者是张毅刚。大概三四百页吧。大概了解一下书上的内容后,就开始做实践,这是非常关键的,如果说学单片机你不做实践那是不可能学会的,关于做实践有两种方法你可以选择,一种方法:你自己花钱买一块单片机的学习板,不要求功能太全的,对于初学者来说你买功能非常多的那种板子,上面有很多东西你这辈子都用不着,我建议有流水灯,数码管,独立键盘,矩阵键盘,有AD或DA(原理一样),有个简单的液晶,有蜂鸣器,这就差不多了,如果上面我提到的这些东西你能让它都熟练工作了,那可以说对于单片机方面的硬件你已经入门了,再剩下的就是自己练习设计其它电路,这需要你练习,不断的积累经验,只要过了第一关,后面的路就好走多了,万事开头难,大家可能都听过。方法二:你身边如果有单片机方面的高手,向他求助,让你帮你搭个简单的最最小系统板,其实对于高手来说,做个单片机的小系统板只需要一分钟的时间,而对于初学者可就难多了,因为只有你对硬件了解了才会对它熟悉。而如果你身边没有这样的高手,又找不到可以帮助你的人,那我劝你最好是自己买上一块,毕竟自己有一块要方便的多,以后做单片机类的小实验时都能用得上,还剩事。(买的时候找我)
有了单片机学习板之后你就是不停的练习了,我在后面会讲到我的大学生活,如果你感兴趣你可以看看,如果不感兴趣呢,看完这段你就可以继续你的快乐生活了。前面我提到单片机是一项非常注重实践的学科,你最好是自己有台电脑,一天少看电影,少打游戏,把学习板和电脑连好,打开调试软件坐在电脑前,先学会怎么用调试软件,然后从最简单的流水灯实验做起,等你能让那八个流水灯按照你的意愿随意流动时你已经入门了,你会发现单片机是多么迷人的东西啊,太好玩了,这不是在学习知识,而是在玩,当你编写的程序按你的意愿实现时你比做什么事都开心,你会上瘾的,真的。做电子类的人真的会上瘾。然后让数码管亮起来,这两项会了后,你已经不能自拔了,你已经开始考虑你这辈子要走哪一行了。就是要这样练习,在写程序的时候你肯定会遇到很多问题,而这时你再去翻书找,或是问别人,当得到解答后你会记住一辈子的,知识必须用于实际才能发挥出它的作用,否则你自己好好想想,你上了这么多年大学,天天上课,你在课堂上学到了什么?你不是为了每学期的期末考试忙碌吗?考完试一看得了90分,哈哈哈好高兴啊,下学期开学回来忘的一干二净,是不是?你学到什么了?但是我告诉你单片机你一旦学会,永远不会忘了。另外我再说说用汇编和C语言编程的问题。很多同学大一二就开设了C语言的课,我也上过,我知道那时天天就是几乘几,几加几啊,求个阶乘啊。学完了有什么用?让你用C语言编单片机的程序你是不是就悄悄了?所以书上的东西我们必须要实践。单片机编程你想用C语言和汇编语言都可以,但是我建议你用C语言比较好,如果原来有C语言的基础那学起来会更好,如果没有,也可以边学单片机边学C语言,C语言也挺简单,只是一门工具而已,我劝你最好学会,将来肯定用得着,要不你以后也得学,你一点汇编都不会根本无所谓,但你一点C语言都不会那你将来会吃苦头。汇编写程序代码效率高,但相对难度较大,而且很罗嗦,尤其是遇到算法方面的问题时,根本是麻烦的不得了,现在单片机的主频在不断的提高,我们完全不需要那么高效率的代码,因为有高频率的时钟,单片机的ROM也在不断的提高,足够装得下你用C语言写的任何代码,C语言的资料又多又好找,将来可移植性非常好,只需要变一个IO口写个温度传感器的程序在哪里都能用,所以我劝大家用C语言。
        总结上面,只要你有信心,做事能坚持到底,有不成功不放弃的强烈意志。那学个单片机来说就是件非常容易的事。

        步骤:1。找本书大概了解一下单片机结构,大概了解就行。不用都看懂,又不让你出书的。(三天)
                 2。找学习板练习编写程序,学单片机就是练编程序,遇到不会的再问人或查书找。     (二十天)
                 3。自己网上找些小电路类的资料练习设计外围电路。焊好后自己调试,熟悉过程。     (十天)
                 4。自己完全设计具有个人风格的电路,产品,。。。你已经是高手了。       。。。。

        看到了吗?下功夫一个多月你就能成为高手,我就讲这么多了,学不学得会,下不下得了功夫就看你的了

从51初学者到电子工程师1

很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养家糊口、慢慢小有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面掌握这些知识,因为这些行业用不上,例如,液晶显示器,很多行业就不需要;但是,对于一个初学者,我认为,这个提纲是切合实际的,对于面向控制而言,已经基本够用了;对于初学者,全面地掌握这些知识是很有必要的,因为你不知道今后需要使用什么哪些知识,而这些知识, 80%以上你会在今后的工作中使用上,因为这是都是最基本的。熟练掌握这些知识和应用,根据不同的地区、行业和老板,月薪应该可以在3000元~5000元之间,甚至更高。

其实,可能有些你用不上,但是知道了也没有坏处;所谓书到用时方很少,又有谓艺不压身。知识=月薪=年薪=金钱=香车宝马=…….. ,呵呵。

为什么要掌握这些知识?

实际上,电子工程师就是将一堆器件搭在一起,注入思想(程序),完成原来的这些器件分离时无法完成的功能,做成一个成品。所需要的技能越高、功能越复杂、成本越低、市场上对相应的东东的需求越大,就越成功。这就是电子工程师的自身的价值。从成本到产品售出,之间的差价就是企业的追求。作为企业的老板,是在市场上去寻找这样的应用;对电子工程师而言,是将老板提出的需求或者应用按照一定的构思原则(成本最低、可靠性最高、电路板最小、功能最强大等)在最短的时间内完成。最短的时间,跟电子工程师的熟练程度、工作效率和工作时间直接有关。这就是电子工程师的价值。

将电子产品抽象成一个硬件的模型,大约有以下组成:

1) 输入
2) 处理核心
3) 输出

输入基本上有以下的可能:

1) 键盘
2) 串行接口(RS232/485/can bus/以太网/USB)
3) 开关量(TTL,电流环路,干接点)
4) 模拟量(4~20ma、 0~10ma、0~5V(平衡和非平衡信号))

输出基本上有以下组成:

1) 串行接口(RS232/485/can bus/以太网/USB)
2) 开关量(TTL、电流环路、干接点、功率驱动)
3) 模拟量(4~20ma, 0~10ma,0~5V(平衡和非平衡信号))
4) LED显示:发光管、八字
5) 液晶显示器
6) 蜂鸣器

处理核心主要有:

1) 8位单片机,主要就是51系列
2) 32位arm单片机,主要有atmel和三星系列

51系列单片机现在看来,只能做一些简单的应用,说白了,这个芯片也就是做单一的一件事情,做多了,不如使用arm来做;还可以在arm上加一个操作系统,程序既可靠又容易编写。

最近三星的arm受到追捧,价格便宜,以太网和USB的接口也有,周立功的开发系统也便宜,作为学习ARM的产品来说,应该是最好的;作为工业级的控制,是不是合适,在网友中有不同的看法和争议。本公司使用atmel ARM91系列开发的1个室外使用的产品,在北京室外使用,没有任何的通风和加热的措施,从去年的5月份到现在,运行情况良好。已经有个成功应用的案例。

但对于初学者来说,应该从51着手,一方面,51还是入门级的芯片,作为初学者练手还是比较好的,可以将以上的概念走一遍;很多特殊的单片机也是在51的核的基础上增加了一些I/O和A/D、D/A;也为今后学习更高一级的单片机和ARM打下基础。再说了,哪个老板会将ARM级别的开发放在连51也没有学过的新手手中?

在51上面去做复杂的并行扩展是没有必要的,比如,扩展I/O口和A/D、D/A等等,可以直接买带有A/D、D/A的单片机;或者直接使用ARM,它的I/O口线口多。可以使用I2C接口的芯片,扩展I/O口和A/D、D/A,以及SPI接口扩展LED显示,例如:MAX7219等芯片。

市面上一些比较古老的书籍中还有一些并行扩展的例子,如:RAM、EPROM、A/D、D/A等,我觉得已经没有必要去看了,知道历史上有这些一回事就行了;

这些知识,是所有产品都具备的要素。所以要学,再具体应用。

说一个小的故事:野人献曝。

从前,有一个农民,冬天干了活后,休息晒太阳。好舒服呀。
他想,这么舒服的享受,我要献给国王,让他也能得到享受。
于是他兴冲冲地到了王宫,将他的宝贵经验献给了国王。

我现在就象这个农民,把自己认为很宝贵的经验献给大家。希望大家多提宝贵意见;拍板砖也可以,骂我也无所谓,呵呵,随便。

第一课:51单片机最小系统

实际上,51单片机核心外围电路是很简单的,一个单片机+一个看门狗+一个晶振+2个磁片电容;

1. 单片机:atmel的89C51系列、winbond的78E52系列,还有philips的系列,都差不多;现在有一些有ISP(在线下载的),就更好用了;

2. 看门狗:种类很多,我常用的有max691/ca1161和DS1832等,具体看个人习惯、芯片工作电压、封装等。Max系列和DS系列,还有IMP公司的,种类很多,一般只需要有最基本的功能就可以了;原来我使用max691,但是max691比较贵,因为它有电池切换功能,后来新设计电路板,就都采用ca1161了。

很早以前的电路设计中,现在可能还有人使用,使用一个电阻和一个电容达成的上电复位电路;但是,这样的复位电路一个是不可靠,为什么不可靠,网络上能找得到专门论述复位电路的文章;更重要的是,51系列的单片机比较容易受到干扰;没有看门狗电路是不行的,当程序跑飞时,回不来了,死在那里。

常规的做法是买一个专门的看门狗电路,完成复位电路和看门狗电路的功能。
这些芯片的资料很容易在网络上找到,通常使用百度搜索就可以了;看见有PDF的字样,就点击下载;使用网际快车flashget下载也是最好的;

这些资料通常是pdf格式的文件,所以,还需要一个pdf的阅读器。

百度网址:http://www.baidu.com/

网际快车下载网址:http://www.skycn.com/soft/879.html

PDF阅读器下载网址:http://www.chinapdf.com/download.htm

实际上,有了百度和其它的搜索引擎,很方便下载到这些芯片的资料,比光盘还方便,不需要去到处找。

单片机和单片机抗干扰能力是不一样的。如果你的产品是工作在干扰比较大的环境,可以试试选用不同品牌的单片机;原来我在一个光电所,做YAG激光治疗机的控制部分,脉冲激光机的电源放电的时候,能量是很大的,在采取了所有能够想到的光电隔离等措施之后,还是不行;后来,选用了intel的8031,就可以了。小声的说:当时的philips的单片机抗干扰性能是最差的,可能跟Philips主要是用在民用领域有关。现在不知道怎么样了,有人知道的话告诉我。

单片机的输入输出口线是最容易引进干扰的地方;在严重干扰的情况下,需要将所有的口线光电隔离。

3. 晶振:一般选用11.0592M,因为可以准确地得到9600波特率和19200波特率;也可以使用36.864M,这个频率是1.8432M的20倍,看别人的电路板上用过,我也没有用到。这2种晶振很容易买到,价钱跟12M的一样。书上说,12M的晶振也能得到9600的波特率,但是,实际用的时候,会每隔一段时间就出错一次,好像累积误差一样,比较奇怪。

即使你的单片机系统不使用RS232接口,也可以做一个Rs232,留着做测试,或者预留等等,没有坏处。除非你的单片机系统的口线不够用了。

4. 磁片电容:22pf~30pf,可以在有些书上找到什么晶振频率对应什么容量的磁片电容,但是,我都是随便拿来使用,反正在11.0592M下,都没有问题;如果你用到了更高的频率,最好还是找找资料看看。

参见以下电路图:

如果你的单片机系统没有工作,检查步骤如下:

1. 查看门狗的复位输出,可能的话在电路板上加一个LED,下拉,这样看起来就更方便;要是看门狗复位信号有,往下;

2. 查单片机,看看管脚有没有问题;一般编程器能够将程序写入,说明单片机是好的;最好手头上准备一个验证过的单片机,内部有一个简单的程序,比如,在某个口线上输出1个1秒占空比的方波等,可以使用万用表测量。

加一句:设计产品时,要在关键的地方:电源、串口、看门狗的输出和输入、I/O口等加不同颜色的LED指示,便于调试;作为批量大的产品,可以去掉部分LED,一方面是降低成本、一方面是流程保密;

3. 再查磁片电容,有些瓷片电容质量不行,干脆换了;顺便说一下,换器件最好使用吸锡带,将焊盘内的锡吸干净,再将器件拔出,这样不会损伤焊盘内的过孔;再将新的瓷片电容焊接上去的时候,用万用表量量是好的再焊;

4. 最后只有换晶振了;切记要买好的晶振,有些品牌质量比较好。

5. 以上按照以上步骤检测时,将无关的外围芯片去掉;因为有一些是外围器件的故障导致单片机最小系统没有工作。

我准备写的有以下几课:

第二课 基本的芯片和分立器件
2.1 简述
2.2 74系列
2.3 CD4000系列
2.4 光耦与光电管
2.5 三极管
2.6 电容电阻
2.7 固态继电器
2.8 继电器
2.9 变压器和三端稳压器
2.10 开关电源芯片
2.11 封装知识、芯片批号等
2.12 接插件
2.13 器件选购的知识
第三课 数字量的输入输出
第四课 单片机的通讯接口
第五课 单片机系统设计的硬件构思
第六课 单片机程序的框架(汇编版本)
第七课 模拟量的输入输出
……
各位多提宝贵意见。
保证实用。如果程序里面有一些例程,也是已经经过测试可以拿来就用的;实际上是我早年的一些产品的程序的一部分;不好意思,都是汇编的。
写的时间只有周末会多一些,可以保证做到一周一课;尽量能够提前,但是这要看看工作忙不忙了。
坊间有一些参考书,准备今天上午到北京中发市场转了一圈,我记得以下参考书目较好:
1. 周航慈:《单片机程序设计》
2. 徐涵芳:《MCS-51单片机结构与设计》
3. 何立民:《……》

有了这些就基本够用了;其它的很多都是资料的翻译;如果英文不好,可以看看;英文好的话,可以不必了,省电钱买开发系统和编程器、开发板什么的,需要什么资料直接下载PDF文件好了。
要想成为电子工程师,需要宽带,在家里安装包月的adsl或者长宽,绝对值得。
实际上,网络上什么都有了,就是一个网络数据库,要好好利用。
网上自有黄金屋,网上自有颜如玉……

第二课 基本的芯片和分立器件
2.1 简述
有必要对以下系列的芯片和分立器件进行介绍。
除了单片机作为控制器的核心外,作为一个产品,由很多东西构成;所以,在讲系统之前,先将这些零零碎碎的东西一并交待。就好像一栋房子,有各种各样的构件组成,下面的这些东东就像砖瓦一样,没有不行。

2.2 74系列芯片
74系列的芯片的下载地址:
http://www.dainau.com/TTLDATASHEET.htm
http://www.100y.com.tw/asp/class36_40.htm
http://www.mcu51.com/download/digitpdf/74xx/default.htm

74系列的芯片是古老的一族,大部分的芯片现在均已不用了,但是,实际上,在目前的系统中,还能看到一些芯片,有些芯片现在还在系统中使用,例如:

1、 7404 – 6个反相门

下载地址:
http://www.hqew.com/document.detail.asp?pdid=125533
将输入的TTL逻辑反相,如:0->1,1->0

2、 7407 – 6个集电极开路门

下载地址:
http://www.hqew.com/document.detail.asp?pdid=125518
由于集电极开路门可以外接高电压,可以最高到DC30V,电流最大到39mA,通常我用它驱动8字数码管和继电器等大电流的负载;开路门内部结构是达林顿管的,输出的逻辑是正的;
与其类似的芯片是7406,只不过是反相开路门。

3、 74LS573与74LS373 – 8 数据锁存器

74LS373下载地址:
http://www.hqew.com/document.detail.asp?pdid=129171
74LS573下载地址:
http://www.yddz.net/yddzsourse/pdf/74hc573.pdf

引入几个概念:
1. 真值表

参见74LS373的PDF的第2页:
Dn LE OE On
H H L H
L H L L
X L L Qo
X X H Z

这个就是真值表,表示这个芯片在输入和其它的情况下的输出情况。
每个芯片的数据手册(datasheet)中都有真值表。
布尔逻辑比较简单,在此不赘述;

2. 高阻态

就是输出既不是高电平,也不是低电平,而是高阻抗的状态;在这种状态下,可以多个芯片并联输出;但是,这些芯片中只能有一个处于非高阻态状态,否则会将芯片烧毁;
高阻态的概念在RS232和RS422通讯中还可以用到。

3. 数据锁存

当输入的数据消失时,在芯片的输出端,数据仍然保持;
这个概念在并行数据扩展中经常使用到。

4. 数据缓冲

加强驱动能力。74LS244/74LS245/74LS373/74LS573都具备数据缓冲的能力。

OE:output_enable,输出使能;
LE:latch_enable,数据锁存使能,latch是锁存的意思;
Dn:第n路输入数据;
On:第n路输出数据;

再看这个真值表,意思如下:
第四行:当OE=1是,无论Dn、LE为何,输出端为高阻态;
第三行:当OE=0、LE=0时,输出端保持不变;
第二行第一行:当OE=0、LE=1时,输出端数据等于输入端数据;
结合下面的波形图,在实际应用的时候是这样做的:
a. OE=0;
b. 先将数据从单片机的口线上输出到Dn;
c. 再将LE从0->1->0
d. 这时,你所需要输出的数据就锁存在On上了,输入的数据在变化也影响不到输出的数据了;实际上,单片机现在在忙着干别的事情,串行通信、扫描键盘……单片机的资源有限啊。
在单片机按照RAM方式进行并行数据的扩展时,使用movx @dptr, A这条指令时,这些时序是由单片机来实现的。
后面的表格中还有需要时间的参数,你不需要去管它,因为这些参数都是几十ns级别的,对于单片机在12M下的每个指令周期最小是1us的情况下,完全可以实现;如果是你自己来实现这个逻辑,类似的指令如下:

mov P0,A 将数据输出到并行数据端口
clr LE
setb LE
clr LE 上面三条指令完成LE的波形从0->1->0的变化

74ls573跟74LS373逻辑上完全一样,只不过是管脚定义不一样,数据输入和输出端各在一侧,PCB容易走线;所以大家都喜欢使用这个芯片。

4、 74LS244 – 数据缓冲器

下载地址:
http://www.mcu51.com/download/digitpdf/74xx/74F244.pdf

数据输出能力比较强,输出电流可以到40mA以上;
4个缓冲器分成2组,具有高阻态控制端口

5、 74LS245 – 总线缓冲器

http://www.mcu51.com/download/digitpdf/74xx/74F245.pdf

双向数据接口,通常在ISA板卡上可以看到;
早期的51系统中,为了扩展RAM、eprom、A/D、D/A、I/O等经常可以看到这个片子;
为了增强驱动能力,有时是为了隔离输入和输出,主要是布线方便,象74LS573一样,输入、输出在一侧,经常用到这个片子

6、 74LS138 – 三-八译码器

http://www.mcu51.com/download/digitpdf/74xx/74F138.pdf

在早期的51系统的扩展中,作为地址选通的片子,可以经常看到。
另外一个类似的芯片是74LS154,是4-16译码器,现在更是少见了。
有兴趣的可以研究一下何立民的经典著作中的有关章节。
知道有这么一个芯片就可以了。

2.3 CD4000系列

CD4000系列的芯片,除了跟74系列的电气特性有所区别外,例如:
1) 电压范围宽,应该可以工作在3V~15V,输入阻抗高,驱动能力差外,跟74系列的功能基本没有区别;
2) 输入时,1/2工作电压以下为0,1/2工作电压以上为1;
3) 输出时,1=工作电压;0=0V
4) 驱动能力奇差,在设计时最多只能带1个TTL负载;
5) 如果加上拉电阻的话,至少要100K电阻;
6) 唯一现在使用的可能就是计数器,CD4060的计数器可以到14级二进制串行计数/分频器,这个74系列的做不到这么高;
下载地址:
http://www.100y.com.tw/asp/class36_40.htm
http://www.100y.com.tw/pdf_file/CD4060.PDF

2.4 ULN2003/ULN2008

它的内部结构也是达林顿的,专门用来驱动继电器的芯片,甚至在芯片内部做了一个消线圈反电动势的二极管。ULN2003的输出端允许通过IC 电流200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡。

经常在工控的板卡中见到这个芯片。
有个完全一样的型号:MC1413,不过现在好像不怎么见到这个型号了,但是管脚与2003完全兼容。

ULN2003可以驱动7个继电器;ULN2008驱动8个继电器。

ULN2003下载地址:
http://www.hqew.com/document.detail.asp?pdid=148212
ULN2008下载地址:
没有找到。奇怪啊。

2.5 光耦

光耦是做什么用的?光耦是用来隔离输入输出的,主要是隔离输入的信号。
在各种应用中,往往有一些远距离的开关量信号需要传送到控制器,如果直接将这些信号接到单片机的I/O上,有以下的问题:

1) 信号不匹配,输入的信号可能是交流信号、高压信号、按键等干接点信号;
2) 比较长的连接线路容易引进干扰、雷击、感应电等,不经过隔离不可靠

所以,需要光耦进行隔离,接入单片机系统。

常见的光耦有:
1) TLP521-1/ TLP521-2/ TLP521-4,分别是1个光耦、2个光耦和4个光耦,HP公司和日本的东芝公司生产。

下载地址:
http://www.100y.com.tw/pdf_file/TLP521-1-2,4.PDF

发光管的工作电流要在10mA时,具有较高的转换速率;
在5V工作时,上拉电阻不小于5K,一般是10K;太小容易损坏光耦;

2) 4N25/4N35,motorola公司生产
下载地址:

http://www.100y.com.tw/pdf_file/4N25-8,35-7,H11A1-5.PDF
隔离电压高达5000V;

3) 6N136,HP公司生产

下载地址:
http://www.100y.com.tw/pdf_file/6N135-6.PDF
要想打开6N136,需要比较大的电流,大概在15~20mA左右,才能发挥高速传输数据的作用。
如果对速率要求不高,其实TLP521-1也可以用,实际传输速率可以到19200波特率。

选择光耦看使用场合,tlp521-1是最常用的,也便宜,大概0.7~1元;
要求隔离电压高的,选用4N25/4N35,大概在3元左右;
要求在通讯中高速传输数据的,选用6N136,大概在4元左右。

光耦应用的原理框图如下所示:
1. 输入干接点隔离

2. 输入TTL电平隔离

3. 输入交流信号隔离

4. 输出RS232信号隔离

5. 输出RS422信号隔离

光耦除了隔离数字量外,还可以用来隔离模拟量。将在今后的章节中描述。

2.6 三极管
2.7 光电管
2.8 电容
2.9 电阻
2.10 固态继电器
2.11 继电器
2.12 变压器与整流桥
2.13 三端稳压器
2.14 开关电源芯片
2.15 封装知识、芯片批号等
2.16 接插件
2.17 器件选购的知识

2.6 三极管

2.6.1 三极管的4种工作状态

1) 饱和导通状态

饱和导通=0

2) 截止状态

饱和导通=1

3) 线性放大状态

作为低频放大器时使用,具体的可参见有关电子线路的书籍;

4) 非线性工作状态

在无线电通信系统中,作为混频器等使用。具体的可参见有关电子线路的书籍;
愚记得南京工学院也就是现在的东南大学在80年代初期有一套《电子线路》5本,是电子专业的书籍,比较难懂;现在,即使是在电子专业的学生中,也应该降低了对三极管的哪些复杂的参数的要求了吧;在实际使用时,即使是模拟电路、非线性电路,也都是集成电路了,谁还使用三极管自己做呢?如果万一需要,现学也来得及。这套书很强的。编写人在那个年代肯定都是牛人。

学三极管这些参数很繁琐的,要是现在的非电子类的大学生或者大专生们还学这些玩意,我只能说是学校在误人子弟了。

好多学校都在扩招,很多学生念了4年下来,学了一堆过时的理论,跟实际的东西一点没有接轨,不知道7407是干什么用得,不知道三极管的几个状态;我只能无话可说。

所以,念了4年下来,跟企业的需求还有一段距离,还需要从头来过;聪明的学生赶紧抓住机会去学习,去实习,这样,还可以赶紧补上实际应用的这一课。

言归正传。

参见下图:

当单片机的口线输出电平为1时,三极管的be结导通,ce结导通,输出的电压值为0V;
当单片机的口线输出电平为0时,三极管的be结不导通,ce结截止,输出的电压值为5V;

在这种数字电路的应用中,相当于三极管是一个反相开路门。

计算是否导通,公式如下:

I=B(放大倍数,希腊字母的贝塔)×Ibe

当Ice

相差越大,饱和程度越深,Vce越小,三极管的输出内阻越小;

这个概念要用到光电管中。

设计使用时大概算算,心里有个数;在电路板上试试,行的通,那就是它了。可以测量Vce值,至少要小于0.1V就可以了。

常用的PNP三极管是2N5551,驱动40mA的LED(电压在24V)、蜂鸣器等均没有问题。

2.6.2 三极管的具体应用

实际上,已经有象7407、ULN2003可以取代三极管在数字电路中的作用;但是,有时是受到PCB面积的制约,有时是为了降低成本,有时是因为布局方便,在1~2个输出点时,还是可以使用三极管来做驱动的。

例如:驱动一个蜂鸣器;往往系统中的蜂鸣器跟其它驱动设备,继电器等,距离较远;这时,没有必要使用一片7407,或者ULN2003来驱动;驱动的接口如下:

上午赶紧到中发去转了一圈,看了看单片机方面的书,让我失望。

这些书的大部分内容还都是将51的技术资料美捶 胍幌拢 由弦恍┎⑿薪涌诘男酒 ?255/8155/8253/AD0809/DAC0832等等,就是一本单片机的书籍了。还挺贵。可怜的学生花了几十大元买来,学到的是陈旧的知识。

看了又看,想了再想,老树买了2本:

1)MCS-51系列 单片机应用系统设计 系统配置与接口技术 何立民编著 北京航空航天大学出版社 35元人民币

2)单片机外围电路设计 沙占友等编著 电子工业出版社 23元人民币

何立民先生的巨著影响了看来不止是一代人,至少是2代人、三代人以上。主要的好处是体系比较完整,包括了单片机的核心、芯片的时序与扩展、输入与输出(在何老师的编著中叫前向、后向、人机、相互通道,只是说法的不同),应用程序设计、抗干扰技术,应该是,是一个大全了。

愚斗胆建议何老师将该巨著修改如下:

1) 将并行扩展的有关内容以及一些现在不用的内容,如GP16打印机等,放在新编著的书的光盘内容中,这样篇幅可以减少,又不至于查询不到;这些内容,在书中一带而过;

2)新增:I2C的数字和模拟的扩展内容和相应的用单片机口线模拟I2C总线的程序;

3)新增:电源部分,包括:DC/DC模块,MAXIM、LINEAR公司的step-up/step-down等芯片的内容,还有开关电源、线性电源等内容;

这样,就能焕发出更新的活力。

沙占友的书中有一些新的内容,象时钟电路SD20##、电源部分,都是愚所激赏的,跟别的书籍相比,内容新,基本没有重复的地方。

如果初学者能买到周航慈的《单片机软件设计技术》,再下载一套89C51或者78E52的数据手册,随便从哪里找一本详细讲51语言的书,也就行了。这样的书,最好从图书馆借来看看。何老师的书中也有一部分内容,讲程序设计的,没有详讲语言。其实最好的就是原来徐涵芳老师编著的那本小册子,好像是《51/96单片机设计技术》。好在是原汁原味,篇幅小而精干,也不贵。

手边的参考书有以上三位老师的编著就可以了,其它的,随便看看,如果有用,记住器件的名字,从网络上下载下来看看就行了。

2.5 光电管

我这里所谓的光电管有2种:

1) 反射型光电管
2) 对射型光电管

这2种产品在市场上又可分为调理好的和没有调理好的;

这2种光电管在电子产品世界和电子技术应用杂志上都有大量的广告。随便找一本都有。

我所说的调理好的指的是内部已经加了限流电阻和输出的放大驱动电路了。它的特点是只有3根线,电源2根,输出信号一根,TTL电平的;但是,有时受到某种限制,需要使用没有调理好的,怎么办呢?

参见下图:光电管原理框图

这种没有调理好的光电管在使用时,需要做一块小的电路板,在发光管加限流电阻,在光电三极管的集电极加上拉电阻到5V,如下图所示:光电管工作框图1。

但是,在使用中我发现,输出的信号不稳定,尤其是在使用比较长的电缆传输到单片机的时候;究其原因,我认为是由于反射或者对射的红外光落在光电三极管的靶面上,光强未能导致光电三极管深度饱和,使得输出的内阻偏大,肪车脑肷 偷缋碌母扇判藕湃菀自谙呗飞系 拥脑倒剩?br>
为了可靠工作,仿照达林顿管的结构,在光电三极管的输出端加一个限流电阻接到NPN的B结,当无光的时候,2N5551饱和导通,输出电压为0V;实际测量小于0.1V;当有光,甚至是弱光时,2N5551截至,输出电压为5V。将3K电阻换成更大或更小的电阻,可以调整光电三极管的输出的灵敏度。

具体工作过程可以自行分析,做个实验。

2.6 电容

2.6.1 电容的主要种类

电容有以下几大类:

1) 电解电容
2) 独石电容
3) 磁片电容
4) 胆(左金右旦)电解电容
5) 涤纶电容等

电容的指标是:耐压值和电容容量。例如:220u/50V,就是说,这个电解电容耐压值为50V,容量为220u。

电容的容量跟电容的介质有关。

顾名思义:

电解电容为电解质作为介质的,铝作为电极;

独石电容是使用石头作为介质的;

磁片电容是磁片作为介质的;

胆(左金右旦)电解电容使用电解质作为介质,但是,电极采用胆(左金右旦)金属。
涤纶电容采用涤纶作为介质。

有兴趣的网友可以拆一个电容看看。

2.6.1 电容的使用场合

1. 电源稳压和滤波

电解电容主要是用来稳压和低频交流滤波的;高频滤波是使用磁片电容和独石电容。
当电解电容作为稳压时,接在整流桥和三端稳压器的输出端,起到稳定电压的作用。其工作机理相当于一个水库,从上游来的带有波浪的水到了水库,就变的平滑了。

但是,铝电解电容的电解质随着时间的推移会干涸,所以在设计时需要留有余量,保证系统正常工作到它的寿命。

有些远端供电的直流电源,接到电路板的输入端时,需要在电路板的电源输入端加一个大的电解电容,通常可以是220u/25V,这样,这块电路板需要供电时,不是直接从电源处取,而是从电容中取电,可以得到稳定的电流供给;

但是,电解电容只能滤除低频的波动;对于直流电源中的高频波动,可以加一个0.1u或0.01u的独石电容或者磁片电容。

很多教科书都指出,在每一个芯片的电源和地两端接一个0.1u或0.01u的独石电容或者瓷片电容,解决芯片的供电过程中,由于电路板的走线电感产生的电源开关噪声尖峰。这种作用下的电容叫去耦电容。这是电路板的常规的设计;

2. 定时参数

对于象555这样需要外接电容产生稳定的脉冲的器件,涤纶电容是首选。可以想象,涤纶一层又一层缠绕,受到温度变化引起的涤纶的面积的变化的相对值要远远小于独石电容的介质石头受到温度变化而引起的变化值。

3. 产生其它电压

有些需要从单一电压产生其它的电压的芯片,如:max232,需要外接电容才能实现。
参见max232技术资料。
外接01.u的胆电容。

2.6.2 电容的封装

电容有直插和表面贴的不同封装。

电解电容表面贴封装的通常耐压值不超出25V,电容值不超出100u。再大,就只好使用直插的了。其它的电容,磁片和独石都有表面贴封装的。

2.7 电阻和缥黄?br>
2.7.1电阻的种类

2.7.1.1 普通电阻

电阻种类按照工艺可以分为碳膜电阻和金属膜电阻;

按照功率可以分为小功率电阻和大功率电阻,大功率电阻通常是金属电阻,实际上应该是在金属外面加一个金属(铝材料)散热器,所以可以有10W以上的功率;在电子配套市场上专门卖电阻的市场上可以很容易地看到。

金属电阻通常是作为负载,或者作为小设备的室外加热器,如,在CCTV的一些解码器箱和全天候防护罩中可以看到。

电阻在电路中起到限流、分压等作为。通常1/8W电阻已经完全可以满足使用。但是,在作为7段LED中,要考虑到LED的压降和供电电压之差,再考虑LED的最大电流,通常是20mA(超高亮度的LED),如果是2×6(2排6个串联),则电流是40mA。

不同厂家选用不同材料的,压降有所不同。所以,需要加上电试一下,但是,不要让Led的电流超出20mA(单只LED),这时加大电流亮度也不会增加,但是LED的寿命会下降,限流电阻的大小就是压降除以电流。电阻的功率随之可以算出。

这个使用初中的知识就够用了。

2.7.1.2 电位器

电位器就是可调电阻。在初中学物理时,中学老师拿一个很大的圆筒状的东东,上面有一个滑杆,跟这个东西很类似。

它的阻值在1~n之间变化。

N=102、502、103……
102=10*10的2次方,也就是1000欧姆,1K
同理,502=5K。

这种表示的方法跟电容是一样的。

电容104=10*10的4次方pf,电容的基本单位是pf,1u=1000000pf,所以,104=100000pf=0.1u;

电位器又分单圈和多圈电位器。

单圈的电位器通常为灰白色,面上有一个十字可调的旋纽,出厂前放在一个固定的位置上,不在2头;

多圈电位器通常为蓝色,调节的旋纽为一字,一字小改锥可调;

多圈电位器又分成顶调和侧调2种,主要是电路板调试起来方便。
有些是仪器仪表设备,通常是模拟电路,有一些不确定的因素,需要调节才能达到最理想的效果;有些是设备本身就需要输出一个可变的东东,如电压和电流,也需要一个电位器。

2.7.1.3 排电阻

是sip n的封装,比较常用的就是阻值502和103的9脚的电阻排;象sip9就是8个电阻封装在一起,8个电阻有一端连在一起,就是公共端,在排电阻上用一个小白点表示。排电阻通常为黑色,也有黄色;51系统的P0需要一个排电阻上拉,否则,作为输入的时候,不能正常读入数据;作为输出的时候,接7407是可以的,不需要上拉电阻;但是,接其它的芯片,还是不行。有兴趣可以看看51的P0的结构;没有兴趣,依葫芦画瓢,照做没错。

2.7.1.4 光敏电阻

当照在光敏电阻上的光强变化时,电阻值也在变化。显然这是半导体材料的特性。
使用光敏电阻可以检测光强的变化。

思考题1:

有一个LED显示设备,要求,当光强变化的时候,LED的亮度随着光强变化;光线越强,LED越亮;反之亦然。怎么使用单片机实现此项功能?可以是多级调光,如8级调光;也可以做成无级调光。

2.7.2 电阻的封装

电阻的封装有表面贴和轴向的封装。

轴向封装有:axial0.4、axial0.6、axial0.8等等;axial在英语中就是轴的意思;
表面贴电阻的封装最常用的就是0805;当然还有更大的;但是更大的电阻我想就不是很常用了。

电位器的封装在protel的书种可以很方便地找到。但是如果直接使用,可能会有一些偏差。老树早期就犯过这种错误,导致电位器旁边的器件安装费劲。

搞硬件和软件是有所不同的,搞硬件的人,一定要精确。

在硬件上的一个小的错误,都会造成这块板的推倒重来;因为产品是不能有飞线的;而这个小小的错误相当于软件上的一条语句,在软件调试阶段悄悄改掉,可以神不知鬼不觉;在PCB上,特别恶心。而且谁都知道-老板最知道。

什么是精确呢?

1. 对你所要实现的工作的目标理解准确;

2. 对你的电路图要清楚每一个器件在其中所起的作用;如果不明白,可以找一个专家问问,得到确认;如果不清楚,可以先试试;

3. 对每一个器件的封装要严格把握,该是什么形状、外形一定要完全一致;还有考虑到空间是不是对其它的板卡器件有影响;对边缘连接器件与电路板的边缘之间的距离、ISA和PCI的边缘连接件与挡板之间的关系要完全把握才能去做电路板;否则只是浪费金钱和时间;

对边缘器件与边缘之间的距离要是不能有把握的话,可以找3个人,每个人都计算一遍,取个平均值,基本上就差不多了。

4. 对单片机的资源能不能作成这件事情一定要有把握,CPU运算速度和字长、内存够不够大、程序存储器够不够大,需要仔细的规划;

5. 原理图经过专家认可无误后,画出来的PCB需要做网络检查,做到与原理图完全一致;

精确,实际上是敬业的精神。

2.8 继电鳌⒐烫 痰缙?br>
2.8.1 继电器

继电器,就是利用继电器的线包在加电后产生的磁力,将2个电极吸合在一起;初中还是高中的物理有它的原理。有兴趣可以打开一支看看,很好玩的。

继电器有:
1) 公共端:COM
2) 常开:normal open,NO
3) 常闭:normal close,NC

继电器主要指标:

工作电压:

工作电压有直流和交流的2种;

在PCB上,通常是直流的;交流的继电器通常是AC24V的居多,当然,还有AC220V的。交流的继电器国产的比进口的,比如,idec,OMRON,fujitsu便宜很多,当然,质量也差一些。

可以在百度上专门搜索一下继电器,上面有一些厂家产品的介绍。

常用的小功率的继电器是national 的居多,OMRON也有,便宜一些,一盒50只。

常用的电压有:

DC5V/DC9V/DC12V/DC24V等;

根据触点数量,可以分为:

单刀单掷/SPST

单刀双掷/SPDT

双刀双掷/DPDT

四刀双掷等/?

还要根据触点容量来分。

一般的都是DC30V/1A或者DC30V/2A,AC110V/0.2A,再大,就不能使用继电器了,因为在触点切换,电流通过的瞬间,会产生拉弧,烧毁触点,使得切换不可靠;这是,可以使用固态继电器。

实际上,在PCB上的继电器的任务就是给出一个干接点信号,作为控制信号使用,传递的是一个信号,而不是能量。或者控制一个大功率的开关等,让大功率的开关去控制功率的传递;但是,后者也不如固态继电器来得方便。

继电器的封装通常是DIP16或者以上;也有更小的继电器,但是,价钱跟DIP16的差不多。

注意:DIP16的继电器只有8个管脚;所以设计封装时,不要图省事直接使用DIP16,这样容易在焊接的时候焊反了,导致出错。要专门设计继电器的封装,该有几个脚就使用几个脚。

2.8.2 固态继电器

固态继电器,说白了,就是使用发光管触发的过零触发的可控硅。
可以说,跟光耦很相似,也是4个管脚,只是区别在:

4) 直接使用直流电压控制;可以认为内部已经有了一个限流电阻;
5) 接收光信号的一端是过零触发的可控硅;

可以说是一个电子开关,无触点的继电器。

因为无触点,所以可以通过大电流而不产生拉弧,工作寿命与开关次数无关。

触点作为信号使用的继电器的时间的工作寿命是100万次到300万次,可以查看技术手册;

固态继电器可以认为是无限次的,所以在大电流和频繁开关的场合,使用固态继电器。

固态继电器触点通过的信号通常是交流电压,但是也有直流电压的。

固态继电器可以通过AC220V或者AC380V以下的交流电;它的2个指标:

1) 工作电压,通常为DC5V和DC12V,也有DC24V的;
2) 工作电流:AC220V/1A/2A/4A不等。

国产的固态继电器质量不错,跟进口的没有区别,就是封装的质量太差,一批买回来,个个都不一样,焊在电路板上东倒西歪,不美观;至于小功率的国产的继电器市场上比较少见,有也不敢使。

进口的固态继电器有美国的和日本的,4A以上的比较贵,日本的OMRON的固态继电器2A的才卖8元,侃侃价估计还能便宜,体积小,封装绝对的准确,可以很整齐地在电路板上排列,不占地方;

什么时候国货也能象日本的那样好?

什么时候所有的中国人都能象日本人那样的敬业?

这个论坛不是骂日本人的地方,所以不往下说了;老树愿意将自己的一点微薄的经验献给大家。在电子产品应用的中端低端市场将外国产品赶出中国市场我想中国人还是可以做到吧。

2.9 线性电源:变压器、整流桥与三端稳压器

什么是线性电源?为什么叫线性?老树查了网络上的资料,也没有答案,只好等待高明教我。

PCB上需要供电,就需要电源。电源分2种,一种是线性电源,象7805,就是线性电源;

一种是开关电源,是将AC220V直接整流滤波成高压,推动功率管工作在100Khz以上,再整流滤波成低压。

开关电源的工作原理可以通过百度查到。

线型电源需要工频变压器,将AC220V变换成低压,经过全桥的整流,和大电容的滤波,成为脉动的直流,再经过三端稳压器,输出直流电压。

输出端还需要大的电解电容滤波。注意这时要选用足够大的电容容量和耐压值的电解电容。耐压值不够,你就等着听响吧。电容容量不够,整流输出的电压和输出的电压的压差不够,输出电压会有纹波,单片机系统工作不正常。

通常电路板上需要的是DC5V,一般来说,现在的电路板,一片7805,再加散热片也基本够用了。功率越大,散热片也越大。

变压器有多种规格:

1、 普通E型矽钢片绕制的变压器,现在最大量的是广西普宁雄英出的变压器,通过了长城认证,质量是不错的,最大的好处是便宜,现货量大;通常的规格是单9V、12V,双9V、12V等;可能这个地方出矽钢片,有这样的矿藏。

2、 环型变压器,象个椭圆型;

3、 最近好像圆形的变压器也多起来了,后2种变压器应该是漏磁小、发热少、效率高,大功率的整流时使用,当然单位瓦数也贵啊,按照1元/W计算预算应该差不多了。

这2种变压器都需要定制,可以定制各种规格的。

4、 焊在电路板上的变压器,比较有名的是兵字品牌。在《电子技术应用》和《电子产品世界》上常年做广告。秦皇岛也有一家,好像叫耀华。

怎么计算变压器需要多大的功率?

首先,计算功耗。比如:Dc5V/0.25A,也就是1.25W的功耗。

7805效率50%,变压器效率50%,就是说,需要6W的变压器。

Dc5V/0.25A的输入压差大概在3V,6V的变压器整流出来的电压是大约6×1.4=8.4V,也差不多了。所有选用AC6V/6W的变压器。再到市场上找一个差不多的变压器用上就行了。

注意:电流越大,压差越大;在电路工作的时候,可以拿示波器看看电源的波形是不是平稳。

78系列的芯片做的比较多而好的是美国国家半导体公司(national semiconductor)的LM780X和摩托罗拉公司MC780X 等2大系列。

78系列是高压差的稳压芯片,现在有低压差的稳压芯片,其机理参见沙占友老师的书籍。有LM2930、LM2937、LM2940C、LM2990等4个系列。

如果需要更大的电源供给,或者使用开关电源,或者去买成品的线性电源,象辽宁朝阳4NIC的电源,质量不错,价格也不错。

附:在网络上找到的一篇文章:

开关电源和线性电源的区别

线性电源的调整管工作在放大状态,因而发热量大,效率低(35%左右),需要加体积庞大的散热片,而且还需要同样也是大体积的工频变压器,当要制作多组电压输出时变压器会更哟蟆? 氐缭吹牡髡 芄ぷ髟诒ズ秃徒刂磷刺 蚨 ⑷攘啃。 矢撸?5%以上)而且省掉了大体积的变压器。但开关电源输出的直流上面会叠加较大的纹波(50mV at 5V output typical),在输出端并接稳压二极管可以改善,另外由于开关管工作是会产生很大的尖峰脉冲干扰,也需要在电路中串连磁珠加以改善。相对而言线性电源就没有以上缺陷,它的纹波可以做的很小(5mV以下)。对于电源效率和安装体积有要求的地方用开关电源为佳,对于电磁干扰和电源纯净性有要求的地方(例如电容漏电检测)多选用线性电源。另外当电路中需要作隔离的时候现在多数用DC-DC来做对隔离部分供电(DC-DC从其工作原理上来说就是开关电源)。还有,开关电源中用到的高频变压器可能绕制起来比较麻

2.10 开关电源芯片

相对于线性稳压器来说,开关电源在计算机主板上、工控机主板和各种各样的电路板上起着电压变换的作用。例如:将低电压,比如:电池转换成稳定的3.3V或者5V,或者将高电压转化成DC5V、DC3.3V,或者将DC5V转换成3.3V和1.8V,例如,ARM的电路板就需要这样的芯片,3.3V给ARM供电,1.8V给arm的core供电。以上
由于采用了开关电路,电源芯片的工作频率高,发热小,效率高。

同样的,还是芯片的巨头,MAXIM、LINEAR和TI等公司在电源转换芯片上是最为卓越,无论从产品的种类,还是质量都是上佳的;

经常看电子产品世界和电子技术应用的网友一定对maxim的电源芯片印象巨深。五花八门的电源芯片,让你无法选择到底选用那种是自己的所需要的。

在maxim的产品树中,对电源是这样分类的:

Power Supplies and Battery Management
tchmode DC-DC Power Supplies 408
Isolated Power Supplies 22
Low-Dropout Linear Regulators 75
White LED Drivers 13
Low-Side MOSFET Drivers 14
High-Side MOSFET Drivers 6
ORing MOSFET Controllers 2
Battery Chargers 36
Battery Protectors, Selectors and Monitors 17
Regulator + Reset Circuits 4
Current Sense Amplifiers 22
LCD/ECB/CCFL Display Bias Supply 87
ALSO SEE: Hot-Swap and Powertching
ALSO SEE: Voltage References

我们经常使用到的tchmode DC-DC Power Supplies ,这里有分成n种。老树比较熟悉的是step-down电源芯片,也就是所谓的从高电压下降到低的电压的芯片;从低到高,当然是step-up电源芯片。

象philips的电动剃须刀,里面肯定有电源管理芯片,当电池电压下降,但是,电池又有电的时候,能够输出恒定的电压,榨干电池内的最后一点电能,能够舒适地使用一段很长的时间。

比如,你的电路板上只有DC24V电压,但是,还需要Dc5V/2A的电源,这么高的压降,使用线性稳压器显然不合适,如果使用DC/DC模块,成本太高,体积也比较大,所以,得选用一款芯片完成这个功能。

按照maxim给出的复杂的选择,根据你的要求,多选择几项,maxim会给出一个清单,在清单中去选择你最适合你的需求的芯片。

老树原来使用过的完成此项功能的芯片是:MAX724、LT1076;这2款芯片需要1个50uH的电感才能输出Dc5V电源;但是,这种开关电源芯片有个好处,就是输入只要在它的允许的范围内波动,或者负载在变化,输出DC5V电源十分稳定。

电源的范围从Dc10V~DC40V,max724均能输出5A的DC5V电源。

Maxim724下载连接地址:

http://www.hqew.com/document.detail.asp?pdid=153160

LT1076下载链接地址:

http://www.hqew.com/document.detail.asp?pdid=157742

在ARM上使用的电源芯片是TI公司的TPS767D318。

下载链接:

http://www.hqew.com/document.detail.asp?pdid=122122

在沙老师的书中,也介绍了几款电源转换芯片,可供参考。

如果是作为隔离电压产生,例如:5V转换成隔离的5V,用在光耦、通讯等电路中,去自己做隔离电路就有点划不来,不如去买现成的DC/DC模块。这点国产的模块做的不错,象老树常用的Dc12V/DC5V500mA的模块,大约30元,质量还是不错的。

比较有名的电源转换模块,如:

如果是作为隔离电压产生,例如:5V转换成隔离的5V,用在光耦、通讯等电路中,去自己做隔离电路就有点划不来,不如去买现成的DC/DC模块。这点国产的模块做的不错,象老树常用的Dc12V/DC5V500mA的模块,大约30元,质量还是不错的。

老树常用的电源转换模块,如:

北京星原丰泰电子技术有限公司的SAPS系列DC/DC模块,这种模块很多厂家都是兼容的;

电源转换模块还有AC/DC、DC/AC等不同;具体不同可以参看厂家网站。

厂家链接:

http://www.saps-bj.com/index.htm

另外一家生产微电源模块的厂家是:深圳市顺源科技有限公司。

厂家链接:

http://www.mornshine.com/index105.htm

这种电源模块国产的质量不错了,完全可以取代进口产品。

DC/DC模块完全可以将输入输出的电源地连接在一起,作为普通的非隔离的电源转换器使用。

2.11 器件选购、芯片批号、封装知识等

在市场上买芯片,千万注意不要买到旧片、拆机片;旧片、拆机片有些凑合能用,有些干脆不行;即使现在能用,寿命肯定有限;

旧的就是旧的,肯定瞒不过有心人;主要是从芯片的管脚的崭新程度、芯片印刷的质量等仔细观察。

旧的芯片往往管脚参差不齐、搪锡发乌、包装的管子不够新;而且往往是芯片的表面发白,那是因为被打磨过了,然后重新丝网印刷上厂家名称、批号等;

所以最好是买激光打标的器件,激光打标的产品肯定是新货,或者没有使用过的货;而且买的时候需要注意,器件的批号最好是最近当年的或者是最近几个星期的产品;总而言之,别花冤枉钱,还影响产品的质量。

同样的产品,不同厂家的质量也不一样。我比较喜欢的是美国TI、摩托罗拉MC、MAXIM、LINEAR的产品;假的也少;

例如,max7219芯片上有一下标志:
MAXIM
MAX7219CNG
0323PY

MAXIM就是芯片的厂家;
MAX7219CNG是厂家的型号,CNG跟封装和7219这个系列产品的细微的差别有关;
03是指20##年;23是指该年的第23周;一年是52周,所以这个数字不会超出52;

激光打标是在芯片上形成一个暗色的与芯片表面有一个明显对比的标志;中关村的大恒公司就有激光打标机的业务;但是未必是在芯片上打标;

有时,激光打标会产生类似暗黄色的标志,这跟激光器功率和芯片封装材料有关。

关于CA1161看门狗的原理和应用参见以下链接:

http://www.zlgmcu.com/catalyst/wdteeprom/shouce/CAT1161_cn.pdf

http://www.zlgmcu.com/catalyst/yingrong/CAT24Cxx1_1.pdf

关于电源监控和看门狗的原理,参见以下链接:

http://www.icbase.com/newweb1/commend/uP/zongshu.asp#μP监控
http://www.icbase.com/newweb1/commend/uP/application3.asp#μP监控电路
http://www.icbase.com/newweb1/commend/uP/application3.asp#常见问题解答

第三课 合格电子工程师是怎样炼成的?

不好意思,第二课没有写完,又开一课–老树当过老师,有毁人不倦的习惯,再者,这个问题想了很久了,也基本想通了。

在网络上很多初学者在问:怎样成为一个合格的电子工程师?

这个问题有很多答案。老树谈谈自己的看法。

第一步 入门-51核心和基本电路

中国人有10亿啊,每年有多少大学生毕业呢?我不知道。但是我看到有一张照片,招聘会上熙熙攘攘,人来人往,十分震撼。从来没有一个时刻让我感觉到中国的人力资源是如此的丰富。但是,从现在的大学毕业出来的学生学到了什么东西呢?一些理论,跟实际脱钩的理论。有没有用呢?有点用。但是,在企业中,需要的是实际干点事情出来,实际解决问题。所以说,很多企业不想要大学本科出来的大学生,说动手,没有动手能力,不知道电阻电容长得什么样子,能够做什么?但是又自视甚高,对工资的期望值比较高。等到能够干点事情了,又拍拍跑了。所以企业现在喜欢使用大专中专甚至是职业学校培训出来的小孩,至少这些孩子们知道自己的份量,能够实实在在地做事。要知道,他们很多人的天赋并不差,有些人甚至可以说聪明,只是因为很多人是家庭条件不好,打小就是苦孩子,没有条件接受良好的教育。一旦给机会,他们都比较珍惜。

现在的大学,误人子弟甚多。扩招是没有错,但是,实验室扩了吗?教室扩了吗?教师扩了吗?至少实验室是没有扩。老树认得的一个研究生说,只有到了一个阶段,才能到实验室作实验。很多导师就是把学生当奴隶一样干活,要是在干活中能够学到东西那就算是运气好的;运气不好的,直接就是导师的廉价的劳力了,学不到东西,活倒干了不少。

但是,既然学生要拿文凭,要应付考试,没有办法,那怎么自救?

如果励志要做一名出色的电子工程师,老树可以谈谈自己的看法。

做一个电子工程师,先从51学起,这是得到公认的。不需老树饶舌。

首先,去买一个开发板,越便宜的越好,在上面可以练练keil C。最好再买一个仿真器,这样调试的效率高。当然这个不便宜,但是我觉得可以志同道合的哥几个合买。反正1天24小时,每人8个小时轮流上,有个几个月,C51语言也就差不多了。

其次,看看老树的文章,看看需要学点什么基本的东西。北京的大学生有福啊,没事到中发去转转,认认老树的文章上说得哪些电阻、电容、三极管、芯片、接插件什么的,看看自己的电脑上的主板、网卡、声卡、显卡是怎么画的,找找感觉,这些板卡都是高手的杰作啊。

构思一个小的产品,按照老树文章上的思考题,找本protel99se的书,从每个菜单练起,循序渐进,从单片机最小系统->输入->LED->RS232/RS422/RS485->固态继电器、继电器等原理图画起,边画边学,一点一点做,做好了,最好找个高手看看,找出毛病在哪里,再反复改进。在这样的模拟实战中找到感觉。

推荐老虎工作室的protel 99系列4本,写的还是循序渐进的,当然不便宜;咬咬牙,可以合买一套,轮着看。

顺便说一句我对市场上的开发板的看法,这些开发板当然都不错,但是,只能学到语言,不能教你画原理图和PCB,实际做的时候,还是需要高手带一带是最快的。我就是一个朋友教我的,也就半天的功夫,就会了。当时还是DOS下的protel 3.16版本。

以战养战。找个公司、企业,帮他们做个小产品,既能得到公司的高手的指点,又能赚到一笔费用,岂不甚佳?这时,你的开发板、仿真器的费用就出来了。从原理图->PCB->C51,单片机也入门了。

第二步:登堂入室-掌握系统的电路知识

这时,需要对电子技术的所有东东进行全面的了解,主要是看看杂志、BBS、网站上的技术文章、何立民先生主持编著的《单片机应用技术大全》系列,将单片机和它的配套的电路,输入输出、通讯等等做一个全面的了解。目标是为什么?系统的技术储备。知道什么问题可以使用什么方法解决,可能在什么地方找到解决的方法,这对你以后走上工作岗位,解决实际问题是非常有好处的。如果你真能这么做,那么,你今后肯定比单位中的老同志还要棒。

老树在国营研究所的时候,曾经有一段时间无所事事,就是在那一两年的时间内将研究所的技术杂志看了一遍,尤其是《电子技术应用》。打下了一个良好的基础。

这时,争取机会,学习高手们的硬件设计。一个比较快的办法就是到工控机的厂家那里,看看工控机的板卡和调理板是怎样设计的,都使用了哪些东西。记得老树第一次看到国外的一个器件,到处去问,也不知道是什么东东。后来在四通工控那里看到了,原来是固态继电器。这时,脑子里关于固态继电器的知识都冒出来了。再一看,配套市场大把的。

什么东西就是这样,你要是不知道它是干什么的,你天天看见,也熟视无睹。

有心人就是这样,在什么样的情况下,都能慢慢积蓄知识和力量。毕竟一个产品,不是只会单片机就可以了,还是需要很多的外围电路,按照何老师的分类,前向、后向、人机、互相通道等,才能做成一件产品的。

这个时候,抓住任何机会,去参与一个大型产品开发,在其中做一件事情,你可以学到沟通、协作、界面等产品开发的一些要素。

第三步:勤奋至卓越

中国人多啊,每个人都是智商100,谁比谁傻啊。凭什么你比别人强?你能有好的工作、好的收入,你能香车宝马,醇酒美人?老树认为,没有别的办法,就是靠勤奋。

勤奋学习-这个道理大家知道,知识就是金钱啊;

勤奋工作-想比别人多赚钱,在智商相同的情况下,就是靠多付出时间干活,再提高工作效率。别人5×8小时工作,你是7×16小时,再提高工作效率一倍,你不久赚了比别人多5倍的钱吗?老树公司有2个员工,原来在老家种苹果,没有赚到钱,到老树的公司中干活,计件,活忙的时候,早晨8:00起来,晚上12:00收工,年底也赚了一笔钱回家,高高兴兴,老树也开心,原来一屋子人干的活,现在2个人干了,公司管理省事了,员工也赚到了钱。

开发也是一样。当然,这个需要你的公司有这个机制,多劳多得的机制。但是,要是现在没有,你要不要这样干呢?

我认为,需要。一方面,干别人的活,练自己的技术,长自己的本事。另一方面,多干活,才能快速增长本事,技术才能跃变、突破,登堂入室,再得心应手、出神入化。至少,熟练工种是没有问题的吧。

就象一壶水,老是小火,烧了半天,也是温吞水;可是大火一上,一会就开了,就是这个意思。

你看《射雕英雄转》中的郭靖,没有别的本事,就是傻练,有一天开窍了,如有神助。技术这个东西就是这样,突破了门槛,就是坦途。需要勤奋勤奋再勤奋。有一天这个日子来了,你就苦尽甘来了。

勤奋还有另外一个含意,就是天道酬勤。其实是每个人看见勤奋的人,都会给他机会的,觉得帮助这样的人,高兴;把事情放在他的手里,也放心。

还有一个含意是触类旁通。知识需要很多的参照物,去比较、联想、萃取、升华。换句话,你可能付出的是其他人的n倍的努力,可是你得到的是n倍以上的回报,你的知识已经不是简单的累加了,已经质变了。

如果你在这个单位,勤奋了,也出成果了,就是没有得到公平的待遇,也没有关系。换一个环境就是了,总有人会欣赏你的。再说了,付出总有回报。

有些人习惯怨天尤人,没有好的老爸老妈,没有好的老师,没有好的同伴,没有好的环境,没有好的老板。这些人需要去看看周立功的文章,看看周老师怎样一步步成长的。

第四步:沟通、协作

原来还有,现在越来越少,做一个小的产品,就可以生活无忧。

现在这种情况越来越少了。在任何一个单位,将一个产品做好,都需要与同伴主动沟通,与不同部门的人互相协作。经常是跟不同单位的人沟通完成意见事情。

第五课 单片机系统设计初探

5.1 概述

所谓系统,就是说,除了单片机之外,还需要有:

1) 输入

2) 输出

输入和输出按照第一课的定义,包含了范围:

输入基本上有以下的可能:

1) 键盘

2) 串行接口(RS232/485/can bus/以太网/USB)

3) 开关量(TTL,电流环路,干接点)

4) 模拟量(4~20ma、 0~10ma、0~5V(平衡和非平衡信号))

输出基本上有以下组成:

1) 串行接口(RS232/485/can bus/以太网/USB)

2) 开关量(TTL、电流环路、干接点、功率驱动)

3) 模拟量(4~20ma, 0~10ma,0~5V(平衡和非平衡信号))

4) LED显示:发光管、八字

5) 液晶显示器

6) 蜂鸣器

处理核心主要有:

1) 8位单片机,主要就是51系列

2) 32位arm单片机,主要有atmel和三星系列

3) 还有一些专用的单片机,例如:MPS430,水表、电表、洗衣机、空调的单片机等等

所谓系统,也就是说,作为一个电子工程师,需要掌握以上所有方面的知识,才能做到兵来将挡,水来土掩,无论设计任务有什么样的需求,都能应付自如,有多种方法可以实现同样的目标,从中找到一个成本最低、质量最高、可靠性最好的解决方案。

实际上,无论从事任何一种工作,对于本行业所需要掌握的知识应该是全面而系统的;一开始,由于工作经历的欠缺,没有实际的经验,但是,可以通过广泛的阅读构成系统的知识框架;形成这个框架后,在工作中亲身实践,和阅读其他工程师的作品,再往里填充各种各样的细节,使之不断丰满、充实、正确。

5.2 任务分析

5.2.1 初步判断采用何种单片机完成此项任务

http://img8.photo.163.com/hxm0902/1330137/16437844.jpg

1)干接点

就是类似于机械接点,最简单的就是按键,一般来说是输入、输出的继电器的接点信号;无源;

2)平衡信号:

类似RS422、RS485信号,是信号之间相互比较,来判断是数字信号的1还是0;不容易收到干扰,传输距离远;但是,最好使用双绞线来传输;

3)非平衡信号:

单端接地的信号,如:TTL电平、RS232等都是,特点是有一个公共的参考电压,容易受到干扰,传输距离近;

可以通过网络来查询准确的解释。

4)线性电路

类似于音频放大电路就是,特点是:

要求输入和输出形成了一个线性对应的关系;

5)非线性电路

比如:无线电电路中的混频器,将2个频率合在一起,生成第三个频率,就是非线性电路。

好像还没有听说线性信号和非线性信号。只有模拟量和数字量信号;

6)模拟量和数字量

模拟量是连续变化的信号,如:0~5V,4~20mA等;

数字量是只有0、1两种情况。

5.2 51单片机系统的构思 ?p>

1. 选用何种单片机

在我们的这个课程中,当然是选用51系列的CPU了;

实际上,可以选用的CPU的种类很多,从处理能力来说:

1) 4位单片机

2) 8位单片机

3) 16位单片机

4) 32位ARM

就8位单片机,有专用的、通用的;也有高速的,还有的单片机具有A/D、D/A等各种资源;

需要根据你的任务,选用合适的单片机完成任务。

对初学者而言,我们考虑的仅仅是如何使用51系列的单片机,如:89C51/52/54/58、78E52/54/58、77E58(双串口)来完成设计任务。

2. 初步设计-写出任务书

1) 按照表格,对任务进行分析,判断单片机的资源是否够,如:运算速度,是否需要扩展、是否需要串口、是否需要实时时钟等;选用什么调理电路,等等;

2) 在确认单片机能够胜任工作后,对单片机的资源进行规划:

1. 内存分配

2. I/O口分配

3. 定时器分配工作

4. 外部中断分配

3) 单片机外围电路确认-开关量输入和输出调理电路(模拟量电路暂时不考虑)

4) 在以上分析的基础上,设计单片机硬件框图

5) 形成任务书初稿

6) 讨论-修改-通过

3. 详细设计

1) 原理图

2) 有3.3V和5V的混合逻辑设计吗?

3) PCB尺寸、定位孔和安装方式

1. 是正方形、长方形、圆形、三角还是其它的特殊形状?

2. 是ISA总线吗?

3. 是PCI总线吗?

4. 是欧标的板卡吗?

4) 电源(AC220V/DC5V/DC12V,是否需要隔离)

5) 接插件封装:

1. 采用直插、弯针?

2. 3.81间距、5.08还是2.54间距(对应于:150mil/200mil/100mil)

3. 采用DB9/DB25/DB37/DB62?直的还是弯的?孔的还是针的

4. 有边缘器件吗?

6) 基本布局

是否合理?考虑到散热了吗?考虑到机箱内是否有打架的地方?

7) 器件选型

尽量选用著名品牌中的价格便宜的兼容器件;

8) 器件的冗余度

需要考虑到功耗、耐压值和接口器件的可靠性;

例如:

1. 功耗,需要计算电阻、变压器的功耗,适当留有50%以上的余量;

2. 电解电容的耐压值等:留有100%以上的余量,如:在DC5V电压下,选用耐压值25V的电容;

3. 接口器件:对于接口器件,尽量使用DIP封装的,便于更换;

9) 成本分析(包括制版费、器件费和焊接、调试费用),作出预算,尽量降低成本,选用功能满足价格便宜的器件,不同厂家之间的同样的芯片价格相差比较远

10) 电路板与机箱之间的安装关系

11) 形成详细设计初稿

12) 讨论-修改-通过

4. 在大脑中模拟电路板的外形、几何尺寸和功能

就好像是三维动画一样,电子工程师需要在大脑中,在设计的整个过程中,对电路板的外形、接口、几何尺寸、功能等反复在从各个角度去观察、构思,就好像有一个实际的电路板在脑子里一样,谋定而后动;当然,这不是一蹴而就的。

附:电子工程师培训大纲(200403110041)
愚以为,掌握了一下的硬件和软件知识,基本上就可以成为一个合格的电子工程师:

第一部分:硬件知识

一、 数字信号
1、 TTL和带缓冲的TTL信号
2、 RS232和定义
3、 RS485/422(平衡信号)
4、 干接点信号
二、 模拟信号视频
1、 非平衡信号
2、 平衡信号
三、 芯片
1、 封装
2、 7407
3、 7404
4、 7400
5、 74LS573
6、 ULN2003
7、 74LS244
8、 74LS240
9、 74LS245
10、 74LS138/238
11、 CPLD(EPM7128)
12、 1161
13、 max691
14、 max485/75176
15、 mc1489
16、 mc1488
17、 ICL232/max232
18、 89C51
四、 分立器件
1、 封装
2、 电阻:功耗和容值
3、 电容
1) 独石电容
2) 瓷片电容
3) 电解电容
4、 电感
5、 电源转换模块
6、 接线端子
7、 LED发光管
8、 8字(共阳和共阴)
9、 三极管2N5551
10、 蜂鸣器
五、 单片机最小系统
1、 单片机
2、 看门狗和上电复位电路
3、 晶振和瓷片电容
六、 串行接口芯片
1、 eeprom
2、 串行I/O接口芯片
3、 串行AD、DA
4、 串行LED驱动、max7129
七、 电源设计
1、 开关电源:器件的选择
2、 线性电源:
1) 变压器
2) 桥
3) 电解电容
3、 电源的保护
1) 桥的保护
2) 单二极管保护
八、 维修
1、 电源
2、 看门狗
3、 信号
九、 设计思路
1、 电源:电压和电流
2、 接口:串口、开关量输入、开关量输出
3、 开关量信号输出调理
1) TTL―>继电器
2) TTL―>继电器(反向逻辑)
3) TTL―>固态继电器
4) TTL―>LED(8字)
5) 继电器―>继电器
6) 继电器―>固态继电器
4、 开关量信号输入调理
1) 干接点―>光耦
2) TTL―>光耦
5、 CPU处理能力的考虑
6、 成为产品的考虑:
1) 电路板外形:大小尺寸、异形、连接器、空间体积
2) 电路板模块化设计
3) 成本分析
4) 器件的冗余度
1. 电阻的功耗
2. 电容的耐压值等
5) 机箱
6) 电源的选择
7) 模块化设计
8) 成本核算
1. 如何计算电路板的成本?
2. 如何降低成本?选用功能满足价格便宜的器件
十、 思考题
1、 如何检测和指示RS422信号
2、 如何检测和指示RS232信号
3、 设计一个4位8字的显示板
1) 电源:DC12
2) 接口:RS232
3) 4位3”8字(连在一起)
4) 亮度检测
5) 二级调光
4、 设计一个33位1”8字的显示板
1) 电源:DC5V
2) 接口:RS232
3) 3排 11位8字,分4个、3个、4个3组,带行与行之间带间隔
4) 单片机最小系统
5) 译码逻辑
6) 显示驱动和驱动器件
5、 设计一个PCL725和MOXA C168P的接口板
1) 电源:DC5V
2) 接口:PCL725/MOXA 8个RS232
1. PCL725,直立DB37,孔
2. MOXA C168P,DB62弯
3) 开关量输出信号调理:6个固态继电器和8个继电器,可以被任何一路信号控制和驱动,接口:固态继电器5.08直立,继电器3.81直立
4) 开关量输入调理:干接点闭合为1或0可选,接口:3.81直立
5) RS232调理:
1. LED指示
2. 前4路RS232全信号,后4路只需要TX、RX、0
3. 无需光电隔离
4. 接口形式:DB9(针)直立

第二部分:软件知识

一、 汇编语言
二、 C51
该部分可以从市场上买到的N种开发板上学到,至于第一部分,需要人来带吧

单片机的外部结构:
1、 DIP40双列直插;
2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
3、 电源VCC(PIN40)和地线GND(PIN20);
4、 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
5、 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
6、 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
7、 P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1

单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)
1、 四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
2、 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
3、 一个串行通信接口;(SCON,SBUF)
4、 一个中断控制器;(IE,IP)

针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。

C语言编程基础:
1、 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
2、 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
3、 ++var表示对变量var先增一;var—表示对变量后减一。
4、 x |= 0x0f;表示为 x = x | 0x0f;
5、 TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
6、 While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}

在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3
void main( void )   //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_3 = 1;    //给P1_3赋值1,引脚P1.3就能输出高电平VCC
While( 1 );   //死循环,相当 LOOP: goto LOOP;
}
注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:(比如P2.7引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7
void main( void )   //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P2_7 = 0;    //给P2_7赋值0,引脚P2.7就能输出低电平GND
While( 1 );   //死循环,相当 LOOP: goto LOOP;
}

在某引脚输出方波编程方法:(比如P3.1引脚)
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1
void main( void )   //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
While( 1 )   //非零表示真,如果为真则执行下面循环体的语句
{
P3_1 = 1;   //给P3_1赋值1,引脚P3.1就能输出高电平VCC
   P3_1 = 0;   //给P3_1赋值0,引脚P3.1就能输出低电平GND
}     //由于一直为真,所以不断输出高、低、高、低……,从而形成方波
}

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1
void main( void )   //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_1 = 1;    //初始化。P1.1作为输入,必须输出高电平
While( 1 )   //非零表示真,如果为真则执行下面循环体的语句
{
if( P1_1 == 1 )   //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC
   { P0_4 = 0;   } //给P0_4赋值0,引脚P0.4就能输出低电平GND
   else      //否则P1.1输入为低电平GND
   //{ P0_4 = 0;   } //给P0_4赋值0,引脚P0.4就能输出低电平GND
   { P0_4 = 1;   } //给P0_4赋值1,引脚P0.4就能输出高电平VCC
}     //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平
}

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )
#i nclude <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3
void main( void )   //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P3 = 0xff;   //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平
While( 1 )   //非零表示真,如果为真则执行下面循环体的语句
{     //取反的方法是异或1,而不取反的方法则是异或0
P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出
}     //由于一直为真,所以不断将P3取反输出到P2
}
注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。


第一节:单数码管按键显示
单片机最小系统的硬件原理接线图:
1、 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF
2、 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF
3、 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理
4、 接配置:EA(PIN31)。说明原因。

发光二极的控控制:单片机I/O输出
将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。

开关双键的输入:输入先输出高
一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。
#i nclude <at89x52.h>
#define LED   P1^1    //用符号LED代替P1_1
#define KEY_ON P1^6    //用符号KEY_ON代替P1_6
#define KEY_OFF P1^7    //用符号KEY_OFF代替P1_7
void main( void )     //单片机复位后的执行入口,void表示空,无输入参数,无返回值
{
KEY_ON = 1;   //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1
KEY_OFF = 1;   //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1
While( 1 )   //永远为真,所以永远循环执行如下括号内所有语句
{
   if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮
   if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭
} //松开键后,都不给LED赋值,所以LED保持最后按键状态。
//同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态
}

数码管的接法和驱动原理
一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。
我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。
如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。
以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据如右图:

16键码显示的程序
我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。
#i nclude <at89x52.h>
#define SLED P1
#define KEY_0 P2^0
#define KEY_1 P2^1
#define KEY_2 P2^2
#define KEY_3 P2^3
#define KEY_4 P2^4
#define KEY_5 P2^5
#define KEY_6 P2^6
#define KEY_7 P2^7
#define KEY_8 P3^0
#define KEY_9 P3^1
#define KEY_A P3^2
#define KEY_B P3^3
#define KEY_C P3^4
#define KEY_D P3^5
#define KEY_E P3^6
#define KEY_F P3^7
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
// 0      1     2      3      4     5      6      7      8      9     A      b      C      d     E     F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void main( void )
{
unsigned char i=0; //作为数组下标
P2 = 0xff; //P2作为输入,初始化输出高
P3 = 0xff; //P3作为输入,初始化输出高
While( 1 )
{
   if( KEY_0 == 0 ) i=0;   if( KEY_1 == 0 ) i=1;
   if( KEY_2 == 0 ) i=2;   if( KEY_3 == 0 ) i=3;
   if( KEY_4 == 0 ) i=4;   if( KEY_5 == 0 ) i=5;
   if( KEY_6 == 0 ) i=6;   if( KEY_7 == 0 ) i=7;
   if( KEY_8 == 0 ) i=8;   if( KEY_9 == 0 ) i=9;
   if( KEY_A == 0 ) i=0xA;   if( KEY_B == 0 ) i=0xB;
   if( KEY_C == 0 ) i=0xC;   if( KEY_D == 0 ) i=0xD;
   if( KEY_E == 0 ) i=0xE;   if( KEY_F == 0 ) i=0xF;
   SLED = Seg7Code[ i ]; //开始时显示0,根据i取应七段编码
}
}
第二节:双数码管可调秒表
解:只要满足题目要求,方法越简单越好。由于单片机I/O资源足够,所以双数码管可接成静态显示方式,两个共阴数码管分别接在P1(秒十位)和P2(秒个位)口,它们的共阴极都接地,安排两个按键接在P3.2(十位数调整)和P3.3(个位数调整)上,为了方便计时,选用12MHz的晶体。为了达到精确计时,选用定时器方式2,每计数250重载一次,即250us,定义一整数变量计数重载次数,这样计数4000次即为一秒。定义两个字节变量S10和S1分别计算秒十位和秒个位。编得如下程序:
#i nclude <at89x52.h>
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
// 0      1     2      3      4     5      6      7      8      9     A      b      C      d     E     F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void main( void )
{
unsigned int us250 = 0;
unsigned char s10 = 0;
unsigned char s1 = 0;
unsigned char key10 = 0; //记忆按键状态,为1按下
unsigned char key1 = 0;   //记忆按键状态,为1按下
//初始化定时器 Timer0
TMOD = (TMOD & 0xF0) | 0x02;
TH1 = -250; //对于8位二进数来说,-250=6,也就是加250次1时为256,即为0
TR1 = 1;
while(1){            //----------循环1
   P1 = Seg7Code[ s10 ]; //显示秒十位
   P2 = Seg7Code[ s1 ]; //显示秒个位
   while( 1 ){          //----------循环2
    //计时处理
if( TF0 == 1 ){
     TF0 = 0;
     if( ++us250 >= 4000 ){
      us250 = 0;
      if( ++s1 >= 10 ){
       s1 = 0;
       if( ++s10 >= 6 ) s10 = 0;
      }
      break; //结束“循环2”,修改显示
     }
    }
    //按十位键处理
    P3.2 = 1;   //P3.2作为输入,先要输出高电平
    if( key10 == 1 ){ //等松键
if( P3.2 == 1 ) key10=0;
    }
else{    //未按键
     if( P3.2 == 0 ){
      key10 = 1;
if( ++s10 >= 6 ) s10 = 0;
      break; //结束“循环2”,修改显示
     }
    }
    //按个位键处理
    P3.3 = 1;   //P3.3作为输入,先要输出高电平
    if( key1 == 1 ) //等松键
{ if( P3.3 == 1 ) key1=0; }
    else {    //未按键
     if( P3.3 == 0 ){ key1 = 1;
if( ++s1 >= 10 ) s1 = 0;
      break; //结束“循环2”,修改显示
     }
    }
   } //循环2’end
   }//循环1’end
}//main’end
    
第三节:十字路***通灯
如果一个单位时间为1秒,这里设定的十字路***通灯按如下方式四个步骤循环工作:
? 60个单位时间,南北红,东西绿;
? 10个单位时间,南北红,东西黄;
? 60个单位时间,南北绿,东西红;
? 10个单位时间,南北黄,东西红;
解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。
#i nclude <at89x52.h>
//sbit用来定义一个符号位地址,方便编程,提高可读性,和可移植性
sbit SNRed =P1^0;   //南北方向红灯
sbit SNYellow =P1^1;   //南北方向黄灯
sbit SNGreen =P1^2;   //南北方向绿灯
sbit EWRed =P1^3;   //东西方向红灯
sbit EWYellow =P1^4;   //东西方向黄灯
sbit EWGreen =P1^5;   //东西方向绿灯
/* 用软件产生延时一个单位时间 */
void Delay1Unit( void )   
{
unsigned int i, j;
for( i=0; i<1000; i++ )
   for( j<0; j<1000; j++ ); //通过实测,调整j循环次数,产生1ms延时
//还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms
}
/* 延时n个单位时间 */
void Delay( unsigned int n ){ for( ; n!=0; n-- ) Delay1Unit(); }
void main( void )
{
while( 1 )
{
   SNRed=0; SNYellow=0; SNGreen=1; EWRed=1; EWYellow=0; EWGreen=0; Delay( 60 );
   SNRed=0; SNYellow=1; SNGreen=0; EWRed=1; EWYellow=0; EWGreen=0; Delay( 10 );
   SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=0; EWGreen=1; Delay( 60 );
   SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=1; EWGreen=0; Delay( 10 );
}
}

第四节:数码管驱动
显示“12345678”
P1端口接8联共阴数码管SLED8的段极:P1.7接段h,…,P1.0接段a
P2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极,…,P2.0接右边的共阴极
方案说明:晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时断服务程序中实现
#i nclude <at89x92.h>
unsigned char DisBuf[8];   //全局显示缓冲区,DisBuf[0]对应右SLED,DisBuf[7]对应左SLED,
void DisplayBrush( void )
{ code unsigned char cathode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //阴极控制码
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
static unsigned char i=0; // (0≤i≤7) 循环刷新显示,由于是静态变量,此赋值只做一次。
P2 = 0xff;   //显示消隐,以免下一段码值显示在前一支SLED
P1 = Seg7Code[ DisBuf[i] ]; //从显示缓冲区取出原始数据,查表变为七段码后送出显示
P2 = cathode[ i ];    //将对应阴极置低,显示
if( ++i >= 8 ) i=0;   //指向下一个数码管和相应数据
}
void Timer0IntRoute( void ) interrupt 1
{
TL0 = -1000;   //由于TL0只有8bits,所以将(-1000)低8位赋给TL0
TH0 = (-1000)>>8; //取(-1000)的高8位赋给TH0,重新定时1ms
DisplayBrush();
}
void Timer0Init( void )
{ TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1
TL0 = -1000; //定时1ms
TH0 = (-1000)>>8;
TR0 = 1;    //允许T0开始计数
ET0 = 1;    //允许T0计数溢出时产生中断请求
}
void Display( unsigned char index, unsigned char dataValue ){ DisBuf[ index ] = dataValue; }
void main( void )
{
unsigned char i;
for( i=0; i<8; i++ ){ Display(i, 8-i); } //DisBuf[0]为右,DisBuf[7]为左
Timer0Init();
EA = 1;    //允许CPU响应中断请求
While(1);
}
第五节:键盘驱动
指提供一些函数给任务调用,获取按键信息,或读取按键值。
定义一个头文档 <KEY.H>,描述可用函数,如下:
#ifndef _KEY_H_   //防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句
#define _KEY_H_   //只要引用过一次,即 #i nclude <key.h>,则定义符号 _KEY_H_
unsigned char keyHit( void ); //如果按键,则返回非0,否则返回0
unsigned char keyGet( void ); //读取按键值,如果没有按键则等待到按键为止
void keyPut( unsigned char ucKeyVal ); //保存按键值ucKeyVal到按键缓冲队列末
void keyBack( unsigned char ucKeyVal ); //退回键值ucKeyVal到按键缓冲队列首
#endif

定义函数体文档 KEY.C,如下:
#include “key.h”
#define KeyBufSize 16 //定义按键缓冲队列字节数
unsigned char KeyBuf[ KeyBufSize ]; //定义一个无符号字符数组作为按键缓冲队列。该队列为先进
         //先出,循环存取,下标从0到 KeyBufSize-1
unsigned char KeyBufWp=0; //作为数组下标变量,记录存入位置
unsigned char KeyBufRp=0; //作为数组下标变量,记录读出位置
//如果存入位置与读出位置相同,则表明队列中无按键数据
unsigned char keyHit( void )
{ if( KeyBufWp == KeyBufRp ) return( 0 ); else return( 1 ); }

unsigned char keyGet( void )
{ unsigned char retVal; //暂存读出键值
while( keyHit()==0 ); //等待按键,因为函数keyHit()的返回值为 0 表示无按键
retVal = KeyBuf[ KeyBufRp ]; //从数组中读出键值
if( ++KeyBufRp >= KeyBufSize ) KeyBufRp=0; //读位置加1,超出队列则循环回初始位置
return( retVal );
}

void keyPut( unsigned char ucKeyVal )
{ KeyBuf[ KeyBufWp ] = ucKeyVal; //键值存入数组
if( ++KeyBufWp >= KeyBufSize ) KeyBufWp=0;   //存入位置加1,超出队列则循环回初始位置
}
/*****************************************************************************************
由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样
******************************************************************************************/
void keyBack( unsigned char ucKeyVal )
{
/*
如果KeyBufRp=0; 减1后则为FFH,大于KeyBufSize,即从数组头退回到数组尾。或者由于干扰使得KeyBufRp超出队列位置,也要调整回到正常位置,
*/
if( --KeyBufRp >= KeyBufSize ) KeyBufRp=KeyBufSize-1;
KeyBuf[ KeyBufRp ] = ucKeyVal; //回存键值
}
下面渐进讲解键盘物理层的驱动。
电路共同点:P2端口接一共阴数码管,共阴极接GND,P2.0接a段、P2.1接b段、…、P2.7接h段。
软件共同点:code unsigned char Seg7Code[10] 是七段数码管共阴编码表。
Code unsigned char Seg7Code[16]=
// 0      1     2      3      4     5      6      7      8      9     A      b      C      d     E     F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

例一:P1.0接一按键到GND,键编号为‘6’,显示按键。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;   //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
{ if( P1_0 == 0 ) //如果按键,则为低电平
{ keyPut( 6 ); //保存按键编号值为按键队列
while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
   }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
}
}

来源:嵌入式在线社区

在某引脚输出方波编程方法:(比如P3.1引脚)
#include //该头文档中有单片机内部资源的符号化定义,其中包含P3.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC
P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND
} //由于一直为真,所以不断输出高、低、高、低……,从而形成方波
}
  将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )
#include //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC
{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
else //否则P1.1输入为低电平GND
//{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
{ P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC
} //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平
}

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )
#include //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{ //取反的方法是异或1,而不取反的方法则是异或0
P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出
} //由于一直为真,所以不断将P3取反输出到P2
}
  注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。
1、 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF
2、 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF
3、 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理
4、 接配置:EA(PIN31)。说明原因。

多余的引脚 如单片机不用IO口

输入口不要悬空,尤其是输入阻抗高的,更不能悬空。例如在CMOS电路中,如果输入口悬空,可能会导致输入电平处于非0和非1的中间状态,这将会使输出级的上下两个推动管同时导通,从而产生很大电流。一般的做法是通过一个电阻(例如10K或者1K)上拉到高电平或者下拉到低电平。而对于不用的运放,则可以将输出端直接接回反向输入端,并把同向输入端接至参考电平点(一般单电源使用时(或者干脆将双电源看成一个单电源),用1/2Vcc作为参考电平,因此有些资料上也会写连接至half supply)。   输出口则可以悬空。对于IO口,一般是将其设置为输入口,并像上面的输入口那样处理。如果是IO口内带上拉电阻的,则可使用内部上拉电阻使其电位固定。不设置成输出口,是为了防止误操作时,损坏IO口

P0口上拉电阻选择

如果是驱动led,那么用1K左右的就行了。如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大;如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超过3K以上时,亮度就很弱了,但是对于超高亮度的LED,有时候电阻为10K时觉得亮度还能够用。我通常就用1k的。

  对于驱动光耦合器,如果是高电位有效,即耦合器输入端接端口和地之间,那么和LED的情况是一样的;如果是低电位有效,即耦合器输入端接端口和VCC之间,那么除了要串接一个1——4.7k之间的电阻以外,同时上拉电阻的阻值就可以用的特别大,用100k——500K之间的都行,当然用10K的也可以,但是考虑到省电问题,没有必要用那么小的。

  对于驱动晶体管,又分为PNP和NPN管两种情况:对于NPN,毫无疑问NPN管是高电平有效的,因此上拉电阻的阻值用2K——20K之间的,具体的大小还要看晶体管的集电极接的是什么负载,对于LED类负载,由于发管电流很小,因此上拉电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此上拉电阻的阻值最好不要大于4.7K,有时候甚至用2K的。对于PNP管,毫无疑问PNP管是低电平有效的,因此上拉电阻的阻值用100K以上的就行了,且管子的基极必须串接一个1——10K的电阻,阻值的大小要看管子集电极的负载是什么,对于LED类负载,由于发光电流很小,因此基极串接的电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此基极电阻的阻值最好不要大于4.7K。

  对于驱动TTL集成电路,上拉电阻的阻值要用1——10K之间的,有时候电阻太大的话是拉不起来的,因此用的阻值较小。但是对于CMOS集成电路上拉电阻的阻值就可以用的很大,一般不小于20K,我通常用100K的,实际上对于CMOS电路,上拉电阻的阻值用1M的也是可以的,但是要注意上拉电阻的阻值太大的时候,容易产生干扰,尤其是线路板的线条很长的时候,这种干扰更严重,这种情况下上拉电阻不宜过大,一般要小于100K,有时候甚至小于10K。

转载自:关于51单片机P0口的结构及上拉问题(转)--小米的笔记

http://blog.21ic.com/user1/5443/archives/2009/55244.html

参考资料:

http://www.dzkf.cn/html/qianrushixitong/2006/0818/351.html

51单片机I/O口使用经验

相关推荐