最新日志

发表于:2008-4-21 21:52:19
标签:PCB封装图  

1

评论(0) | 阅读(446)
发表于:2008-4-17 23:10:33
标签:电子元件  

2

最常用的电子元器件

常用元器件的识别
电阻
电阻在电路中用“R”加数字表示,如:R1表示编号为1的电阻.电阻在电路中的主要作用为
分流、限流、分压、偏置等.
1、参数识别:电阻的单位为欧姆(Ω),倍率单位有:千欧(KΩ),兆欧(MΩ)等.换算
方法是:1兆欧=1000千欧=1000000欧
电阻的参数标注方法有3种,即直标法、色标法和数标法.
a、数标法主要用于贴片等小体积的电路,如:
472 表示 47×100Ω(即4.7K); 104则表示100K
b、色环标注法使用最多,现举例如下:
四色环电阻 五色环电阻(精密电阻)
2、电阻的色标位置和倍率关系如下表所示:
颜色 有效数字 倍率 允许偏差(%)
银色 / x0.01 ±10
金色 / x0.1 ±5
黑色 0 +0 /
棕色 1 x10 ±1
红色 2 x100 ±2
橙色 3 x1000 /
黄色 4 x10000 /
绿色 5 x100000 ±0.5
蓝色 6 x1000000 ±0.2
紫色 7 x10000000 ±0.1
灰色 8 x100000000 /
白色 9 x1000000000 /
电容
1、电容在电路中一般用“C”加数字表示(如C13表示编号为13的电容).电容是由两片金属膜紧靠,中间用绝缘材料隔开而组成的元件.电容的特性 主要是隔直流通交流.电容容量的大小就是表示能贮存电能的大小,电容对交流信号的阻碍作用称为容抗,它与交流信号的频率和电容量有关.容抗XC= 1/2πf c (f表示交流信号的频率,C表示电容容量) 电话机中常用电容的种类有电解电容、瓷片电容、贴片电容、独石电容、钽电容和涤纶电容等.
2、识别方法:电容的识别方法与电阻的识别方法基本相同,分直标法、色标法和数标法3种.电容的基本单位用法拉(F)表示,其它单位还有:毫法 (mF)、微法(uF)、纳法(nF)、皮法(pF).其中:1法拉=103毫法=106微法=109纳法=1012皮法容量大的电容其容量值在电容上直 接标明,如10 uF/16V容量小的电容其容量值在电容上用字母表示或数字表示字母表示法:1m=1000 uF 1P2=1.2PF 1n=1000PF 数字表示法:一般用三位数字表示容量大小,前两位表示有效数字,第三位数字是倍率.如:102表示10×102PF=1000PF 224表示22×104PF=0.22 uF
3、电容容量误差
如:一瓷片电容为104J表示容量为0. 1 uF、误差为±5%.
晶体二极管
晶体二极管在电路中常用“D”加数字表示,如: D5表示编号为5的二极管.
1、 作用:二极管的主要特性是单向导电性,也就是在正向电压的作用下,导通电阻很小;而在反向电压作用下导通电阻极大或无穷大.正因为二极管具有上述特性,无 绳电话机中常把它用在整流、隔离、稳压、极性保护、编码控制、调频调制和静噪等电路中.电话机里使用的晶体二极管按作用可分为:整流二极管(如1N4004)、隔离二极管(如1N4148)、肖特基二极管(如BAT85)、发光二极管、稳压二极管等.
2、识别方法:二极管的识别很简单,小功率二极管的N极(负极),在二极管外表大多采用一种色圈标出来,有些二极管也用二极管专用符号来表示P极 (正极)或N极(负极),也有采用符号标志为“P”、“N”来确定二极管极性的.发光二极管的正负极可从引脚长短来识别,长脚为正,短脚为负.
3、测试注意事项:用数字式万用表去测二极管时,红表笔接二极管的正极,黑表笔接二极管的负极,此时测得的阻值才是二极管的正向导通阻值,这与指针式万用表的表笔接法刚好相反.
稳压二极管
稳压二极管在电路中常用“ZD”加数字表示,如:ZD5表示编号为5的稳压管.
1、稳压二极管的稳压原理:稳压二极管的特点就是击穿后,其两端的电压基本保持不变.这样,当把稳压管接入电路以后,若由于电源电压发生波动,或其它原因造成电路中各点电压变动时,负载两端的电压将基本保持不变.
2、故障特点:稳压二极管的故障主要表现在开路、短路和稳压值不稳定.在这3种故障中,前一种故障表现出电源电压升高;后2种故障表现为电源电压变低到零伏或输出不稳定.
常用稳压二极管的型号及稳压值如下表:
型号 1N4728 1N4729 1N4730 1N4732 1N4733 1N4734 1N4735 1N4744 1N4750 1N4751 1N4761
稳压值 3.3V 3.6V 3.9V 4.7V 5.1V 5.6V 6.2V 15V 27V 30V 75V
电感
电感在电路中常用“L”加数字表示,如:L6表示编号为6的 电感.电感线圈是将绝缘的导线在绝缘的骨架上绕一定的圈数制成.直流可通过线圈,直流电阻就是导线本身的电阻,压降很小;当交流信号通过线圈时,线圈两端 将会产生自感电动势,自感电动势的方向与外加电压的方向相反,阻碍交流的通过,所以电感的特性是通直流阻交流,频率越高,线圈阻抗越大.电感在电路中可与 电容组成振荡电路.
电感一般有直标法和色标法,色标法与电阻类似.如:棕、黑、金、金表示1uH(误差5%)的电感.
电感的基本单位为:亨(H) 换算单位有:1H=103mH=106uH.
变容二极管
变容二极管是根据普通二极管内部 “PN结” 的结电容能随外加反向电压的变化而变化这一
原理专门设计出来的一种特殊二极管.
变容二极管在无绳电话机中主要用在手机或座机的高频调制电路上,实现低频信号调制到高
频信号上,并发射出去.在工作状态,变容二极管调制电压一般加到负极上,使变容二极管
的内部结电容容量随调制电压的变化而变化.
变容二极管发生故障,主要表现为漏电或性能变差:
(1)发生漏电现象时,高频调制电路将不工作或调制性能变差.
(2)变容性能变差时,高频调制电路的工作不稳定,使调制后的高频信号发送到对方被对
方接收后产生失真.
出现上述情况之一时,就应该更换同型号的变容二极管.

晶体三极管

晶体三极管在电路中常用“Q”加数字表示,如:Q17表示编号为17的三极管.
1、特点:晶体三极管(简称三极管)是内部含有2个PN结,并且具有放大能力的特殊器件.它分NPN型和PNP型两种类型,这两种类型的三极管从工 作特性上可互相弥补,所谓OTL电路中的对管就是由PNP型和NPN型配对使用.电话机中常用的PNP型三极管有:A92、9012、9015等型号; NPN型三极管有:A42、9014、9018、9013等型号.
2、晶体三极管主要用于放大电路中起放大作用,在常见电路中有三种接法.为了便于比较,将晶体管三种接法电路所具有的特点列于下表,供大家参考.
名称                           输入阻抗                 输出阻抗                 电压放大倍数           电流放大倍数
共发射极电路                    中(几百欧~几千欧) 中(几千欧~几十千欧)      大                    大(几十)
共集电极电路(射极输出器)      大(几十千欧以上)     小(几欧~几十欧)         小(小于1并接近于1)大(几十)
共基极电路                      小(几欧~几十欧)     大(几十千欧~几百千欧)    大          小(小于1并接近于1)

                        功率放大倍数             频率特性       应用
                        大(约30~40分贝)        高频差        多级放大器中间级,低频放大
                        小(约10分贝)             好            输入级、输出级或作阻抗匹配用
                        中(约15~20分贝)         好           高频或宽频带电路及恒流源电路

场效应晶体管放大器
1、场效应晶体管具有较高输入阻抗和低噪声等优点,因而也被广泛应用于各种电子设备中.尤其用场效管做整个电子设备的输入级,可以获得一般晶体管很难达到的性能.
2、场效应管分成结型和绝缘栅型两大类,其控制原理都是一样的.如图1-1-1是两种型号的表示符号:
3、场效应管与晶体管的比较:
(1)场效应管是电压控制元件,而晶体管是电流控制元件.在只允许从信号源取较少电流的情况下,应选用场效应管;而在信号电压较低,又允许从信号源取较多电流的条件下,应选用晶体管.
(2)场效应管是利用多数载流子导电,所以称之为单极型器件,而晶体管是即有多数载流子,也利用少数载流子导电.被称之为双极型器件.
(3)有些场效应管的源极和漏极可以互换使用,栅压也可正可负,灵活性比晶体管好.
(4)场效应管能在很小电流和很低电压的条件下工作,而且它的制造工艺可以很方便地把很多场效应管集成在一块硅片上,因此场效应管在大规模集成电路中得到了广泛的应用.


最常用的电子元件型号
整流二极管:
1N4001~1N4007 50V~1000~/1.0A 1N5391~1N5399 50V~1000V/1.5A    1N5400~1N5408    50V~1000V/3.0A  
开关二极管:
1N4148    1N4150    1N4448
肖特基二极管:
1N5817~1N5819    20V~40V/1.0A 1N5820~1N5822     20V~40V/3.0A    1N60    1N60P小电流低压降
光电耦合器:
4N35    4N36    4N37
晶体三极管:
PNP:8050 9015 A92  
NPN:9012    9013     9014      9015      9018

D/A转换器:
AD7520     AD7521     AF7530     AD7521

8位:DAC0830     DAC0832 (D/A )12位:AD7541     (D/A)
8位:ADC0802     ADC0803    ADC0804    ADC0831    ADC0832     ADC0834     ADC0838(A/D)
跨导运算变压器:
CA3080    CA3080A     OTA
BiMOS运算变压器:
CA3140     CA3140A
DB3     双向触发二极管

快恢复二极管:
FR101~FR107    50V~1000/1.0A
三位半A/D转换器:
ICL7106     ICL7107    ICL7116     ICL7117
载波稳零运算放大器:
ICL7650
CMOS电源电压变换器:
ICL7660/MAX1044
单片函数发生器:
ICL8038
通用计数器:
ICM7216     ICM7216B      ICM7216D     10MHz
带BCD输出10MZ通用计数器:
ICM7226A     ICM7226B
单/双通用定时器:
ICM7555     ICM7555
DTMF 收发器:
ISO2-CMOS MT8880C
JFET输入运算放大器:
LF351
FJET输入宽带高速双运算放大器:
LF353
三端可调电源:
LM117    LM317A    LM317
低功耗四运算放大器:
LM124     LM124    LM324    LM2920
三端可调负电压调整器:
LM137     LM337
低功耗四电压比较器:
LM139    LM239    LM339    LM2901    LM3302
可关断开关电源:
LM1575-3.3、LM2575-3.3、LM2575HV-3.3、LM1575- 5.0、LM2575-5.0、LM2575HV-5.0、LM1575-12、LM2575-12、 LM2575HV-12、LM1575-15, LM2575-15、LM2575HV-15、LM1575- ADJ、LM2575-ADJ    LM2576-3.3、LM2576HV-3.3、LM2576-5.0、LM2576HV- 5.0、LM2576-12、LM2576HV-12、LM2576-15、LM2576HV-15、 LM2576-ADJ  
低功耗双运算放大器:
LM158    LM258    LM358    LM2904
低功耗双电压比较器:
LM193    LM293    LM393     LM2903
通用运算放大器:
LM201    LM301 LM741
精密电压 频率转换器:
LM231A     LM231     LM331A     LM331
  
微功耗基准电压二极管:
LM285    LM358
精密运算放大器:
LM308A
低压音频小功率放大器:
LM386
带温度稳定器精密电压基准电路:
LM299    LM399    LM3999
可调电压基准电路:
LM431
锁相环音频译码器:
LM657    LM657C

双低噪声音频功率放大器:
LM831     LM833
双定时LED电子钟电路:
LM8365
单片函数发生器;
MAX038    0.1~20MZ
5V电源多通道RS232驱动器/接收器:
MAX232
七路达林顿驱动器:
MC1413     MC1416
编码器/译码器:
MC145026     MC145027     MC145028
MC145023-5/8 RS232驱动器:
MC145403     MC145404     MC145405     MC145408
RS232驱动器/接收器:
MC145406 MC145407
四施密特可控线路驱动器:
MC1489    MC1489A    SN55189    SN55189A    SN75189    SN75189A
低功率调频发射系统:
MC2833
低功率调频窄频带接收器:
MC3362
双运算放大器:
MC4558
MC7800系列 1.0A三端正电压稳压器:
MC7805(5.0V)、LM340-5(5.0V)、MC7806(6.0V)、MC7808 (8.0V)、MC7809(9.0V)、MC7812(12V)、LM340-12(12V)、 MC7815(15V)、LM340-15(15V)、MC7818(18V)、MC7824 (24V)
MC78L00系列    0.5A三端正电压稳压器:
MC78M05(5.0V)、MC78M06(6.0V)、MC78M08(8.0V)、MC78M09 (9.0V)、MC78M12(12V)、MC78M15(15V)、MC78M18(18V)、 MC78M20(20V)、MC78M24(24V)
MC78T00系列 3.0A正电压稳压器:
MC78T05(5.0V)、MC78T08(8.0V)、MC78T12(12V)、MC78T15 (15V)
MC7900系列 1.0三端负电压稳压器:
MC7905(5.0V)、MC7905.2(5.2V)、MC7906(6.0V)、MC7908 (8.0V)、MC7912(12V)、MC7915(15V)、MC7918(18V)、 MC7924(24V)
MC79L00系列 0.1A 三端负电压稳压器:
MC79L05(5.0V)、MC79L12(12V)、MC79L15(15V)、MC79L18 (18V)、MC79L24(24V)
MC79M00系列 0.5A 三端负电压稳压器:
MC79M05(5.0V)、MC79M08(8.0V)、MC79M12(12V)、MC79M15 (15V)
Microchip PIC 系列单片机RS232通讯应用:
3.579545MHZ--60HZ 17级分频振荡器:
MM5369
双向可控硅输出光电耦合器:
MOC3009    MOC3012    (250V)      MOC3020     MOC3023    (400V)
DTMF双音频接收器:
MT8870C     MT8870C-1
DTMF 收发器:
MT8888C
单时基电路:
NE555     NE555Y     SA555     SE555
双时基电路:
NE556    SA556    SE556
音频压缩扩展器:
NE570     NE571     SA571
低电压飘移运算放大器:
OP07 OP77
低噪音精密运算放大器:
OP27
低噪音高精密运算放大器:
OP37

精密低电压微功耗运算放大器:
OP90
高效光电耦合器:
PC817    PC827     PC837    PC847
无线遥控发射编码器芯片:
PT2262
无线遥控接收解码器芯片:
PT2272
脉宽市制PWM:
SG2524    SG3524
电力线调制解诘器电路:
ST7537
音频功率放大器:
TDA1521/TDA1521Q 2×12W Hi-Fi
TDA2030 14W Hi-fi
TDA2616/TDA2616Q 2×12W Hi-Fi
FM    单片调频接收电路:
TDA7000T    TDA7010T
FM MTS 单片调节器频接收电路:
TDA7021T
低电压锁相环立体解码器:
TDA7040T
低电压单/双声道功率放大器:
TDA7050
低功耗JFET输入运算放大器:
TL062     TL064
低噪声JFET输入运算放大器:
TL071     TL072     TL074
JFET输入宽带高速运算放大器:
TL081    TL082     TL084
脉宽调制PWM:
TL494
精密开关模式脉宽调制控制:
TL594
光电耦合器:
TLP521-1/TLP521-2/TLP521-4
PWM Switch:
TOP100/TOP101/TOP102/TOP103/TOP104     TOP200/TOP201/TOP202/TOP203/TOP204/TOP214     TOP209/TOP210
线性八外围驱动器阵列:
ULN2803     ULN2804
(八路NPN达林顿连接晶体管阵系列特别适用于低逻辑电平数字电路(诸如TTL, CMOS或PMOS/NMOS)和较高的电流/电压要求之间的接口,广泛应用于计算机,工业用和消费类产品中的灯、继电器、打印锤或其它类似负载中.所有器件具有集电极开路输出和续流箝位二极管,用于抑制跃变.ULN2803的设计与标准TTL系列兼容,而ULN2804 最适于6至15伏高电平CMOS或PMOS.

点击此处查看原文 >>

系统分类: 模拟技术   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(684)
发表于:2008-4-17 23:00:05
标签:二极管  特性  

2

二级管的分类及特性

二级管的分类及特性
一、根据构造分类
  半导体二极管主要是依靠PN结而工作的.与PN结不可分割的点接触型和肖特基型,也被列入一般的二极管的范围内.包括这两种型号在内,根据PN结构造面的特点,把晶体二极管分类如下:
    1、点接触型二极管
  点接触型二极管是在锗或硅材料的单晶片上压触一根金属针后,再通过电流法而形成的.因此,其PN结的静电容量小,适用于高频电路.但是,与面结型相比较,点接触型二极管正向特性和反向特性都差,因此,不能使用于大电流和整流.因为构造简单,所以价格便宜.对于小信号的检波、整流、调制、混频和限幅等一般用途而言,它是应用范围较广的类型.
2、键型二极管
  键型二极管是在锗或硅的单晶片上熔接或银的细丝而形成的.其特性介于点接触型二极管和合金型二极管之间.与点接触型相比较,虽然键型二极管的PN结电容量稍有增加,但正向特性特别优良.多作开关用,有时也被应用于检波和电源整流(不大于50mA).在键型二极管中,熔接金丝的二极管有时被称金键型,熔接银丝的二极管有时被称为银键型.
3、合金型二极管
  在N型锗或硅的单晶片上,通过合金铟、铝等金属的方法制作PN结而形成的.正向电压降小,适于大电流整流.因其PN结反向时静电容量大,所以不适于高频检波和高频整流.
4、扩散型二极管
  在高温的P型杂质气体中,加热N型锗或硅的单晶片,使单晶片表面的一部变成P型,以此法PN结.因PN结正向电压降小,适用于大电流整流.最近,使用大电流整流器的主流已由硅合金型转移到硅扩散型.
5、台面型二极管
  PN结的制作方法虽然与扩散型相同,但是,只保留PN结及其必要的部分,把不必要的部分用药品腐蚀掉.其剩余的部分便呈现出台面形,因而得名.初期生产的台面型,是对半导体材料使用扩散法而制成的.因此,又把这种台面型称为扩散台面型.对于这一类型来说,似乎大电流整流用的产品型号很少,而小电流开关用的产品型号却很多.
6、平面型二极管
  在半导体单晶片(主要地是N型硅单晶片)上,扩散P型杂质,利用硅片表面氧化膜的屏蔽作用,在N型硅单晶片上仅选择性地扩散一部分而形成的PN结.因此,不需要为调整PN结面积的药品腐蚀作用.由于半导体表面被制作得平整,故而得名.并且,PN结合的表面,因被氧化膜覆盖,所以公认为是稳定性好和寿命长的类型.最初,对于被使用的半导体材料是采用外延法形成的,故又把平面型称为外延平面型.对平面型二极管而言,似乎使用于大电流整流用的型号很少,而作小电流开关用的型号则很多.
7、合金扩散型二极管
  它是合金型的一种.合金材料是容易被扩散的材料.把难以制作的材料通过巧妙地掺配杂质,就能与合金一起过扩散,以便在已经形成的PN结中获得杂质的恰当的浓度分布.此法适用于制造高灵敏度的变容二极管.
    8、外延型二极管
  用外延面长的过程制造PN结而形成的二极管.制造时需要非常高超的技术.因能随意地控制杂质的不同浓度的分布,故适宜于制造高灵敏度的变容二极管.
9、肖特基二极管
  基本原理是:在金属(例如铅)和半导体(N型硅片)的接触面上,用已形成的肖特基来阻挡反向电压.肖特基与PN结的整流作用原理有根本性的差异.其耐压程度只有40V左右.其特长是:开关速度非常快:反向恢复时间trr特别地短.因此,能制作开关二极和低压大电流整流二极管.
二、根据用途分类
1、检波用二极管
  就原理而言,从输入信号中取出调制信号是检波,以整流电流的大小(100mA)作为界线通常把输出电流小于100mA的叫检波.锗材料点接触型、工作频率可达400MHz,正向压降小,结电容小,检波效率高,频率特性好,为2AP型.类似点触型那样检波用的二极管,除用于检波外,还能够用于限幅、削波、调制、混频、开关等电路.也有为调频检波专用的特性一致性好的两只二极管组合件.
2、整流用二极管
  就原理而言,从输入交流中得到输出的直流是整流.以整流电流的大小(100mA)作为界线通常把输出电流大于100mA的叫整流.面结型,工作频率小于KHz,最高反向电压从25伏至3000伏分A~X共22档.分类如下:①硅半导体整流二极管2CZ型、②硅桥式整流器QL型、③用于电视机高压硅堆工作频率近100KHz的2CLG型.
3、限幅用二极管
  大多数二极管能作为限幅使用.也有象保护仪表用和高频齐纳管那样的专用限幅二极管.为了使这些二极管具有特别强的限制尖锐振幅的作用,通常使用硅材料制造的二极管.也有这样的组件出售:依据限制电压需要,把若干个必要的整流二极管串联起来形成一个整体.
4、调制用二极管
  通常指的是环形调制专用的二极管.就是正向特性一致性好的四个二极管的组合件.即使其它变容二极管也有调制用途,但它们通常是直接作为调频用.
5、混频用二极管
  使用二极管混频方式时,在500~10,000Hz的频率范围内,多采用肖特基型和点接触型二极管.
6、放大用二极管
  用二极管放大,大致有依靠隧道二极管和体效应二极管那样的负阻性器件的放大,以及用变容二极管的参量放大.因此,放大用二极管通常是指隧道二极管、体效应二极管和变容二极管.
7、开关用二极管
  有在小电流下(10mA程度)使用的逻辑运算和在数百毫安下使用的磁芯激励用开关二极管.小电流的开关二极管通常有点接触型和键型等二极管,也有在高温下还可能工作的硅扩散型、台面型和平面型二极管.开关二极管的特长是开关速度快.而肖特基型二极管的开关时间特短,因而是理想的开关二极管.2AK型点接触为中速开关电路用;2CK型平面接触为高速开关电路用;用于开关、限幅、钳位或检波等电路;肖特基(SBD)硅大电流开关,正向压降小,速度快、效率高.
8、变容二极管
     用于自动频率控制(AFC)和调谐用的小功率二极管称变容二极管.日本厂商方面也有其它许多叫法.通过施加反向电压, 使其PN结的静电容量发生变化.因此,被使用于自动频率控制、扫描振荡、调频和调谐等用途.通常,虽然是采用硅的扩散型二极管,但是也可采用合金扩散型、外延结合型、双重扩散型等特殊制作的二极管,因为这些二极管对于电压而言,其静电容量的变化率特别大.结电容随反向电压VR变化,取代可变电容,用作调谐回路、振荡电路、锁相环路,常用于电视机高频头的频道转换和调谐电路,多以硅材料制作.
9、频率倍增用二极管
  对二极管的频率倍增作用而言,有依靠变容二极管的频率倍增和依靠阶跃(即急变)二极管的频率倍增.频率倍增用的变容二极管称为可变电抗器,可变电抗器虽然和自动频率控制用的变容二极管的工作原理相同,但电抗器的构造却能承受大功率.阶跃二极管又被称为阶跃恢复二极管,从导通切换到关闭时的反向恢复时间trr短,因此,其特长是急速地变成关闭的转移时间显著地短.如果对阶跃二极管施加正弦波,那么,因tt(转移时间)短,所以输出波形急骤地被夹断,故能产生很多高频谐波.
10、稳压二极管
  是代替稳压电子二极管的产品.被制作成为硅的扩散型或合金型.是反向击穿特性曲线急骤变化的二极管.作为控制电压和标准电压使用而制作的.二极管工作时的端电压(又称齐纳电压)从3V左右到150V,按每隔10%,能划分成许多等级.在功率方面,也有从200mW至100W以上的产品.工作在反向击穿状态,硅材料制作,动态电阻RZ很小,一般为2CW型;将两个互补二极管反向串接以减少温度系数则为2DW型.
11、PIN型二极管(PIN Diode)
  这是在P区和N区之间夹一层本征半导体(或低浓度杂质的半导体)构造的晶体二极管.PIN中的I是"本征"意义的英文略语.当其工作频率超过100MHz时,由于少数载流子的存贮效应和"本征"层中的渡越时间效应,其二极管失去整流作用而变成阻抗元件,并且,其阻抗值随偏置电压而改变.在零偏置或直流反向偏置时,"本征"区的阻抗很高;在直流正向偏置时,由于载流子注入"本征"区,而使"本征"区呈现出低阻抗状态.因此,可以把PIN二极管作为可变阻抗元件使用.它常被应用于高频开关(即微波开关)、移相、调制、限幅等电路中.
12、 雪崩二极管 (Avalanche Diode)
  它是在外加电压作用下可以产生高频振荡的晶体管.产生高频振荡的工作原理是栾的:利用雪崩击穿对晶体注入载流子,因载流子渡越晶片需要一定的时间,所以其电流滞后于电压,出现延迟时间,若适当地控制渡越时间,那么,在电流和电压关系上就会出现负阻效应,从而产生高频振荡.它常被应用于微波领域的振荡电路中.
13、江崎二极管 (Tunnel Diode)
  它是以隧道效应电流为主要电流分量的晶体二极管.其基底材料是砷化镓和锗.其P型区的N型区是高掺杂的(即高浓度杂质的).隧道电流由这些简并态半导体的量子力学效应所产生.发生隧道效应具备如下三个条件:①费米能级位于导带和满带内;②空间电荷层宽度必须很窄(0.01微米以下);简并半导体P型区和N型区中的空穴和电子在同一能级上有交叠的可能性.江崎二极管为双端子有源器件.其主要参数有峰谷电流比(IP/PV),其中,下标"P"代表"峰";而下标"V"代表"谷".江崎二极管可以被应用于低噪声高频放大器及高频振荡器中(其工作频率可达毫米波段),也可以被应用于高速开关电路中.
14、快速关断(阶跃恢复)二极管 (Step Recovary Diode)
  它也是一种具有PN结的二极管.其结构上的特点是:在PN结边界处具有陡峭的杂质分布区,从而形成"自助电场".由于PN结在正向偏压下,以少数载流子导电,并在PN结附近具有电荷存贮效应,使其反向电流需要经历一个"存贮时间"后才能降至最小值(反向饱和电流值).阶跃恢复二极管的"自助电场"缩短了存贮时间,使反向电流快速截止,并产生丰富的谐波分量.利用这些谐波分量可设计出梳状频谱发生电路.快速关断(阶跃恢复)二极管用于脉冲和高次谐波电路中.
15、肖特基二极管 (Schottky Barrier Diode)
  它是具有肖特基特性的"金属半导体结"的二极管.其正向起始电压较低.其金属层除材料外,还可以采用金、钼、镍、钛等材料.其半导体材料采用硅或砷化镓,多为N型半导体.这种器件是由多数载流子导电的,所以,其反向饱和电流较以少数载流子导电的PN结大得多.由于肖特基二极管中少数载流子的存贮效应甚微,所以其频率响仅为RC时间常数限制,因而,它是高频和快速开关的理想器件.其工作频率可达100GHz.并且,MIS(金属-绝缘体-半导体)肖特基二极管可以用来制作太阳能电池或发光二极管.
16、阻尼二极管
  具有较高的反向工作电压和峰值电流,正向压降小,高频高压整流二极管,用在电视机行扫描电路作阻尼和升压整流用.
17、瞬变电压抑制二极管
  TVP管,对电路进行快速过压保护,分双极型和单极型两种,按峰值功率(500W-5000W)和电压(8.2V~200V)分类.
18、双基极二极管(单结晶体管)
  两个基极,一个发射极的三端负阻器件,用于张驰振荡电路,定时电压读出电路中,它具有频率易调、温度稳定性好等优点.
19、发光二极管
  用磷化镓、磷砷化镓材料制成,体积小,正向驱动发光.工作电压低,工作电流小,发光均匀、寿命长、可发红、黄、绿单色光.
三、根据特性分类
       点接触型二极管,按正向和反向特性分类如下.
1、一般用点接触型二极管
         这种二极管正如标题所说的那样,通常被使用于检波和整流电路中,是正向和反向特性既不特别好,也不特别坏的中间产品.如:SD34、SD46、1N34A等等属于这一类.
2、高反向耐压点接触型二极管
  是最大峰值反向电压和最大直流反向电压很高的产品.使用于高压电路的检波和整流.这种型号的二极管一般正向特性不太好或一般.在点接触型锗二极管中,有SD38、1N38A、OA81等等.这种锗材料二极管,其耐压受到限制.要求更高时有硅合金和扩散型.
3、高反向电阻点接触型二极管
  正向电压特性和一般用二极管相同.虽然其反方向耐压也是特别地高,但反向电流小,因此其特长是反向电阻高.使用于高输入电阻的电路和高阻负荷电阻的电路中,就锗材料高反向电阻型二极管而言,SD54、1N54A等等属于这类二极管.
4、高传导点接触型二极管
  它与高反向电阻型相反.其反向特性尽管很差,但使正向电阻变得足够小.对高传导点接触型二极管而言,有SD56、1N56A等等.对高传导键型二极管而言,能够得到更优良的特性.这类二极管,在负荷电阻特别低的情况下,整流效率较高.

点击此处查看原文 >>

系统分类: 模拟技术   |    用户分类:    |    来源: 整理

评论(0) | 阅读(188)
发表于:2008-4-7 15:35:38
标签:单片机的相位测量  

0

基于单片机的相位测量的一种方法


测量原理:
将相位差转换成时间,然后用单片机来测量时间间隔。被测信号e1和e2经整形电路形成方波,方波的上升沿和下降沿分别与振荡信号的正负过零点对应。整形电路的输出均分为2路,一路送异或门,异或门输出矩形脉冲的脉宽t与相位a成比例。在复合门上用高频时钟脉冲对相位脉冲进行刻度,即用异或门的输出脉冲来控制周期固定的高频时钟脉冲的通过。复合门的输出经闸门和分频器后送单片机的计数器,在单位时间内的计数器N正比于t,这样相位的测量就转化成数字化的时间测量;另一路分别送D触发器的输入端口和时钟端口,D触发器的输出送单片机的P1.0端口用来区分超前相角和滞后相角。


     

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(256)
发表于:2008-4-2 21:59:14
标签:招聘题目  单片机  

1

各大公司电子类招聘题目精选(单片机)


1、简单描述一个单片机系统的主要组成模块,并说明各模块之间的数据流流向和控制流流向。简述单片机应用系统的设计原则。(仕兰微面试题目)

2、画出8031与2716(2K*8ROM)的连线图,要求采用三-八译码器,8031的P2.5,P2.4和P2.3参加译码,基本地址范围为3000H-3FFFH。该2716有没有重叠地址?根据是什么?若
有,则写出每片2716的重叠地址范围。(仕兰微面试题目)

3、用8051设计一个带一个8*16键盘加驱动八个数码管(共阳)的原理图。(仕兰微面试题目)

4、PCI总线的含义是什么?PCI总线的主要特点是什么? (仕兰微面试题目)

5、中断的概念?简述中断的过程。(仕兰微面试题目)

6、如单片机中断几个/类型,编中断程序注意什么问题;(未知)

7、要用一个开环脉冲调速系统来控制直流电动机的转速,程序由8051完成。简单原理如
下:由P3.4输出脉冲的占空比来控制转速,占空比越大,转速越快;而占空比由K7-K0八
个开关来设置,直接与P1口相连(开关拨到下方时为"0",拨到上方时为"1",组成一个八
位二进制数N),要求占空比为N/256。  (仕兰微面试题目)
 下面程序用计数法来实现这一功能,请将空余部分添完整。  
 MOV P1,#0FFH   ;做输入
 LOOP1 :MOV R4,#0FFH   ;
 --------  
 MOV R3,#00H  
 LOOP2 :MOV A,P1  
 --------  
 SUBB A,R3  
 JNZ SKP1  
 --------  
 SKP1:MOV C,70H  
 MOV P3.4,C  
 ACALL DELAY :此延时子程序略  
 --------  
 --------  
 AJMP LOOP1  

8、单片机上电后没有运转,首先要检查什么?(东信笔试题)

9、What is PC Chipset? (扬智电子笔试)

芯片组(Chipset)是主板的核心组成部分,按照在主板上的排列位置的不同,通常分为北桥芯片和南桥芯片。北桥芯片提供对CPU的类型和主频、内存的类型和最大容量、ISA/PCI/AGP插槽、ECC纠错等支持。南桥芯片则提供对KBC(键盘控制器)、RTC(实时时钟控制器)、USB(通用串行总线)、Ultra DMA/33(66)EIDE数据传输方式和ACPI(高级能源管理)等的支持。其中北桥芯片起着主导性的作用,也称为主桥(Host Bridge)。
  除了最通用的南北桥结构外,目前芯片组正向更高级的加速集线架构发展,Intel的8xx系列芯片组就是这类芯片组的代表,它将一些子系统如IDE接口、音效、MODEM和USB直接接入主芯片,能够提供比PCI总线宽一倍的带宽,达到了266MB/s。

   10、如果简历上还说做过cpu之类,就会问到诸如cpu如何工作,流水线之类的问题。
(未知)

11、计算机的基本组成部分及其各自的作用。(东信笔试题)

12、请画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口、控制接口、所存器/缓冲器)。 (汉王笔试)

13、cache的主要部分什么的。(威盛VIA 2003.11.06 上海笔试试题)

14、同步异步传输的差异(未知)

15、串行通信与同步通信异同,特点,比较。(华为面试题)

16、RS232c高电平脉冲对应的TTL逻辑是?(负逻辑?) (华为面试题)

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(355)
发表于:2008-4-2 21:51:49
标签:C51  mcu  

0

单片机C51语言学习资料

 

基础知识:单片机编程基础

单片机的外部结构:

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() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例二:在例一中考虑按键20ms抖动问题。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;  //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
 { if( P1_0 == 0 ) //如果按键,则为低电平
{ delay20ms(); //延时20ms,跳过接下抖动
keyPut( 6 ); //保存按键编号值为按键队列
 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
delay20ms(); //延时20ms,跳过松开抖动
  }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例三:在例二中考虑干扰问题。即小于20ms的负脉冲干扰。
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )
{ P1_0 = 1;  //作为输入引脚,必须先输出高电平
while( 1 ) //永远为真,即死循环
 { if( P1_0 == 0 ) //如果按键,则为低电平
{ delay20ms(); //延时20ms,跳过接下抖动
 if( P1_0 == 1 ) continue; //假按键
keyPut( 6 ); //保存按键编号值为按键队列
 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键
delay20ms(); //延时20ms,跳过松开抖动
  }
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
例四:状态图编程法。通过20ms周期中断,扫描按键。
/****************************************************************************************
采用晶体为12KHz时,指令周期为1ms(即主频为1KHz),这样T0工作在定时器方式2,8位自动重载。计数值为20,即可产生20ms的周期性中断,在中断服务程序中实现按键扫描
*****************************************************************************************/
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )

TMOD = (TMOD & 0xf0 ) | 0x02; //不改变T1的工作方式,T0为定时器方式2
TH0 = -20;     //计数周期为20个主频脉,即20ms
TL0=TH0;      //先软加载一次计数值
TR0=1;      //允许T0开始计数
ET0=1;      //允许T0计数溢出时产生中断请求
EA=1;      //允许CPU响应中断请求
while( 1 ) //永远为真,即死循环
 {
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
void timer0int( void ) interrupt 1 //20ms;T0的中断号为1
{ static unsigned char sts="0";
 P1_0 = 1;  //作为输入引脚,必须先输出高电平
switch( sts )
 {
  case 0: if( P1_0==0 ) sts="1"; break; //按键则转入状态1
  case 1:
if( P1_0==1 ) sts="0";  //假按错,或干扰,回状态0
else{ sts="2"; keyPut( 6 ); } //确实按键,键值入队列,并转状态2
break;
  case 2: if( P1_0==1 ) sts="3"; break; //如果松键,则转状态3
  case 3:
   if( P1_0==0 ) sts="2";  //假松键,回状态2
   else sts="0";    //真松键,回状态0,等待下一次按键过程 
 }

例五:状态图编程法。
/****************************************************************************************
如果采用晶体为12MHz时,指令周期为1us(即主频为1MHz),要产生20ms左右的计时,则计数值达到20000,T0工作必须为定时器方式1,16位非自动重载,即可产生20ms的周期性中断,在中断服务程序中实现按键扫描
*****************************************************************************************/
#i nclude <at89x52.h>
#i nclude “KEY.H”
void main( void )

TMOD = (TMOD & 0xf0 ) | 0x01; //不改变T1的工作方式,T0为定时器方式1
TL0 = -20000;     //计数周期为20000个主频脉,自动取低8位
TH0 = (-20000)>>8;    //右移8位,实际上是取高8位
TR0=1;      //允许T0开始计数
ET0=1;      //允许T0计数溢出时产生中断请求
EA=1;      //允许CPU响应中断请求
while( 1 ) //永远为真,即死循环
 {
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
void timer0int( void ) interrupt 1 //20ms;T0的中断号为1
{ static unsigned char sts="0";
TL0 = -20000;     //方式1为软件重载
TH0 = (-20000)>>8;    //右移8位,实际上是取高8位
 P1_0 = 1;  //作为输入引脚,必须先输出高电平
switch( sts )
 {
  case 0: if( P1_0==0 ) sts="1"; break; //按键则转入状态1
  case 1:
if( P1_0==1 ) sts="0";  //假按错,或干扰,回状态0
else{ sts="2"; keyPut( 6 ); } //确实按键,键值入队列,并转状态2
break;
  case 2: if( P1_0==1 ) sts="3"; break; //如果松键,则转状态3
  case 3:
   if( P1_0==0 ) sts="2";  //假松键,回状态2
   else sts="0";    //真松键,回状态0,等待下一次按键过程 
 }

例六:4X4按键。
/****************************************************************************************
由P1端口的高4位和低4位构成4X4的矩阵键盘,本程序只认为单键操作为合法,同时按多键时无效。
这样下面的X,Y的合法值为0x7, 0xb, 0xd, 0xe, 0xf,通过表keyCode影射变换可得按键值
 *****************************************************************************************/
#i nclude <at89x52.h>
#i nclude “KEY.H”
unsigned char keyScan( void ) //返回0表示无按键,或无效按键,其它值为按键编码值
{ code unsigned char keyCode[16]=
 /0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
{ 0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   2,   0,   3,   4,   0 };
unsigned char x, y, retVal;
P1=0x0f;    //低四位输入,高四位输出0
x=P1&0x0f;   //P1输入后,清高四位,作为X值
P1=0xf0;    //高四位输入,低四位输出0
y=(P1 >> 4) & 0x0f; //P1输入后移位到低四位,并清高四位,作为Y值
retVal = keyCode[x]*4 + keyCode[y]; //根据本公式倒算按键编码
if( retVal==0 ) return(0); else return( retVal-4 );  
}
//比如按键‘1’,得X=0x7,Y=0x7,算得retVal= 5,所以返回函数值1。
//双如按键‘7’,得X=0xb,Y=0xd,算得retVal=11,所以返回函数值7。
void main( void )

TMOD = (TMOD & 0xf0 ) | 0x01; //不改变T1的工作方式,T0为定时器方式1
TL0 = -20000;     //计数周期为20000个主频脉,自动取低8位
TH0 = (-20000)>>8;    //右移8位,实际上是取高8位
TR0=1;      //允许T0开始计数
ET0=1;      //允许T0计数溢出时产生中断请求
EA=1;      //允许CPU响应中断请求
while( 1 ) //永远为真,即死循环
 {
if( keyHit() != 0 ) //如果队列中有按键
P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上
 }
}
void timer0int( void ) interrupt 1 //20ms;T0的中断号为1
{ static unsigned char sts="0";
TL0 = -20000;     //方式1为软件重载
TH0 = (-20000)>>8;    //右移8位,实际上是取高8位
 P1_0 = 1;  //作为输入引脚,必须先输出高电平
switch( sts )
 {
  case 0: if( keyScan()!=0 ) sts="1"; break; //按键则转入状态1
  case 1:
if( keyScan()==0 ) sts="0";  //假按错,或干扰,回状态0
else{ sts="2"; keyPut( keyScan() ); } //确实按键,键值入队列,并转状态2
break;
  case 2: if(keyScan()==0 ) sts="3"; break; //如果松键,则转状态3
  case 3:
   if( keyScan()!=0 ) sts="2";  //假松键,回状态2
   else sts="0";    //真松键,回状态0,等待下一次按键过程 
 }

第六节:低频频率计
实例目的:学时定时器、计数器、中断应用
说明:选用24MHz的晶体,主频可达2MHz。用T1产生100us的时标,T0作信号脉冲计数器。假设晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽度都不能小于0.5us),频率小于1MHz,大于1Hz。要求测量时标1S,测量精度为0.1%。
解:从测量精度要求来看,当频率超过1KHz时,可采用1S时标内计数信号脉冲个数来测量信号频,而信号频率低于1KHz时,可以通过测量信号的周期来求出信号频率。两种方法自动转换。
对于低于1KHz的信号,信号周期最小为1ms,也就是说超过1000us,而我们用的定时器计时脉冲周期为0.5us,如果定时多计或少计一个脉冲,误差为1us,所以相对误差为1us/1000us=0.1%。信号周期越大,即信号频率越低,相对误差就越小。
从上面描述来看,当信号频率超过1KHz后,信号周期就少于1000us,显然采用上面的测量方法,不能达到测量精度要求,这时我们采用1S单位时间计数信号的脉冲个数,最少能计到1000个脉冲,由于信号频率不超过1MHz,而我们定时脉冲为2MHz,最差多计或少计一个信号脉冲,这样相对误差为1/1000,可见信号频率越高,相对误差越小。
信号除输入到T1(P3.5)外,还输入到INT1(P3.3)。
unsigned int us100;   //对100us时间间隔单位计数,即有多少个100us。
unsigned char Second;
unsigned int K64;    //对64K单位计数,即有多少个64K  
unsigned char oldT0;
unsigned int oldus, oldK64, oldT1;
unsigned long fcy;    //存放频率值,单位为Hz
bit HighLow="1";    //1:表示信号超过1KHz;0:表示信号低于1KHz。
void InitialHigh( void )
{
 IE=0; IP="0"; HighLow="1";
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; PX0=1; T0=1;
 TMOD = (TMOD & 0x0f) | 0x50; TH1=0; TL1=0; T1=1; ET1=1;
 Us100=0; Second="0"; K64=0;
 oldK64=0; oldT1=0;
 TCON |= 0x50;  //同时置 TR0=1; TR1=1;
 EA = 1;
}
void InitialLow( void )
{
 IE=0; IP="0"; HighLow="0";
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; ET0=1; TR0=1;
 INT1 = 1; IT1=1; EX1=1;
 Us100=0; Second="0"; K64=0;
 oldK64=0; oldT1=0;
 EA = 1;
}
void T0intr( void ) interrupt 1
{ if( HighLow==0 ) ++us100;
else
if( ++us100 >= 10000 )
{  unsigned int tmp1, tmp2;
TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1;
fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1);
oldK64=tmp1; oldT1=tmp2;
Second++;
us100=0;
}
}
void T1intr( void ) interrupt 3 { ++K64; }
void X1intr( void ) interrupt 2
{ static unsigned char sts="0";
switch( sts ) 
{
case 0: sts = 1; break;
case 1: oldT0=TL0; oldus="us100"; sts="2"; break;
case 2:
{
 unsigned char tmp1, tmp2;
 TR0=0; tmp1=TL0; tmp2=us100; TR0=1;
 fcy = 1000000L/( (tmp2-oldus)*100L + (256-tmp1)/2 );
 Second ++;
}
 Sts = 0;
 break;
 }
}
void main( void )
{
if( HighLow==1) InitialHigh(); else InitialLow();
 While(1)
 {
if( Second != 0 )
{
Second = 0;
//display fcy  引用前面的数码管驱动程序,注意下面对T0中断服务程序的修改
{ unsigned char i;
 for( i="0"; i<8; i++ ){ Display(i, fcy%10); fcy /= 10; }
}
if( HighLow==1 )
if( fcy<1000L ){ InitalLow();} 
   else
    if( fcy>1000L ){ InitalHigh();}
}
 }
}
//修改T0的中断服务程序,让它在完成时标的功能时,同时完成数码管显示刷新
void T0intr( void ) interrupt 1
{
 static unsigned char ms = 0;
 if( HighLow==0 ) ++us100;
else
if( ++us100 >= 10000 )
{  unsigned int tmp1, tmp2;
TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1;
fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1);
oldK64=tmp1; oldT1=tmp2;
Second++;
us100=0;
}
 if( ++ms >= 10 ){ ms="0"; DisplayBrush(); } //1ms数码管刷新
}
 
第七节:电子表
单键可调电子表:主要学习编程方法。
外部中断应用,中断嵌
解:电子表分为工作状态和调整状态。平时为工作状态,按键不足一秒,接键为换屏‘S’。按键超过一秒移位则进入调整状态‘C’,而且调整光标在秒个位开始。调整状态时,按键不足一秒为光标移动‘M’,超过一秒则为调整读数,每0.5秒加一‘A’,直到松键;如果10秒无按键则自动回到工作状态‘W’。
如果有年、月、日、时、分、秒。四联数码管可分三屏显示,显示格式为“年月.”、“日.时.”、“分.秒”,从小数点的位置来区分显示内容。(月份的十位数也可以用“-”和“-1”表示)。
enum status = { Work, Change, Add, Move, Screen } //状态牧举
//计时和调整都是对下面时间数组Time进行修改
unsigned char Time[12]={0,4, 0,6, 1,0, 0,8, 4,5, 3,2}; //04年06月10日08时45分32秒
unsigned char cursor = 12; //指向秒个位,=0时无光标
unsigned char YmDhMs = 3; //指向“分秒”显示 ,=0时无屏显
static unsigned char sts = Work;
/*
如果cursor不为0,装入DisBuf的对应数位,按0.2秒周期闪烁,即设一个0.1秒计数器S01,S01为奇数时灭,S01为偶数时亮。
小数点显示与YmDhMs变量相关。
*/
void DisScan( void ) //动态刷新显示时调用。没编完,针对共阴数码管,只给出控控制算法
{
 //DisBuf每个显示数据的高四位为标志,最高位D7为负号,D6为小数点,D5为闪烁
unsigned char tmp;
 tmp = Seg7Code[?x & 0x1f ];  //设?x为显示数据,高3位为控制位,将低5位变为七段码
 if( ?x & 0x40 ) tmp |= 0x80; //添加小数点
 if( ?x & 0x20 ){ if( S01 & 0x01 ) tmp="0"; } //闪烁,S01奇数时不亮
 //这里没有处理负号位
 //将tmp送出显示,并控制对应数码管动作显示
}
void Display( void )  //根据状态进行显示
{
 if( cursor != 0 ){ YmDhMs=(cursor+3)/4; } //1..4=1; 5..8=2; 9..12=3
for( i=(YmDhMs-1)*4; i<(YmDhMs)*4; i++ )
{ unsigned char j = i%4;
 Disbuf[j] = Time[i];
 if( i == (cursor-1) ) Disbuf[j] |= 0x20; //闪烁,cursor!=0时才闪烁
 if( (i==9) ||  //小数点:分个位
  (i==7) ||  //小数点:时个位
  (i==5) ||  //小数点:日个位
  (i==3)   //小数点:月个位
 ) Disbuf[j] |= 0x40;
 //if(i==2){ if(Time[2]==1) DisBuf[2]=“-1”; else DisBuf=“-”; }
}
//工作状态:根据YmDhMs将屏数据装入DisBuf
 //调整状态:根据cursor将屏数据装入DisBuf
}
void KeyScan( void )  //根据状态扫描按键
void ProcessKey( void )  //根据状态处理键信息
{
 keyVal = KeyGet();
 if( keyVal == 0 ) return;
 switch( sts )
 {
  case Work:
   if( keyVal ==‘S’)
   {
    if( --YmDhMs == 0 ) YmDhMs = 3; //换屏
   }
   if( keyVal == ‘C’)
   {
    sts = Change;
    YmDhMs = 3;
    Cursor = 12;
   }
   break;
  case Change:
   if( keyVal == ‘W’ )
   if( keyVal == ‘A’ )
   if( keyVal == ‘M’ ) //根据cursor
   break;
 }  
}
第八节:串行口应用
一、 使用晶体频率为22.1184MHz的AT89C52单片机,串行口应用工作方式1,以9600bps的波特率向外发送数据,数据为十个数字‘0’到‘9’,循环不断地发送。

解:数字字符为增量进二进制码,‘0’对应0x30,‘1’= ‘0’+ 1 = 0x31,从‘0’到‘9’对应编码为0x30到0x39,记忆二进制编码较难,实际编程中用单引号括起对应字符表示引用该字符的二进制编码值,如‘?’表示引用?号的编码值。
在用11.0592MHz晶体时,9600bps的初始化分频初值为-6,现晶频加倍,如果其它条件不变,只有分频初始加倍为-12,才能得到9600bps;如果想得到2400bps(速率降4倍),分频初始自然加大4倍,即为-48。根据题意编得如下程序:
#i nclude <at89x52.h>
void main( void )
{
 TMOD = (TMOD & 0x0F) | 0x20;
 TH1 = -12;
 PCON |= 0x80; //SMOD = 1
 TR1 = 1;
 SCON = 0x42;
 while( 1 )
 {
  if( TI==1 )
  {
   static unsigned char Dat=‘0’;
   SBUF = Dat;
   TI = 0;
   If( ++Dat > ‘9’) Dat=‘0’;
  }
 }
}
二、 在上题的基础上,改为2400bps,循环发送小写字母‘a’到‘z’,然后是大写字母‘A’到‘Z’。
#i nclude <at89x52.h>
void main( void )
{
 TMOD = (TMOD & 0x0F) | 0x20;
 TH1 = -96;  //注意不用倍频方式
 PCON &= 0x7F; //SMOD = 0
 TR1 = 1;
 SCON = 0x42;
 while( 1 )
 {
  if( TI==1 )
  {
   static unsigned char Dat=‘a’;
   SBUF = Dat;
   TI = 0;
   //If( ++Dat > ‘9’) Dat=‘0’;
   ++Dat;
   if( Dat == (‘z’+1) )  Dat=‘A’;
   if( Dat == (‘Z’+1) )  Dat=‘a’;
  }
 }
}
上述改变值时,也可以再设一变量表示当前的大小写状态,比如写成如下方式:
   ++Dat;
   {
    static unsigned char Caps="1";
    if( Caps != 0 )
     if( Dat>‘Z’){ Dat=‘a’; Caps="0"; }
    else
     if( Dat>‘z’){ Dat=‘A’; Caps="1"; }
   }
如下写法有错误:因为小b比大Z的编码值大,所以Dat总是‘a’
   ++Dat;
   if( Dat>‘Z’){ Dat=‘a’}
   else if( Dat>‘z’){ Dat=‘A’}
三、 有A和B两台单片机,晶体频率分别为13MHz和14MHz,在容易编程的条件下,以最快的速度进行双工串行通信,A给B循环发送大写字母从‘A’到‘Z’,B给A循环发送小写字母从‘a’到‘z’,双方都用中断方式进行收发。
解:由于晶体频率不同,又不成2倍关系,所以只有通信方式1和方式3,由于方式3的帧比方式1多一位,显然方式3的有效数据(9/11)比方式1(8/10)高,但要用方式3的第9位TB8来发送数据,编程难度较大,这里方式1较容易编程。
在计算最高速率时,由于单方程,双未知数,又不知道波特率为多少,所以要综合各方面的条件,估算出A和B的分频常数,分别为-13和-14时,速率不但相同,且为最大值。如下给出A机的程序:
#i nclude <at89x52.h>
void main( void )
{
 TMOD = (TMOD &