|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。+ j% V% C- ]( i; x; }
第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源,单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。& D# a3 u4 ]. J# S( N
第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。
3 \# r- B* F9 A( U% G5 a$ q9 {第三、中断的响应过程:当有事件产生,进入中断之前我们必须先记住现在看书的第几页了,或拿一个书签放在当前页的位置,然后去处理不一样的事情(因为处理完了,我们还要回来继续看书):电话铃响我们要到放电话的地方去,门铃响我们要到门那边去,也说是不一样的中断,我们要在不一样的地点处理,而这个地点常常还是固定的。计算机中也是采用的这种办法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。具体地说,中断响应能分为以下几个步骤:1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。2、寻找中断入口,根据5个不一样的中断源所产生的中断,查找5个不一样的入口地址。以上工作是由计算机自动完成的,与编程者无关。在这5个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序放在那儿,就错了,中断程序就不能被执行到)。3、执行中断处理程序。4、中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。究竟单片机是怎么样找到中断程序所在位置,又怎么返回的呢?我们稍后再谈。3 v: ~6 h k$ K* r. z( y! M0 ]! _' _ c
MCS-51单片机中断系统的结构:
! i! q4 v' F: g B C5个中断源的符号、名称及产生的条件如下。: t/ A* h1 @2 \
INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。
1 i3 B/ }5 {+ U2 @0 @INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。% |4 r% C7 I. b) w' k5 D1 ? z
T0:定时器/计数器0中断,由T0计满回零引起。) a. x6 y; y$ |8 t4 u- z4 b
T1:定时器/计数器l中断,由T1计满回零引起。
G$ x: r! C3 _8 L" p @. `TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。; [ m% e1 \5 J! U: y d6 b
整个中断系统的结构框图见下图一所示。: m1 h/ b1 w: z
![]()
0 c2 L" a: `. O2 M. s7 u<51单片机中断系统结构>
/ O- Y: G$ G; H6 S ~! R5 O) u( d如图所示,由与中断有关的特殊功能寄存器、中断入口、次序查询逻辑电路等组成,包括5个中断请求源,4个用于中断控制的寄存器IE、IP、ECON和SCON来控制中断类弄、中断的开、关和各种中断源的优先级确定。/ s4 K( v3 j+ x) i* Y
中断请求源:
3 B5 Q/ P) |! k4 A4 i(1)外部中断请求源:即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名称为INT0、INT1,也就是P3.2、P3.3这两个管脚。在内部的TCON中有四位是与外中断有关的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。IT1、IE1的用途和IT0、IE0相同。(2)内部中断请求源TF0:定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串行口中再讲解。2、中断允许寄存器IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的。见下表EAX6 C; B& e" T5 F9 T5 D" n. _$ j
其中EA是总开关,如果它等于0,则所有中断都不允许。ES-串行口中断允许ET1-定时器1中断允许EX1-外中断1中断允许。ET0-定时器0中断允许EX0-外中断0中断允许。如果我们要设置允许外中断1,定时器1中断允许,其它不允许,则IE能是EAX
- e" w3 N9 c1 }3 g6 b即8CH,当然,我们也能用位操作指令SETB EA* F/ U: L2 W+ [$ o
SETB ET1SETB EX1
. M2 @" \/ p$ A; \来实现它。3、五个中断源的自然优先级与中断服务入口地址外中断0:0003H定时器0:000BH外中断1:0013H定时器1:001BH串行口:0023H它们的自然优先级由高到低排列。写到这里,大家应当明白,为什么前面有一些程序一始我们这样写:: ~' P" r1 @( m$ B0 x0 Y0 d& V3 T, x
ORG 0000HLJMP START, h- I5 {; p) h( n/ o" R W# ^
ORG 0030H
& Y+ k. l1 g* p- ? lSTART:。- d- w* V2 H$ G( [7 z9 K- z
这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。/ T8 l) G$ L2 h; [: m
开机时,每个中断都处于低优先级,我们能用指令对优先级进行设置。看表2中断优先级中由中断优先级寄存器IP来高置的,IP中某位设为1,对应的中断就是高优先级,不然就是低优先级。
c5 Z0 r5 Q5 L) _: F5 T" fXX0 `$ ?8 B% u$ s4 d
X
* I: s- d) F Z( G' d! Z7 r0 yPS
% {0 M) ~0 F7 W0 G ?! YPT1
8 H) K3 {) w/ B, y* E+ XPX1
/ `* a! b! c1 z4 ]5 T& M' yPT0
, ]4 D4 s* s- C/ T) L) p, UPX0$ W) V5 `+ I; M" q" \& p% A, h
例:设有如下要求,将T0、外中断1设为高优先级,其它为低优先级,求IP的值。IP的首3位没用,可任意取值,设为000,后面根据要求写就能了XX$ t4 o% n3 F6 R1 Q6 @# _8 v9 b- U
因此,最终,IP的值就是06H。例:在上例中,如果5个中断请求同时发生,求中断响应的次序。响应次序为:定时器0->外中断1->外中断0->实时器1->串行中断。" }4 |5 q# |' Q) L& J
MCS-51的中断响应过程:
& }7 G+ Q* g) V8 C7 Z1、中断响应的条件:讲到这儿,我们依然对于计算机响应中断感到神奇,我们人能响应外界的事件,是因为我们有多种“传感器“――眼、耳能接受不一样的信息,计算机是如何做到这点的呢?其实说穿了,一点都不希奇,MCS51工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可计算机本来就是这样,它根本没人聪明。了解了上述中断的过程,就不难解中断响应的条件了。在下列三种情况之一时,CPU将封锁对中断的响应:
' F+ }# B4 j! P# f2 V4 H8 V! ACPU正在处理一个同级或更高级别的中断请求。
" o! j' z8 b7 B T9 k- d$ i现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。6 P; c, ~. Z* @$ s
当前正执行的指令是返回批令(RETI)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才能响应中断。3 w8 p1 p3 ]5 i: L
2、中断响应过程CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将对应的中断入口地址送入PC,PC是程序指针,CPU取指令就根据PC中的值,PC中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个LJMP指令,不就能把中断程序跳转到任何地方了吗?一个完整的主程序看起来应该是这样的:. ~5 e# Z% D6 c$ v+ b/ Z1 X
ORG 0000HLJMP START
$ u/ E' }, j0 }0 QORG 0003H
8 R" l5 { V5 |3 n7 qLJMP INT0 ;转外中断0ORG 000BH
& i6 Y& z. a/ C GRETI ;没有用定时器0中断,在此放一条RETI,万一 “不小心“产生了中断,也不会有太大的后果。。
3 H6 J1 P. A. N4 b$ D# f; Y中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程序中用到了如A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。
6 K9 v2 J6 n" l1 w3 F中断系统的控制寄存器:
+ f( u$ F0 v9 ]) W# B中断系统有两个控制寄存器IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。
& \: o; y0 T* ^0 _9 x, Q1.中断允许寄存器--IE' `' j) [: l! ~' J u
IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。/ O( f% C3 {$ |( X2 d2 w
IE用来打开或关断各中断源的中断请求,基本格式如下图二所示:' h& a4 `% p, t* _
+ s+ d% d: S8 I* u1 u5 Q![]()
' ]% U7 b" Z2 y& h- M2 |1 @EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。! I f( I/ O3 q8 W! K
×:无效位。
0 x. ` V7 t1 X5 f% O2 lES:串行I/O中断允许位。ES=1,打开串行I/O中断;ES=0,关闭串行I/O中断。
" {4 j/ {4 |6 F1 t: e' {ETl;定时器/计数器1中断允许位。ETl=1,打开T1中断;ETl=O,关闭T1中断。- w. B% v0 _1 K+ J* {* C- b
EXl:外部中断l中断允许位。EXl=1,打开INT1;EXl=0,关闭INT1。1 W4 P0 p; [4 L" ^# |9 S1 e+ i
ET0:定时器/计数器0中断允许位。ET0=1,打开T0中断;ET0=0,关闭TO中断。
5 S/ v6 w3 ?# W9 U' {1 CEXO:外部中断0中断允许位。Ex0=1,打开INT0;EX0=0,关闭INT0.
3 R! n6 n3 W, [' {% H% ]. j4 x6 D' ?
中断优先寄存器--IP:
+ V0 F2 F+ v) Q, JIP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH,IP用来设定各个中断源属于两级中断中的哪一级,IP的基本格式如下图三所示: w3 z' M' n/ l8 C* L
+ A# t, g9 d0 b1 G9 I
×:无效位。* ^* E+ s" G! e# Y+ {& h
PS:串行I/O中断优先级控制位。PS=1,高优先级;PS=0,低优先级。
Z G/ D$ } K% d0 `% B+ \" c/ ]5 QPTl:定时器/计数器1中断优先级控制位。PTl=1,高优先级;PTl=0,低优先级。 _ G% e( I- f& J; k8 x- L- m
Pxl:外部中断1中断优先级控制位。Pxl=1,高优先级;PXl=O,低优先级。3 p& r) E ~+ M- @& C) c1 x
PT0:定时器/计数器o中断优先级控制位。PT0=1,高优先级;PTO=0,低优先级。
- }( u5 v4 Z% v- f# H# dPx0:外部中断0中断优先级控制位。Px0=1,高优先级;Px0=0,伤优先级。; j+ Q. N) a1 T, k$ X2 Z9 X
在MCS-51单片机系列中,高级中断能够打断低级中断以形成中断嵌套;同级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,则CPU按如下顺序确定响应的先后顺序:% o& }4 ~4 l9 p2 }/ x3 _4 x% g
INT0一T0---INT1一T1一RI/T1.
0 x9 A u" C3 Z4 {0 j% s中断的响应过程 J7 J; ]& w% A1 |
若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且①当前正在执行的那条指令已被执行完' k- N& ]5 @' n: T4 Q t5 g1 b# {
1、当前末响应同级或高级中断
2 `, P3 d* y2 |# _5 r Z2、不是在操作IE,IP中断控制寄存器或执行REH指令则单片机响应此中断。
* ?7 E% `" f0 E, R4 f. O在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器周期。中断得到响应后,自动清除中断请求标志(对串行I/O端口的中断标志,要用软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口地址装入PC,使程序转入到相应的中断服务程序中去执行。6 V) |; m' {0 k
各个中断源在程序存储器中的中断入口地址如下:
% z4 M9 }3 e: H9 o* J5 Q9 p中断源 入口地址. K4 X! H. l# e2 g, X
INT0(外部中断0) 0003H
, g4 z1 ^& ?9 R* V# }0 i& S+ _, C! ATF0(TO中断) 000BH
, b" u7 x+ ^ ~+ dINT1(外部中断1) 0013H
, b4 ?3 h {7 i% E9 i( x7 K) ~# ETFl(T1中断) 001BH
3 Z0 K1 f; V+ |RI/TI(串行口中断) 0023H. ~1 v2 E. M6 I: k/ j
由于各个中断入口地址相隔甚近,不便于存放各个较长的中断服务程序,故通常在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入到安排在那儿的中断服务程序。以T1中断为例,其过程下如图四所示。
" u' y5 h M1 s4 p; M由于5个中断源各有其中断请求标志0,TF0,IEl,TFl以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。如果某一中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到CPU响应了中断为止,对串行口中断而言,这一过程与其它4个中断的不同之处在于;即使CPU响应了中断,其中断标志RI/TI也不会自动清零,必须在中断服务程序中设置清除RI/TI的指令后,才会再一次地提出中断请求。
7 t* d- b' Z% E. Y3 O; v; O I |1 ACPU的现场保护和恢复必须由被响应的相应中断服务程序去完成,当执行RETI中断返回指令后,断点值自动从栈顶2字节弹出,并装入PC寄存器,使CPU继续执行被打断了的程序。 q8 \. F1 h$ M
下面给出一个应用定时器中断的实例。
0 t( i- x! c2 S0 Q5 E0 q6 Q6 R现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率. x5 v6 g& f& i8 A% A% n+ U
Fosc=6MHZ.$ X* C5 k4 v2 n& A- P1 u
1、方法:利用定时器T0作1ms定时,达到定时值后引起中断,在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。
4 b% i/ x3 H ^3 L$ Q2、定时初值:机器周期MC=12/fosc=2us。所以定时lms所需的机器周期个数为500D,亦即0lF4H。设T0为工作方式1(16位方式),则定时初值是(01F4H)求补=FEOCH7 J/ S$ @& }' C7 e' }8 D
7 C* l) V( X b/ E. p* T7 f
6 m0 a) K1 j5 L- v9 h
START: | MOV TMOD,#01H | ;T0为定时器状态,工作方式1 | | MOV TL0,#0CH | ;T0的低位定时初值 | | MOV TH0,#0FEH | ;T0的高位定时初值 | | MOV TCON,#10H | ;打开T0 | | SETB ET0 | ;1ET0,即允许T0中断 | | SETB EA | ;1EA,即充许全局中断 | | AJMP $ | ;动态暂存 | 000BH: | AJMP IST0 | ;转入T0中断服务程序入口地址IST0 | IST0: | MOV TL0,#0CH | ;重置定时器初值 | | MOV TH0,#0FEH | ;重置定时器初值 | | CPL P1.0 | ;P1.0取反 | | RET1 | ;中断返回 | 串行端口的控制寄存器:
0 H# _! l: z" f a串行端口共有2个控制寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。8 K v# P; l: g, H
①串行口控制寄存器SCON
* [: s1 w% k1 R% S* SSCON的字节地址是98H,位地址(由低位到高位)分别是98H一9FH。SCON的格式如图五所示。! |; i, l2 z/ S. |" Q; k! B
6 y9 }+ k; C/ @4 r* i1 [
SMo,SMl:3 P$ Y$ ?% p. j% u
串行口工作方式控制位。
9 m5 ^4 ?2 t9 O! u% v/ W: D00--方式0;01--方式1;
6 K9 Z7 K2 ~; B, I! L10--方式2;11--方式3。
" f! ~- t9 q& q M0 v, xSM2:: o3 U; C- D1 W. r6 r
仅用于方式2和方式3的多机通讯控制位
% t. M" _$ b# s( o, u发送机SM2=1(要求程控设置)。; w, l! ?1 O; \; J+ i5 F' r
当为方式2或方式3时:
5 j( {4 `, {$ Q0 \接收机 SM2=1时,若RB8=1,可引起串行接收中断;若RB8=0,不
# W/ o( p; B) D( j" ~, Y4 h1 }引起串行接收中断。SM2=0时,若RB8=1,可引起串行接收中断;若 g& c7 d4 b4 P& T4 X" B: G
RB8=0,亦可引起串行接收中断。
! Y5 A7 y9 |% T# A. GREN:& N" {8 J. `( D. y& J
串行接收允许位。6 }& l3 F/ n6 ]0 V+ Z4 V
0--禁止接收;1--允许接收。
, x$ K- s# [ l, o% i( iTB8:
! `0 L4 U9 c0 D- G6 J0 \在方式2,3中,TB8是发送机要发送的第9位数据。
" l3 r! B% N$ J7 n. j# g0 i' z' MRB8:
' t+ X: D2 H* |- I在方式2,3中,RB8是接收机接收到的第9位数据,该数据正好来自发
, K8 G# Z( k/ c送机的TB8。 W+ c' l7 n# B- v& R+ b0 M* [
TI:7 w$ }* t/ h7 x% ~5 \" I# Y, K
发送中断标志位。发送前必须用软件清零,发送过程中TI保持零电平, k4 g0 g0 u. I4 O
发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。
% E* f' W4 K5 m5 {0 L' eRI:
! T% b4 W6 U; t接收中断标志位。接收前,必须用软件清零,接收过程中RI保持零电! r% I$ A% J& s1 v8 R7 \, g
平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件& C2 F; i6 w4 n) R
再清零。
* l! w4 `7 e/ `4 }- K' l/ V1 l电源控制寄存器PCON, C: C, \$ f4 M _2 R
PCON的字节地址为87H,无位地址,PCON的格式如图六所示。需指出的是,对80C31单片机而言,PCON还有几位有效控制位。
7 \7 p- e+ U; P: C![]()
" b( C$ g) |% C* y6 s! y$ _SMOD:波特率加倍位。在计算串行方式1,2,3的波特率时;0---不加倍;1---加倍。& X2 t. O6 y7 q" ?" L
串行中断的应用特点:
9 B: p J) k8 H R8031单片机的串行I/O端口是一个中断源,有两个中断标志RI和TI,RI用于接收,TI用于发送。/ [: W( r9 r$ U' V% h0 I
串行端口无论在何种工作方式下,发送/接收前都必须对TI/RI清零。当一帧数据发送/接收完后,TI/RI自动置1,如要再发送/接收,必须先用软件将其清除。
4 c/ B I6 g- b) \在串行中断被打开的条件下,对方式0和方式1来说,一帧数据发送/接收完后,除置位TI/RI外,还会引起串行中断请求,并执行串行中侧目务程序。但对方式2和方式3的接收机而言,还要视SM2和RB8的状态,才可确定RI是否被置位以及串行中断的开放:) X5 T: ?* c* T. s0 q
SM2 RB8 接收机中断标志与中断状态5 D. l! Z& y, }, x h6 j
0 1 激活RI,引起中断
3 z5 m& ?- {( t6 Z2 | |: P1 0 不激活RI,不引起中断4 h1 s6 g G. a1 W9 C
1 1 激活RI,引起中断& L# J: i3 z+ m/ `
单片机正是利用方式2,3的这一特点,实现多机间的通信。串行端口的常用应用方法见相关章节。
2 V" v' C) D. d波特率的确定:5 y' E: `* }' K7 f
对方式0来说,波特率已固定成fosc/12,随着外部晶振的频率不同,波特率亦不相同。常用的fosc有12MHz和6MHz,所以波特率相应为1000×103和500×103位/s。在此方式下,数据将自动地按固定的波特率发送/接收,完全不用设置。2 u+ j1 q# a6 o9 u; e, ?
对方式2而言,波特率的计算式为2SMOD·fosc/64。当SMOD=0时,波特率为fm/64;当SMOD=1时,波特率为fosc/32。在此方式下,程控设置SMOD位的状态后,波特率就确定了,不需要再作其它设置。# j8 W1 b; I2 n
对方式1和方式3来说,波特率的计算式为2SMOD/32×T1溢出率,根据SMOD状态位的不同,波特率有Tl/32溢出率和T1/16溢出率两种。由于T1溢出率的设置是方便的,因而波特率的选择将十分灵活。
6 i" N* t+ F4 f9 x3 |. W前已叙及,定时器Tl有4种工作方式,为了得到其溢出率,而又不必进入中断服务程序,往往使T1设置在工作方式2的运行状态,也就是8位自动加入时间常数的方式。由于在这种方式下,T1的溢出率(次/秒)计算式可表达成:
9 H+ T8 ? ~5 P: j# A) e: \![]()
. T# @) d6 w. C( V( \下面一段主程序和中断服务程序,是利用串行方式l从数据00H开始连续不断增大地串行发送一片数据的程序例。设单片机晶振的频率为6MHZ,波特率为1200位/秒。$ R- s4 P$ T; Q) {0 c" t, W
" Y h* r# K0 M2 d9 m0 n) _7 jORG 2000H | ;1200位/秒的定时器初值 | MOV TL1,#0F3H | | MOV TH1,#0F3H | ;使SMOD=0 | MOV PCON,#00H | ;T1方式2 | MOV TMOD,#20H | | SETB EA | | CLR ET1 | ;关闭T1中断 | SETB ES | ;开串行中断 | SETB TR1 | ;开T1定时 | MOV SCON,#40H | ;串行方式1 | CLR A | | MOV SBUF,A | ;串行发送 | JNB T1,$ | ;等待发送完 | CLR T1, | ;清标志 | SJMP $ | | ORG 0023H | ;串行中断入口地址 | MOV SBUF,A | ;连续发送 | JNB T1,$ | | INC A | | CLR T1 | | RET1 | ;中断返回 |
" A8 ?/ s! O9 `* ?
|
$ |& g, B3 S4 g$ r* \ | , A4 R( r$ S+ I( E
|
9 o1 G0 g3 V2 [1 |4 s | : t$ ?; e/ {1 R h7 ?
|
' d% _1 X+ M2 o. p |
$ a! [7 e4 k) Q, p7 j1 B |
|