* K& g1 h( r9 a( o' U3 m0 p; D
( ~0 f$ `- \$ Z+ f引脚功能:
' R* p/ W; N+ tMCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图:
D$ } V0 M5 E1 b }- nl P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 ' P7 C7 j# ~* S- e1 ?( p2 x
l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。
! X( E. h; n0 ^2 G/ u7 r; v3 V3 H" tl P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。
8 X+ B" F$ t! P' bl P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 0 ?( H& l- x' I$ W- Q3 }+ S3 H
这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。
2 @% p2 |; B! ~P0口有三个功能: 4 G1 n7 Y% H0 t I% i* c6 f
1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口)
2 @% l+ P! D- x ?2 u2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)
4 b' D- L9 h) @9 r% h7 ?3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
( @5 C- t7 _4 n) G3 E$ h8 M' B9 EP1口只做I/O口使用:其内部有上拉电阻。 . q7 G2 y" R3 o* N! e9 \+ e, A
P2口有两个功能:
/ f/ j/ s" X# i; A- s ]1、扩展外部存储器时,当作地址总线使用 2 M# |6 P$ V: ^4 C" Y/ z( f
2、做一般I/O口使用,其内部有上拉电阻; ! v9 i& \' B; H) o7 j- e
P3口有两个功能: - I# c! O/ V5 }
除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。
' v t) q0 H7 r. U, x有内部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的,
2 D' }9 ^1 W5 Y9 l, w% Y即:编程脉冲:30脚(ALE/PROG)
: q+ W/ e9 C$ ?编程电压(25V):31脚(EA/Vpp)
0 z- T- H3 @7 \$ s接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方式由第9脚(即RST/VPD)引入,以保护内部RAM中的信息不会丢失。 0 H- d' W! H1 b! V2 x* v% Z
(注:这些引脚的功能应用,除9脚的第二功能外,在“新动力2004版”学习套件中都有应用到。)
; W$ B+ t5 [7 c: f4 X. D, J! d. Y在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 : x; A2 H0 r1 n; P: R- g$ [2 f
ALE 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。参见图2(8051扩展2KB EEPROM电路,在图中ALE与4LS373锁存器的G相连接,当CPU对外部进行存取时,用以锁住地址的低位地址,即P0口输出。 ' s6 Y: \2 x4 T. }5 P. d
由于ALE是以晶振六分之一的固定频率输出的正脉冲,当系统中未使用外部存储器时,ALE脚也会有六分之一的固定频率输出,因此可作为外部时钟或外部定时脉冲使用。
1 w' K* f9 h [; A0 A PSEN 外部程序存储器读选通信号:在读外部ROM时PSEN低电平有效,以实现外部ROM单元的读操作。 + N+ R" N3 p0 |. H8 m6 ~; R
1、内部ROM读取时,PSEN不动作; 7 a" V! H$ N6 Z4 E
2、外部ROM读取时,在每个机器周期会动作两次; 8 U7 }3 h+ t$ I' T! w9 M0 t
3、外部RAM读取时,两个PSEN脉冲被跳过不会输出;
- \, ?5 s/ E: r7 h' X1 M4、外接ROM时,与ROM的OE脚相接。
- r5 ~& S2 w8 P$ r4 f% r参见图2—(8051扩展2KB EEPROM电路,在图中PSEN与扩展ROM的OE脚相接)
; b6 A5 X' m# M% Q EA/VPP 访问和序存储器控制信号 ' ^8 \ d; o. g$ p
1、接高电平时:
% W" d: K5 u" D4 M) d7 w( S D8 NCPU读取内部程序存储器(ROM) ; G% ~& i7 ?) @6 p. b
扩展外部ROM:当读取内部程序存储器超过0FFFH(8051)1FFFH(8052)时自动读取外部ROM。
5 |8 s3 }" s7 ^2、接低电平时:CPU读取外部程序存储器(ROM)。
; c) k$ [ D" P6 U% ~3、8751烧写内部EPROM时,利用此脚输入21V的烧写电压。
, S6 P- @' N1 x; {; C& w4 u! H RST 复位信号:当输入的信号连续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作。
9 B* F% R8 Q1 l/ n1 d% l XTAL1和XTAL2 外接晶振引脚。当使用芯片内部时钟时,此二引脚用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
VCC:电源+5V输入 1 t3 Z+ D) V0 W4 x# w
VSS:GND接地。
& X" x3 i' a$ s# j8 W; Z
各端口工作原理讲解 % W, a$ m. [$ b& ]# @/ y4 v1 b
并行端口
) m" Y8 [+ b6 e4 `; a$ FP0端口
}/ t8 _% E5 @总线I/O端口,双向,三态,数据地址分时复用,该端口除用于数据的输入/输出外,在8031单片机外接程序存储器时,还分时地输出/输入地址/指令。由Po端口输出的信号无锁存,输入的信息有读端口引脚和读端口锁存器之分。P0端口8位中的一位结构图见下图:
6 v/ A" h+ E/ b7 w1 L+ v# a
9 v! }! ?- P" L6 s & a# @4 X" ]* f O& a
由上图可见,P0端口由锁存器、输入缓冲器、切换开关与相应控制电路、场效应管驱动电路构成。 在输出状态下,当切换开关MUX向下时,从内部总线来的数据经锁存器反相和场效应管T2反相,输出到端口引脚线上。此时,场效应管T1关断,因而这种输出方式应为外接上拉电阻的漏极开路式。当切换开关MUX向上时,一位地址/数据信号分时地输出到端口线上。此外,由T1、T2的通断组合,形成高电平、低电平与高阻浮动三态的输出。 在输入状态下,从锁存器和从引脚上读来的信号一般是一致的,但也有例外。例如,当从内部总线输出低电平后,锁存器Q=0,Q=1,场效应管T2开通,端口线呈低电平状态。此时无论端口线上外接的信号是低电乎还是高电平,从引脚读入单片机的信号都是低电平,因而不能正确地读入端口引脚上的信号。又如,当从内部总线输出高电平后,锁存器Q=1,Q=0,场效应管T2截止。如外接引脚信号为低电平,从引脚上读入的信号就与从锁存器读入的信号不同。为此,8031单片机在对端口P0一P3的输入操作上,有如下约定:为此,8031单片机在对端口P0一P3的输入操作上,有如下约定:凡属于读-修改-写方式的指令,从锁存器读入信号,其它指令则从端口引脚线上读入信号。 读-修改-写指令的特点是,从端口输入(读)信号,在单片机内加以运算(修改)后,再输出(写)到该端口上。下面是几条读--修改-写指令的例子。 ' @, v$ m& Z; p) z
+ o: ^. C! B. f
: B8 s, h2 Z& ]6 | P V' l6 f
6 m/ y2 |4 D$ q5 Z9 t, RANL P0,#立即数 | 7 n( l& [9 E% v7 Y S4 k; X6 c N
0→立即数P0 | ) R9 U6 g2 T/ ^- r4 M0 d; \% O ]
$ C+ z% ?$ Q6 kORL P0,A |
7 w/ H4 z& G' T! d. f 0→AP0 |
Y; K% ]3 `" e( D+ t
, I: M( l% F3 D( ?! D; i" R1 z) ~. q9 |INC P1 |
- {$ a! ~7 O B6 t) E/ a 1+1→P1 |
5 O7 L/ N/ d2 u7 b j: }
* Z$ _3 K& U, k. k, KDEC P3 | $ h8 z$ L' |1 R$ f) C
;P3-1→P3 |
' Z4 r! |6 B( j% y1 e. f( _( L; B+ ?3 A
1 T; ^! A2 U+ v) |9 j" O1 U' ICPL P2 |
5 l/ H6 o, M$ R* l/ a' ]- V+ h;P2→P2 |
8 c% F5 {; }/ t: J1 b1 l这样安排的原因在于读-修改-写指令需要得到端口原输出的状态,修改后再输出,读锁存器而不是读引脚,可以避免因外部电路的原因而使原端口的状态被读错。 P0端口是8031单片机的总线口,分时出现数据D7一D0、低8位地址A7一AO,以及三态,用来接口存储器、外部电路与外部设备。P0端口是使用最广泛的I/O端口。
- ]8 G9 E& T" @( P2 RP1端口: , i( @! H. `" X* ~% f
通用I/0端口,准双向静态口。输出的信息有锁存,输入有读引脚和读锁存器之分。P1端口的一位结构见下图. 由图可见,P1端口与P0端口的主要差别在于,P1端口用内部上拉电阻R代替了P0端口的场效应管T1,并且输出的信息仅来自内部总线。由内部总线输出的数据经锁存器反相和场效应管反相后,锁存在端口线上,所以,P1端口是具有输出锁存的静态口。 由下图可见,要正确地从引脚上读入外部信息,必须先使场效应管关断,以便由外部输入的信息确定引脚的状态。为此,在作引脚读入前,必须先对该端口写入l。具有这种操作特点的输入/输出端口,称为准双向I/O口。8031单片机的P1、P2、P3都是准双向口。P0端口由于输出有三态功能,输入前,端口线已处于高阻态,无需先写入l后再作读操作。
+ p/ W7 O. F0 C4 ]6 w . N2 n5 ]1 R, n/ f7 O8 [! a
单片机复位后,各个端口已自动地被写入了1,此时,可直接作输入操作。如果在应用端口的过程中,已向P1一P3端口线输出过0,则再要输入时,必须先写1后再读引脚,才能得到正确的信息。此外,随输入指令的不同,H端口也有读锁存器与读引脚之分。 Pl端口是803l单片机中唯一仅有的单功能I/O端口,并且没有特定的专用功能,输出信号锁存在引脚上,故又称为通用静态口。 % w. p: D% \7 b- _
P2端口: P2端口的一位结构见下图:
- v) B9 \( O+ U* Q . D* U) O# A1 D# C+ g2 {7 P
由图可见,P2端口在片内既有上拉电阻,又有切换开关MUX,所以P2端口在功能上兼有P0端口和P1端口的特点。这主要表现在输出功能上,当切换开关MUX向左时,从内部总线输出的一位数据经反相器和场效应管反相后,输出在端口引脚线上;当MUX向右时,输出的一位地址信号也经反相器和场效应管反相后,输出在端口引脚线上。 由于8031单片机必须外接程序存储器才能构成应用电路,而P2端口就是用来周期性地输出从外存中取指令的地址(高8位地址),因此,P2端口的切换开关MUX总是在进行切换,分时地输出从内部总线来的数据和从地址信号线上来的地址。因此P2端口是动态的I/O端口。输出数据虽被锁存,但不是稳定地出现在端口线上。其实,这里输出的数据往往也是一种地址,只不过是外部RAM的高8位地址。 在输入功能方面,P2端口与P0和H端口相同,有读引脚和读锁存器之分,并且P2端口也是准双向口。 可见,P2端口的主要特点包括: ①不能输出静态的数据; ②自身输出外部程序存储器的高8位地址; ②执行MOVX指令时,还输出外部RAM的高位地址,故称P2端口为动态地址端口。 P3端口: 双功能静态I/O口P3端口的一位结构见下图。

( q' u# x$ `# O由上图可见,P3端口和Pl端口的结构相似,区别仅在于P3端口的各端口线有两种功能选择。当处于第一功能时,第二输出功能线为1,此时,内部总线信号经锁存器和场效应管输入/输出,其作用与P1端口作用相同,也是静态准双向I/O端口。当处于第二功能时,锁存器输出1,通过第二输出功能线输出特定的内含信号,在输入方面,即可以通过缓冲器读入引脚信号,还可以通过替代输入功能读入片内的特定第二功能信号。由于输出信号锁存并且有双重功能,故P3端口为静态双功能端口。
) O9 ]5 j8 l1 d1 mP3口的特殊功能(即第二功能):
9 Y) G/ S7 i: W. t& i1 s/ I4 `+ C
5 j7 x/ h3 p) D7 o7 n
7 l, G" _& Y% a3 F/ r& I7 `/ U
7 d5 M8 _' u l
口线 | 2 h4 j' b: @, J8 Q) n! S9 y
F1 @' n" K/ x% V 第二功能 | ' D$ W7 w% m( p, v
5 r! W$ X! }2 a
信号名称 |
( D* ?! i2 N, f5 W, M/ t
; |7 {7 k; }/ O0 d7 D( L6 m7 J2 O, I. {+ m) v
P3.0 |
% [) N5 n; l! ZRXD |
$ n4 l1 B3 d/ E8 O8 \7 _1 D串行数据接收 | 0 V; T$ ]6 _! z# T& T
! a5 l& g' J7 n8 o T9 M) {* v) O9 X
8 ?/ v2 G' w+ n9 @ P3.1
| / j% E" ~: ^' w+ E' t
TXD | + e+ N7 u' V& L+ ^$ q8 H/ L
串行数据发送 | 4 j- X( X2 X7 J3 i# h( P
: N7 ^# X. z6 D: z/ c; Z# y0 W
2 z( ^8 V$ D) @1 E1 Y7 L3 Y P3.2
| 9 {% a; |# X: X. B+ k9 d' D$ S6 }
INT0 |
' c9 \* g, R4 E! }: q3 w外部中断0申请 |
- Q0 q3 b/ Y& [$ e4 B. C. `+ N( Z
6 A) `) a4 k% Q2 f; m2 f5 z# J8 n1 a; e% A! a
P3.3
|
" Z4 i* O) H. \" X8 D" w' c6 aINT1 |
5 Z# m7 @8 s" m |/ E* r外部中断1申请 | 6 H8 M5 G, F$ L5 a( A
* [/ @+ d6 Z w1 ~2 H
- X& l+ ]3 E+ r: H, c! Y P3.4
|
# {0 Q3 }- U0 A& [T0 |
4 [0 S5 t4 w. a+ m9 z; i) i; S定时器/计数器0计数输入 |
+ }* L' F Q* R' U' \2 {8 k. Y
) Q; N: w& q1 i# ~- A; s) j
# L, }+ ^* | b' e: a0 o6 V P3.5
| & a# A6 F5 I, T" z1 U" m' ]
T1 | , N& I2 i8 I/ t& B3 H
定时器/计数器1计数输入 | 9 D3 E4 v, W9 y+ @9 ]/ O2 ^
6 J: n8 R5 i6 V; d/ s+ D2 [
4 U; A4 S/ L1 W! f+ p P3.6
| * \0 @! _6 o z7 H+ H0 R$ C6 A
WR |
. P" n- X8 q T$ K外部RAM写选通 |
7 Q& [) g+ _& M& [* Z
( a; s1 F' K" H2 N" M( h8 H2 L' B* }6 p6 Z6 z: R7 `( F! v
P3.7
| 9 c+ z& ?2 S' M9 s0 d
RD |
1 i% @5 ?, _* G( O" t外部RAM读选通 | 8 g$ |; y/ _3 z- B
使P3端品各线处于第二功能的条件是: 9 a* d- |# v6 h1 H& \* D
1\串行I/O处于运行状态(RXD,TXD); $ c: P5 m( {0 L( ]- y
2\打开了处部中断(INT0,INT1); 2 W' j8 k4 r- R7 C1 G
3\定时器/计数器处于外部计数状态(T0,T1)
* p, m0 w' p6 s4 Z4\执行读写外部RAM的指令(RD,WR) " J A7 C0 K8 f1 u( X& a
在应用中,如不设定P3端口各位的第二功能(WR,RD信叼的产生不用设置),则P3端口线自动处于第一功能状态,也就是静态I/O端口的工作状态。在更多的场合是根据应用的需要,把几条端口线设置为第二功能,而另外几条端口线处于第一功能运行状态。在这种情况下,不宜对P3端口作字节操作,需采用位操作的形式。
: O9 p$ u6 h9 @# L% X, M端口的负载能力和输入/输出操作: : c! p9 e# q7 [5 j# h9 h: b
P0端口能驱动8个LSTTL负载。如需增加负载能力,可在P0总线上增加总线驱动器。P1,P2,P3端口各能驱动4个LSTTL负载。 前已述及,由于P0-P3端口已映射成特殊功能寄存器中的P0一P3端口寄存器,所以对这些端口寄存器的读/写就实现了信息从相应端口的输入/输出。例如: MOV A, P1 ;把Pl端口线上的信息输入到A MoV P1, A ;把A的内容由P1端口输出 MOV P3, #0FFH ;使P3端口线各位置l
d1 @, H' \% w: N$ E4 K串行端口: MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信。
- {4 s6 @8 w, w+ E5 [8 Q1.串行端口的基本特点 8031单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同应用场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;方式1多用于双机之间或与外设电路的通信;方式2,3除有方式l的功能外,还可用作多机通信,以构成分布式多微机系统。 串行端口有两个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率(每秒传送的位数)以及作为中断标志等。 串行端口有一个数据寄存器SBUF(在特殊功能寄存器中的字节地址为99H),该寄存器为发送和接收所共同。发送时,只写不读;接收时,只读不写。在一定条件下,向阳UF写入数据就启动了发送过程;读SBUf就启动了接收过程。 串行通信的波特率可以程控设定。在不同工作方式中,由时钟振荡频率的分频值或由定时器Tl的定时溢出时间确定,使用十分方便灵活。
8 L/ M9 C* k a' O2.串行端口的工作方式 ①方式0 8位移位寄存器输入/输出方式。多用于外接移位寄存器以扩展I/O端口。波特率固定为fosc/12。其中,fosc为时钟频率。 在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此8位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,仅管不使用中断,中断标志TI还必须清零,8位数据发送完后,TI自动置1。如要再发送,必须用软件将TI清零。 串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RxD。当接收到8位数据(一帧)后,中断标志RI自动置。如果再接收,必须用软件先将RI清零。 串行方式0发送和接收的时序过程见下图。 ②方式1 " o# b$ F% C ?' ?

# F8 i* D; V9 E7 y) F) i8 N2 g9 X: ^10位异步通信方式。其中,1个起始位(0),8个数据位(由低位到高位)和1个停止位(1)。波特率由定时器T1的溢出率和SMOD位的状态确定。 一条写SBUF指令就可启动数据发送过程。在发送移位时钟(由波特率确定)的同步下,从TxD先送出起始位,然后是8位数据位,最后是停止位。这样的一帧10位数据发送完后,中断标志TI置位。 在允许接收的条件下(REN=1),当RXD出现由1到O的负跳变时,即被当成是串行发送来的一帧数据的起始位,从而启动一次接收过程。当8位数据接收完,并检测到高电乎停止位后,即把接收到的8位数据装入SBUF,置位RI,一帧数据的接收过程就完成了。 方式1的数据传送波特率可以编程设置,使用范围宽,其计算式为: 波特率=2SMOD/32×(定时器T1的溢出率) 其中,SMOD是控制寄存器PCON中的一位程控位,其取值有0和l两种状态。显然,当SMOD=0时,波特率=1/32(定时器Tl溢出率),而当SMOD=1时,波特率=1/16(定时器T1溢出率)。所谓定时器的溢出率,就是指定时器一秒钟内的溢出次数。波特率的算法,以及要求一定波特率时定时器定时初值的求法,后面将详细讨论。 · 串行方式1的发送和接收过程的时序见下图。 ③方式2,3 11位异步通信方式。其中,1个起始位(0),8个数据位(由低位到高位),1个附加的第9位和1个停止住(1)。方式2和方式3除波特率不同外,其它性能完全相同。方式2,3的发送、接收时序见下图。 由图可见,方式2和方式3与方式l的操作过程基本相同,主要差别在于方式2,3有第9位数据。 * \* p/ A: k/ m( o- e$ R
2 d+ E- |& Z* i0 G 发送时,发送机的这第9位数据来自该机SCON中的TB8,而接收机将接收到的这第9位数据送入本机SCON中的RB8。这个第9位数据通常用作数据的奇偶检验位,或在多机通信中作为地址/数据的特征位。 方式2和方式3的波特率计算式如下: 方式2的波特率=2SMOD/64×fosc 方式3的波特率=2SMOD/32×定时器T1的溢出率 由此可见,在晶振时钟频率一定的条件下,方式2只有两种波特率,而方式3可通过编程设置成多种波特率,这正是这两种方式的差别所在。 3.串行端口的控制寄存器 串行端口共有2个控制寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。
2 q' y0 l: C9 T( F' o' O ( G. S- D h% E* a4 z( M9 n
 . c$ f% C7 c8 ~$ J9 U% E
- k5 R0 y, k7 j+ z |