第四章-80C51单片机的功能单元

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章80C51单片机的功能单元
4·1 80C51的四个I/O口在使用上有哪些分工和特点?试比较各分工的特点? 试比较各口的特点?何谓分时复用总线?P3口的第二变异功能有哪些?
答:(1)80C51的四个I/O口在使用上的分工和特点
①P0口: 可作通用I/O口用,也可作地址/数据线用。

作通用I/O口用时,输出级为开漏极电路,在驱动外部电路时应接上拉电阻;在接有外部存储器时,P0口作地址/数据线用,先输出低8位地址到外部地址锁存器,后输人指令代码或输人/输出数据。

②Pl口: 是一个8位准双向口,作通用I/O口用。

③P2口: 是一个8位准双向口,作通用I/O口用。

当外部接有存储器时,可用于输出高8位地址。

④P3口: 是一个多功能端口。

其基本功能仍然是通用I/O口,使用时与Pl、P2口类似。

其第二功能则是串行口、外部中断线、定时器/计数器的输入及外部数据存储器的选通信号等。

(2)分时复用总线
分时复用总线是:在一组总线上,在不同的时间,有时输出地址,有时输人代码或输出/输人数据。

例如,P0口和P2口就组成了一组地址/数据复用总线。

(3)P3口的第二变异功能
第一功能第二变异功能
串行口:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
中断:
P3.2 INT0外部中断0
P3.3 INT1外部中断1
定时器/计数器(T0、T1):
P3.4 T0(定时器/计数器0的外部输入)
P3.5 T1(定时器/计数器1的外部输入)
数据存储器选通:
P3.6 WR(外部存储器写选通,低电平有效,输出)
P3.7 RD(外部存储器读选通,低电平有效,输出)
4·2 80C51端口P0~P3作通用I/O 口时,在输入引脚数据时,应注意什么?
答:p0~p3作通用I/O口在输入引脚数据时,应先用软件向口的输出锁存器写1。

4·3 "读一改一写"指令有何特点? 请至少列出五条不同操作的"读—改一写"指令。

答: (1)"读一改一写"指令的优点
从I/O口的位结构图中可以看出,有两种读口的操作:一种是读引脚操作,一种是读锁存器操作。

①在响应CPU输出的读引脚信号时,端口本身引脚的电平值通过缓冲器BUFl进入内部总线。

这种类型的指令,执行之前必须先将端口锁存器置1,使A点处于高电平;否则,会损坏引脚,而且也使信号无法读出,已于前述。

这种类型的指令有:
MOV A,P1 ;A←P1
MOV direct, P1 ; direct←Pl
②执行读锁存器的指令时,CPU首先完成将锁存器的值通过缓冲器BUF2读入内部,进行修改、改变,然后重新写到锁存器中去,这就是"读一改一写"指令。

这种类型的指令包含所有的口的逻辑操作(ANL、ORL、XRL)和位操作(JBC、CPL、MOV、SETB、CLR等)指令。

读锁存器操作可以避免一些错误,如用Pl.X去驱动晶体管的基极。

当对Pl.X写人1之后,晶体管导通。

若此时CPU接着读该位引脚的值,即晶体管基极的值时,为0;但是正确的值应该是1,这却可从读锁存器得到。

( 2 )"读一改一写"指令的操作
对口的8位一起操作:
ANL Pi,A ;i=0~3
ORL Pi,A ;i=0~3
XRL Pi,A ;i=0~3
INC Pi ;i=0~3
DEC Pi ;i=0~3
对口的某一位操作
JBC Pl.j,label ;j=0~7
CPL Pl.j ;j=0~7
4·4 为什么当P2口作为扩展程序存储器的高8位地址后,就不再适宜作通用I/O了? 答: 在系统中如果外接有程序存储器,由于访问片外程序存储器的连续不断地取指操作,P2 口需要不断送出高位地址,故这时p2口的全部口线均不宜再作I/O口使用。

4·5 80C51单片机内部设有几个定时器/计数器?它们各古由哪些特殊功能寄存器所组成?
有哪几种工作方式?简述各种工作方式的功能特点。

如何选择?
答:①80C51有两个16位的定时器/计数器T0和Tl。

②80C51定时器/计数器的特殊功能寄存器有:
定时器/计数器方式寄存器TMOD;
定时器/计数器控制寄存器TCON;
定时器/计数器数据寄存器THl、TLl、TH0、TL0。

③80C51的定时器/计数器有四种不同的工作方式:
●方式0:
TMOD中的Ml=0、M0=0,当计数溢出时,TF X置位。

如果中断允许,CPU响应中断并转人中断服务程序,由内部硬件清TF X。

TFx也可以由程序查询和清零。

●方式1:
TMOD中的Ml=0、M0=1,当计数时,TFx溢出后向THx进位,THx溢出后将TFx置位并向CPU申请中断。

其他与方式0完全相同。

●方式2:
TMOD中的Ml=l、M0=0,当TLx计数溢出时,一方面将TFx置位,并向CPU申请中断;另一方面将THx的内容重新装入TLx中,继续计数。

重新装入不影响THx的内容,所以可以多次连续装入。

方式2对定时控制特别有用,它可实现每个预定时间发出控制信号,
而且特别适合于串行口波特率发生器的使用。

●方式3:
TMOD中的Ml=l、M0=1,这种方式是将定时器/计数器T0分为一个8位定时器/计数器和一个8位定时器,TL0用于8位定时器/计数器,TH0用于8位定时器。

定时器/计数器的工作与方式0相同,只是此时的计数器为8位计数器TL0,它占用了T0的GA TE、INT0、TR0、T0引脚以及中断源等资源。

TH0所构成的定时器只能作为定时器用,因为此时的外部引脚T0己为定时器/计数器TL0所占用。

不过这时它却占用定时器/计数器Tl的启动/停止控制位TRl、计数溢出标识位TFl及中断源。

4·6 定时器/计数器作定时用时,定时时间与哪些因素有关?作计数用时,对外界计数频率有何限制?
答:①定时器/计数器作定时用时,其定时时间与下面因素有关:晶体振荡器的频率、机器周期、计数器的长度、定时器/计数器初值。

②用做"计数器"时,对外部输入端T0、Tl上1到0的跳变进行加1计数。

在计数状态下,每个机器周期的S5P2时刻采样外部输入,当第一个机器周期采样为高电平,而在第二个机器周期采样为低电平时,内部计数器加1。

新的计数值在紧接着采样到跳变后的下一机器周期的S3P1出现在计数器中。

由于检测一个1到0的跳变需要2个机器周期,即24个振荡周期,因此外部计数的最快速率为振荡频率的1/24。

外部输入信号的速率向下可以不受限制,但是脉冲宽度必须保证在其电平变化之前能被采样到一次,即至少保持一个完整的机器周期;否则,将会由于采样不到而出现漏计现象。

4·7 定时器T0为方式3时,由于TRl位已被T0占用,如何控制定时器T1的开启和关闭?
答:在方式3T,Tl己将TFl、TRl资源出借给T0使用了,因此,它自己只能作波特率发生器使用。

Tl作波特率发生器时,可以设置成方式0~方式2,用在任何不需要中断控制的场合。

作波特率发生器时,常设置成方式2的自动重装状态。

从题图4-1中可以看出,利用置Tl为定时器方式可以启动波特率发生器;而置Tl为计
数器方式,则可以关闭波特率发生器。

此时,只需要
MOV TMOD,#63H ;初始化
;设T0为方式3
;设T1为计数器,方式2
;关闭T1波特率发生器
MOV TL1,#38H ;置定时常数,即设波特率
MOV TH1,#38H
MOV TMOD,#23H ;设T1为定时器,方式2
;启动T1波特率发生器
4·8 在80C51单片机系统中,己知时钟频率为6MHZ,选用定时器T0设置方式3,请编程使Pl.0和Pl.1口分别输出周期为1ms和400us的方波。

答:以定时器T0设置方式3:TL0和TH0作为两个8位定时器,产生500us和200us的定时中断,即可使Pl.0和Pl.1口分别输出周期为lms和400us的方波。

①时间常数的计算:
振荡器的频率f osc=6MHz=6×106Hz,方式3计数器长度L=8,28=256。

●定时时间T=500us=500×10-6s
f osc ×T 6×106×500×10-6
定时常数T C =2L—=256—=256—250=6
12 12
●定时时间T=200us=200×10-6s
f osc ×T 6×106×200×10-6
定时常数T C =2L—=256—=256—100=56=38H
12 12
②P1.0和P1.1口分别输出周期为1ms和400us 的方波的程序:
ORG 000BH
AJMP IT0P

ORG 001BH
AJMP IT1P

ORG 100H
START:MOV SP,#60H ;设栈指针
ACALL PTOM3 ;调定时器初始化程序
PTOM3:MOV TMOD,#03H ;定时器初始化,设T0为方式3
MOV TL0,#6
MOV TH0,#38H
SETB TR0 ;定时开始
SETB ET0 ;开中断
SETB EA
RET

IT0P:MOV TL0,#6H ;TL0定时器中断程序
CPL P1.0
RETI

IT1P:MOV TH0,#38H ;TH0定时器中断程序
CPL Pl.1
RETI
4·9 用80C51的定时器测量某正单脉冲的宽度,采用何种方式可得到最大量程?若时钟频率为6MHZ,求允许测量的最大脉冲宽度是多少?
答:①设置:将外部脉冲引至INT0引脚上,设T0为定时器方式,并设T0为方式l,GATE 程控为l,TR0为1。

一旦INT0 (P3.2)引脚上出现高电平,定时器即开始定时,也就是它开始对时钟的机器周期进行计数,直至高电平出现。

此时读出T0值即可。

TMOD的设定(即控制字):
控制字为#09H。

初值为TH0=#00H,TL0=#00H。

②编程:
;脉冲宽度在R3(高字节)、R4(低字节)
START: MOV TMOD,#09H ;控制字
MOV TL0,#00H ;定时常数
MOV TH0,#00H
WAITl: JB P3.2,W AITl ;等待INT0变低
SETB TR0 ;启动定时器T0计数(机器周期数) WAIT2: JNB P3.2,W AIT2 ;等待INT0变高(正脉冲到来)
WAIT3: JB P3.2,W AIT3 ;等待INT0变低
CLR TR0 ;定时器停止计数
MOV A,TL0 ;先读低位
MOV R4,A 存人R4中
MOV A,TH0 ;再读高位
MOV R3,A
RET
③由于定时器方式1的长度为16位,其最大计数值为216=65535,即正脉冲的宽度最大值不能超过65535个机器周期。

如果时钟频率为6MHz,允许测量的最大脉冲宽度是:65535×2us=131.070ms。

4·10 80C51的串行口有几种工作方式及其功能特点?如何选择和设定?
答:在串行口控制寄存器SCON中的SM0和SMl位决定串行口的工作方式;SM2位决定串行口应用于多处理机通信方式。

(1)方式0
当SMO=0,SMl=0时,串行口选择方式0。

这种工作方式实质上是一种同步移位寄存器方式。

方式0时,数据传输波特率固定为1/l2f osc。

数据由RXD(P3.0)引脚输入或输出,同步移位时钟由TXD(P3.1)引脚输出。

接收/发送的是8位数据,传输时低位在前。

帧格式如下:
(2)方式1
当SMO=0.SMl=1时,串行口选择方式1。

方式1时,数据传输波特率由定时器/计数器Tl和T2的溢出决定,可用程序设定。

由TxD(P3.1)引脚发送数据,由RXD(P3.0)引脚接收数据。

发送或接收一帧信息为10位,1位起始位(0)、8位数据位和1位停止位(1)。

帧格式如下:
(3)方式2和3
当SM0=l,SMl=0时,串行口选择方式2;当SM0=l,SMl=1时,串行口选择方式3。

方式2和3的区别在于它们波特率产生方式不同。

方式2的波特率是固定的,为振荡器频率的1/32 f osc或1/64 f osc ;方式3的波特率则由定时器/计数器Tl和T2的溢出决定,可用程序设定的。

由TYD(P3.1)引脚发送数据,由RXD(P3.0)引脚接收数据。

发送或接收一帧信息为11位,1位起始位(0)、9位数据位和1位停止位(1),
帧格式如下:
(4)多处理机通信方式
在串行口控制寄存器SCON中,设有多处理机通信位SM2(SCON.5)。

当串行口以方式2或方式3接收时,若SM2=1,如果接收到的第9位数据(RB8)为l,才将数据送人接收缓冲器SBUF,并RI置1发中断;否则,数据将丢失。

若SM2=0,则无论第9位数据(RB8)是1还是0,都能将数据装人SBUF,并且发中断。

利用这一特性,便可实现主机与多个从机之间的串行通信。

4·11 何谓波特率、溢出率?如何计算和设置80C51串行通信的波特率?
答:1·波特率、溢出率
波特率(Baudrate)是指每秒钟传输的数据位数,波特率发生器用于控制串行口的数据传输速率。

溢出率是指某定时器每秒钟溢出的次数,亦即定时器定时时间的倒数。

2·波特率的计算和设置
(1)串行口方式0时的波特率
由振荡器的频率(f osc)所确定:
f osc
波特率=
12
(2)串行口方式2时的波特率
由振荡器的频率(f osc)和SMOD(PCON.7)所确定
f osc 2SOMD
波特率= ×
32 2
f osc f osc
当SMOD=l时,波特率= ;当SMOD=0时,波特率= 。

32 64
(3)串行口方式1和3时的波特率
由定时器Tl和T2的溢出率和SMOD(PCON.7)所确定。

定时器Tl和T2是可编程
的,可选择的波特率范围比较大,因此,串行口的方式1和3是最常用的工作方式。

①用定时器Tl(C/T=O)产生波特率时:
2SMOD
波特率= ×定时器Tl的溢出率
32
定时器Tl的溢出率与它的工作方式有关:
●定时器Tl工作于方式0: 此时定时器Tl相当于一个13位的计数器。

f osc 1
溢出率= ×
12 [213– T C+X]
式中: T C——13位定时器定时常数(初值);
X ——中断服务程序的机器周期数,在中断服务程序中重新对定时器置数。

●定时器Tl工作于方式1: 此时定时器Tl相当于一个16位的计数器。

f osc 1
溢出率= ×
12 [216– T C+X]
●定时器Tl工作于方式2: 此时定时器Tl工作于一个8位可重装的方式,用TLl计
数,用THl装初值。

f osc 1
溢出率= ×
12 [28–(TH1)]
方式2是一种自动重装方式,无需在中断服务程序中送数,没有由于中断引起的误差,也应禁止定时器Tl中断。

这种方式用于波特率设定最为有用。

②用定时器T2(80C52)产生波特率时:
波特率=(1/16)×定时器T2的溢出率
f osc 1
溢出率= ×
2 [216一(RCAP2H,RCAP2L)]
式中: (RCAP2H.RCAP2L)为定时器T2中,16位寄存器的初值(定时常数)。

4·12 为什么定时器Tl用做串行口波特率发生器时,常采用方式2? 若己知系统时钟频率和通信波特率,如何计算其初始值?
答:①定时器Tl用做串行口波特率发生器时,常采用方式2的原因是:
定时器Tl工作于方式2是一种自动重装方式,无需在中断服务程序中送数,没有由于中断引起的误差,也应禁止定时器Tl中断。

采用方式2是一种既省事又精确的产生串行口波特率的方法。

②若已知系统时钟频率和通信波特率,计算其初始值:
以串行口采用方式1或3,波特率发生器采用定时器Tl的方式2为例。

2SMOD
波特率= ×定时器Tl的溢出率
32
f osc 1
溢出率= ×
12 [28–(TH1)]
2SMOD f osc 1
波特率= ××
32 12 [28–(TH1)]
2SMOD f osc 1
TH1=28 - (××)
32 12 波特率
将计算出的数值送人THl和TLl即可。

4·13 某异步通信接口,其帧格式由一个起始位0、七个数据位、一个奇偶校验位和一位停止位1所组戎,当该口每分钟传送1800个字符时,计算其传送波特率。

答:帧格式由一个起始位0、七个数据位、一个奇偶校验位和一位停止位1所组成,即每帧为10位。

每分钟传送1800个字符时,每字符发送的位数为10位,则每分钟发送的总位数为18000。

传送波特率应为:
18000/60 =300 b/s
4·14 在80C51的应用系统中时钟频率为6MHZ,现需利用定时器Tl产生波特率为1200 波特。

请计算初值,实际得到的波特率误差是多少?
答: 以串行口采用方式1或3,波特率发生器采用定时器Tl的方式2为例。

2SMOD f osc 1
波特率= ××
32 12 [28–T C]
2SMOD f osc 1
T C =28 - (××)=
32 12 波特率
256 - (1/32)×(6×106/12)×(1/1200)=256 – 13=0F3H
其中设SMOD=l。

根据初值Tc=243,计算波特率的实际值为:
2SMOD f osc 1
波特率= ××= 1201.92
32 12 [28–T C]
误差=1201.92-1200=1.92
4·15 80C51有几个中断源,各中断标志是如何产生的,又如何复零的? CPU响应中断时,其中断入口地址各是多少?
答:(1)80C51的中断源
①80C51中有五个中断源;80C52中增多了一个中断源一一定时器/计数器T2,即有六个中断源。

80C51的五个中断源是:
●INT0(P3.2) ——外部中断0。

当IT0(TCON.0)=1时,低电平有效;当IT0(TCON.0)=0时,下降沿有效。

●INTl(P3.3) ——外部中断1。

当ITl(TCON.2)=1时,低电平有效;当TTl(TCON.2)=0时,下降沿有效。

●TF0(P3.4) ——定时器/计数器T0溢出中断。

●TFl(P3.5) ——定时器/计数器Tl溢出中断。

●RX,TX ——串行中断。

②中断标志的产生和复零:
●Tl溢出中断标志:TFl(TCON.7)。

Tl计数溢出。

硬件置位,响应中断时,硬件复位。

不使用中断时用软件清0。

●T0溢出中断标志:TF0(TCON.5)。

T0计数溢出。

硬件置位,响应中断时,硬件复位。

不使用中断时用软件清0。

●外部中断1中断标志:IEl(TCON.3)。

当CPU采样到INT1端出现有效中断请求时,TEl位硬件置1;响应中断后,转向中断服务时,硬件复位。

●外部中断0中断标志:IE0(TCON.l)。

当CPU采样到INT0端出现有效中断请求时,IE0位硬件置1;响应中断后,转向中断服务时,硬件复位。

●串行中断发送中断标志:TI(SCON.l)。

发送完一帧,硬件置位;响应中断后,必须软件清0。

●串行中断接收中断标志:RI(SCON.O)。

接收完一帧,硬件置位;响应中断后,必须软件清0。

(2)中断入口地址
中断源中断入口地址
外部中断0(INT0) 0003H
定时器/计数器0(T0) 000BH
外部中断1(INTl) 0013H
定时器/计数器1(T1) 00lBH
串行口(RI、TI) 0023H
4·16 如何估算最快的中断响应时间?
答:(1)中断响应过程
中断响应过程的时序如题图4-2所示。

题图4-2
①在每个机器周期的S5P2期间,各中断标志采样相应的中断源。

CPU则在下一机器周期的S6期间按优先级的顺序查询各中断标志。

若查询到某中断标志为1,则按优先级的高低进行处理,即响应中断。

②响应中断后,执行硬件生成的长调用指令"LCALL",将程序计数器PC的内容压入堆栈保护,先低位地址,后高位地址,栈指针加2。

③将对应中断源的中断矢量地址装人程序计数器PC,使程序转向该中断矢量地址,去执行中断服务程序。

④中断服务程序由中断矢量地址开始执行,直到遇到RETI指令为止。

⑤执行RETI指令,撤销中断申请,弹出断口地址进入PC,先弹出高位地址,后弹出低位地址,栈指针减2,恢复原程序的执行。

(2)中断响应时间
中断响应时间是指从中断有效(对应标志位置1)到转向中断入口地址所需要的时间。

80C51单片机的最快的中断响应时间为三个机器周。

其中,中断请求标志位查询占一个机器周期,而这个机器周期又恰好是指令的最后一个机器周期。

在这个机器周期结束后,中断即被响应,产生"LCALL"指令。

执行这条长调用指令需两个机器周期。

这样,中断响应共经历了一个查询机器周期和两个"LCALL"指令执行机器周期,总计三个机器周期。

4·17 外部中断请求有哪两种触发方式?对跳变触发和电平触发信号有什么要求? 如何选择和设置?
答:(1)外部中断请求的触发方式
INT0、INT1的中断触发方式有两种:
①电平触发方式,低电平有效。

②跳变触发方式,电平发生由高到低的跳变时触发。

(2)对跳变触发和电平触发信号的要求
由于CPU每个机器周期采样INT0、INT1引脚信号一次,为确保中断请求被采样到,外部中断源送INT0、INT1引脚的中断请求信号应至少保持一个机器周期。

如果是跳变触发方式,外部中断源送INT0、INT1脚的中断请求信号高、低电平应至少各保持一个机器周期,才能确保CPU采集到电平的跳变。

如果是电平触发方式,则外部中断源送INT0、INT1引脚请求中断的低电平有效信号,应一直保持到CPU响应中断为止。

(3)触发方式的选择和设置
这两种触发方式可由设置TCON寄存器中的ITl((TCON.2)、IT0((TCON.0)中断申请
触发方式控制位来选择:
①设置ITl、IT0=0,选择电平触发方式。

②设置ITl、IT0=1,选择跳变触发方式,即当INT0、INT1引脚检测到前一个机器周期为高电平、后一个器周期为低电平时,则置位IE0、IEl,向CPU申请中断。

4·18 80C51提供哪几种中断? 在中断管理上有何特点? 什么是同级内的优先权管理? 中断请求被封锁的条件有哪些?
答:(1)80C51提供的中断
80C51提供的中断有五种: 外部中断0、外部申断1、定时器/计数器T0溢出中断、定时器/计数器Tl溢出中断和串行中断。

(2)在申断管理上的特点
在中断执行过程中,中断管理的原则是:
①高中断优先级可以中断低中断优先级的中断过程。

但是,若在中断服务程序中,关掉所有中断(CLR EA)或关掉部分中断时除外。

②低中断优先级不能申断高中断优先级的中断过程。

③同级别的中断不能相互中断。

(3)同级内的优先权管理
如果几个同级的中断源同时向CPU申请中断时,CPU通过内部硬件查询按自然优先级确定该响应哪个中断请求。

其自然优先级由硬件形成,排列如下:
中断源同级优先级
INT0 最高级
T0
INT1
T1
串行口最低级
(4)中断请求被封锁的条件
在接受中断申请时,如遇下列情况,硬件生成的长调用指令"LCALL"将被封锁:
①正在执行同级或高一级的中断服务程序。

②当前周期不是执行当前指令的最后一个周期; 当前正在执行RETI指令或执行对IE、IP的读/写操作指令。

相关文档
最新文档