1、第6章 51单片机内部定时器/计数器 及串行接口,6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器 6.3 工作方式 6.4 定时器/计数器应用举例 6.5 51单片机的串行接口 6.6 串行口的应用,在工业检测、控制中,很多场合都要用到计数或者定时功能。例如对外部脉冲进行计数、产生精确的定时时间、作串行口的波特率发声器等。MCS51单片机内部有两个可编程的定时器/计数器,以满足这方面的需要。它们具有 两种工作模数(计数器模式、 定时器模式)和四种工作方式( 方式0、方式1、方式2、方式3),其控制字均在相应的特殊功能寄存器(SFR)中,通过对它的SFR的编程,可以方便的选择工
2、作模数和工作方式。,定时器/计数器: Timer/Counter本质上都是加法计数器,当对固定周期的脉冲信号计数时是定时器,对脉冲长度不确定的信号计数时是计数器。每接收到一个计数脉冲,加法计数器的值就加一,当计满时发生溢出,并从0开始继续计数。加法计数器的计满溢出信号就是定时/计数器的输出,该信号使TCON的某位(TF0或TF1位)置一,作为定时器/计数器的溢出中断标志。,6.1 定时器/计数器的结构及工作原理,图 6.1 定时器/计数器结构框图,6.2 方式和控制寄存器,一、 定时器/计数器的方式寄存器TMOD,图 6.2 TMOD各位定义,8位分为两组,高四位控制T1,低4位控制T0。,对
3、TMOD的各个位的说明: GATE位:门控位。GATE1时,T0、T1是否计数要受到外部引脚输入电平的控制,INT0引脚控制T0,INT1引脚控制T1。可用于测量在INT0和INT1引脚出现的正脉冲的宽度。若GATE0,即不使能门控功能,定时计数器的运行不受外部输入引脚INT0、INT1的控制。,C/T位:计数器模式和定时器模式的选择位。 C/T0,为定时器模式,内部计数器对晶振脉冲12分频后的脉冲计数,该脉冲周期等于机器周期,所以可以理解为对机器周期进行计数。从计数值可以求得计数的时间,所以称为定时器模式。 C/T1,为计数器模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部
4、脉冲(负跳变)计数,允许的最高计数频率为晶振频率的1/24。,M1 M0:四种工作方式的选择位,表 6.1 工作方式选择表,定时器初值的确定:加法计数器是计满溢出时才申请中断, 所以在给定时器/计数器赋初值时, 不能直接输入所需的计数值, 而应输入的是计数器计数的最大值与这一计数值的差值, 设最大值为 M, 计数值为 N, 初值为 X, 则 X的计算方法如下: 计数状态: X=MN定时状态: X=M定时时间/T而 T=12晶振频率,二、 定时器/计数器控制寄存器TCONTF0、TF1分别是定时器/计数器T0、 T1 的溢出标志位, 加法计数器计满溢出时置 1, 申请中断, 在中断响应后自动复
5、0。TF产生的中断申请是否被接受, 还需要由中断是否开放来决定。TR1、TR0 分别是定时器 /计数器T1、 T0 的运行控制位, 通过软件置 1 后, 定时器 /计数器才开始工作, 在系统复位时被清 0。,6.3 工作方式,一、 方式 0,图6.3 方式 0(13位计数器),在方式0下,T0和T1工作在13位的定时/计数器方式,由TH的高 8 位和TL的低 5 位组成。当T0的13位计数器加到全部为 1 以后,再加1就产生溢出,这时置TCON的TF0为 1 ,同时把计数器全部变 0 ,然后从 0 开始继续计数。,方式0的计数长度M为2的13次方。初值也是13位二进制数,但要注意是高8位赋值给
6、TH0,低5位前面补足 3 个 0 凑成 8 位赋给TL0。例如,如要求计数值为1000,则初值为xM1000819210001C18H1 1100 000 1 1000B则赋初值时,TH00E0H,TL018H。,二、 方式1,图 6.4 方式 1(16位计数器),方式1和方式0的工作原理基本相同,唯一不同是T0和T1工作在方式1时是16位的计数/定时器。方式1时的计数长度M是2的16次方。16位的初值直接拆成高低字节,分别送入TH和TL即可。,三、方式 2,图 6.5 方式 2(初始常数自动重装载),工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时
7、就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。工作方式2就针对这个问题而设置,它具有自动重装载功能,即自动加载计数初值,所以也称为自动重加载工作方式。,在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,不再象方式0和方式1那样需要“人工干预”,由软件重新赋值,而是由预置寄存器TH以硬件方法自动给计数器TL0重新加载。,四、 方式 3,图 6.6 方式 3(两个 8 位独立计数器),在工作方式3模式下,定时/计数器0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以
8、作计数器使用,也可以作为定时器使用,定时/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。TH0就没有那么多“资源”可利用了,只能作为简单的定时器使用,而且由于定时/计数器0的控制位已被TL0占用,因此只能借用定时/计数器1的控制位TR1和TF1,也就是以计数溢出去置位TF1,TR1则负责控制TH0定时的启动和停止。,由于TL0既能作定时器也能作计数器使用,而TH0只能作定时器使用而不能作计数器使用,因此在方式3模式下,定时/计数器0可以构成二个定时器或者一个定时器和一个计数器。 如果定时/计数器0工作于工作方式3,那么定时/计数器1的工作方式就不可避免受到一定的
9、限制,因为自己的一些控制位已被定时/计数器借用,只能工作在方式0、方式1或方式2下,如果设置T1工作在方式3,则T1停止工作,相当于其他方式时令TR10。,6.4 定时器/计数器应用举例,一、 方式 0 的应用例 1 利用定时器输出周期为 2 ms的方波, 设单片机晶振频率为 6 MHz。 选用定时器 /计数器T0 作定时器, 输出为P1.0 引脚, 2 ms 的方波可由间隔 1 ms的高低电平相间而成, 因而只要每隔 1 ms对 P1.0 取反一次即可得到这个方波。 定时 1 ms的初值: 因为 机器周期=126 MHz= 2 s 所以 1 ms内T0 需要计数N次: N= 1 ms2 s
10、= 500,由此可知: 使用方式 0 的 13 位计数器即可, T0 的初值X为X=MN=8 192500=7 692=1E0CH但是, 因为 13 位计数器中, 低 8 位 TL0 只使用了 5 位, 其余码均计入高 8 位TH0 的初值, 则 T0 的初值调整为TH0=0F0H, TL0=0CHTMOD初始化: TMOD=00000000B=00H(GATE=0, C/T=0, M1=0, M0=0)TCON初始化: 启动TR0=1IE初始化: 开放中断EA=1, 定时器T0 中断允许ET0=1,程序清单如下: ORG 0000H AJMP START; 复位入口ORG 000BHAJMP
11、 TOINT ; T0中断入口ORG 0030H START: MOV SP, 60H; 初始化程序MOV TH0, 0F0H ; T0赋初值MOV TL0, 0CHMOV TMOD, 00HSETB TR0 ; 启动T0,SETB ET0 ; 开T0中断SETB EA ; 开总允许中断MAIN: AJMP MAIN ; 主程序T0INT: CPL P1.0MOV TL0, 0CHMOV TH0, 0F0HRETI,二、 方式 1应用方式 1 与方式 0 基本相同, 只是方式 1 改用了 16 位计数器。 要求定时周期较长时, 13 位计数器不够用, 可改用 16 位计数器。 例 2 已知某生
12、产线的传送带上不断地有产品单向传送, 产品之间有较大间隔。使用光电开关统计一定时间内的产品个数。 假定红灯亮时停止统计, 红灯灭时才在上次统计结果的基础上继续统计, 试用单片机定时器 /计数器T1的方式 1完成该项产品的计数任务。,图 6.7 硬件原理图,(1) 初始化: TMOD=11010000B=0D0H(GATE=1, C/T=1, M0M1=01)TCON=00H(2) T1在方式1时, 溢出产生中断, 且计数器回零, 故在中断服务程序中, 需用R0计数中断次数, 以保护累积计数结果。,(3) 启动T1计数, 开T1中断。 程序清单如下:,ORG 0000H AJMP START ;
13、 复位入口ORG 001BHAJMP T1INT ; T1中断入口ORG 0100HSTART: MOV SP, 60H ; 初始化程序MOV TCON, 00HMOV TMOD, 0D0HMOV TH1, 00H,MOV TL1, 00HMOV R0, 00H ; 清中断次数计数单元MOV P3, 28H; 设置P3.5第二功能SETB TR1 ; 启动T1SETB ET1; 开T1中断SETB EA ; 开总中断MAIN: ACALL DISP ; 主程序, 调显示子程序ORG 0A00H T1INT: INC R0 ; 中断服务子程序RETIDISP: ; 显示子程序RET,三、 方式
14、2 应用 方式 2 是定时器自动重装载的操作方式, 在这种方式下, 定时器 0 和 1 的工作是相同的, 它的工作过程与方式 0、 方式 1 基本相同, 只不过在溢出的同时, 将 8 位二进制初值自动重装载, 即在中断服务子程序中, 不需要编程送初值, 这里不再举例。定时器 T1 工作在方式 2 时, 可直接用作串行口波特率发生器,四、 方式 3 的应用定时器 T0 工作在方式 3 时是 2 个 8 位定时器 /计数器。 且TH0 借用了定时器 T1 的溢出中断标志TF1和运行控制位 TR1。 例 3 假设有一个用户系统中已使用了两个外部中断源, 并置定时器 T1 于方式 2, 作串行口波特率
15、发生器用, 现要求再增加一个外部中断源, 并由 P1.0 口输出一个 5K Hz的方波(假设晶振频率为 6 MHz)。,在不增加其它硬件开销时, 可把定时器/计数器 T0 置于工作方式 3, 利用外部引脚 T0端作附加的外部中断输入端, 把 TL0 预置为 0FFH, 这样在 T0 端出现由 1至 0 的负跳变时, TL0 立即溢出, 申请中断, 相当于边沿激活的外部中断源。 在方式 3下, TH0 总是作 8 位定时器用, 可以靠它来控制由 P1.0 输出的 5 kHz方波。 由 P1.0 输出 5 kHz的方波, 即每隔 100 s使 P1.0 的电平发生一次变化。则TH0中的初始值 X=
16、MN=256100/2=206。 下面是有关的程序。,MOV TL0, 0FFH MOV TH0, 206MOV TL1, BAUD ; BAUD根据波特率要求设置常数MOV TH1, BAUDMOV MOD, 27H ; 置T0工作方式3; TL0工作于计数器方式MOVTCON, 55H ; 启动定时器 T0、 T1, 置外部中断 0 和 1; 为边沿激活方式 MOVIE, 9FH ; 开放全部中断,TL0 溢出中断服务程序(由 000BH单元转来): TL0INT: MOV TL0, 0FFH ; 外部引脚 T0 引起中断处理程序RETI TH0 溢出中断服务程序(由 001BH转来):
17、TH0INT: MOVTH0, 206CPL P1.0RETI 此处串行口中断服务程序、 外中断 0和外中断 1的中断服务程序没有列出。,6.5 MCS - 51单片机的串行接口,6.5.1 串行通信的基本概念,并行 和 串行并行通信的优点是速度快,效率高,确点是不适合远距离通信。串行通信刚好相反。 单工、半双工 和 全双工单工:信息只能沿着一个方向传播半双工:信息可以沿一条线双向传播,但不能同时实 现双向传播。全双工:使用两条独立的数据通道,收发可同时进行。,同步方式和异步方式(1) 同步方式是将一大批数据分成几个数据块, 数据块之间用同步字符予以隔开, 而传输的各位二进制码之间都没有间隔。
18、 其基本特征是发送与接收时钟始终保持严格同步。 (2)异步通信是按帧传送数据, 它利用每一帧的起、止信号来建立发送与接收之间的同步,每帧内部各位均采用固定的时间间隔, 但帧与帧之间的时间间隔是随机的。其基本特征是每个字符必须用起始位和停止位作为字符开始和结束的标志, 它是以字符为单位一个个地发送和接收的。,6.5.2 与串行口有关的特殊功能寄存器,1. 数据缓冲器SBUF串行口缓冲器SBUF是可直接寻址的特殊功能寄存器, 其内部RAM字节地址是99H。在物理上, 它对应着两个独立的寄存器, 一个发送寄存器, 一个接收寄存器。发送时, 就是CPU写 SBUF的时候(51 系列单片机没有专门的启动
19、发送状态的指令); 接收时, 就是读取SBUF的过程, 接收寄存器是双缓冲的, 以避免在接收下一帧数据之前, CPU未能及时响应接收器的中断, 没有把上一帧数据读走, 而产生两帧数据重叠的问题。,2. 串行口控制寄存器SCONSCON用于控制和监视串行口的工作状态, 其各位定义如图 5.3 所示。相应的各位功能介绍如下: SM0、SM1: 用于定义串行口的操作模式, 两个选择位对应 4 种模式,见表6.2。其中fOSC是振荡器频率, UART为通用异步接收和发送器的英文缩写。SM2: 多机通信时的接收允许标志位。 在模式 2 和 3 中, 若SM2 = 1, 且接收到的第 9 位数据(RB8)
20、是 0, 则接收中断标志(RI)不会被激活。在模式1中, 若SM2=1 且没有接收到有效的停止位, 则 RI不会被激活。 在模式 0 中, SM2 必须是 0。,表6.2 串行口操作模式选择,3. 电源控制寄存器PCON特殊功能寄存器PCON中, 只有一位(最高位)SMOD与串行口的工作有关, 该位是串行口波特率系数的控制位: SMOD=1 时, 波特率加倍, 否则不加倍。PCON的地址为 87H, 不可位寻址, 因此初始化时需要字节传送。,6.5.3 串行口的 4 种工作模式,模式 0 同步移位寄存器输入输出模式,可外接移位寄存器,以扩展I/O口。(1) 模式 0 输出状态。,图 6.8 外
21、接移位寄存器输出,(2) 模式 0 输入状态。 当满足RI=0且REN0时,就启动一次接收过程。,图6.9 外接移位寄存器输入,2. 模式 1串行口工作于模式 1 时, 为波特率可变的 8 位异步通信接口。数据位由 P3.0 (RXD)端接收, 由P3.1(TXD)端发送。 传送一帧信息为 10 位: 一位起始位(0), 8 位数据位(低位在前)和一位停止位(1)。波特率是可变的, 它取决于定时器 T1 的溢出速率及SMOD的状态。 (1) 模式 1 发送过程。 用软件清除 TI后, CPU执行任何一条以 SBUF为目标寄存器的指令, 就启动发送过程。数据由 TXD引脚输出, 此时的发送移位脉
22、冲是由定时器 /计数器 T1 送来的溢出信号经过 16 或 32 分频而取得的。一帧信号发送完时, 将置位发送中断标志TI=1, 向CPU申请中断, 完成一次发送过程。,(2) 模式 1 接收过程。 用软件清除 RI后, 当允许接收位 REN被置位 1 时, 接收器以选定波特率的 16 倍的速率采样 RXD引脚上的电平, 即在一个数据位期间有 16 个检测脉冲, 并在第 7、 8、9 个脉冲期间采样接收信号, 然后用三中取二的原则确定检测值, 以抑制干扰。 并且采样是在每个数据位的中间, 避免了信号边沿的波形失真造成的采样错误。当检测到有从“1”到“0”的负跳变时, 则启动接收过程, 在接收移
23、位脉冲的控制下, 接收完一帧信息。 当最后一次移位脉冲产生时能满足下列两个条件: RI=0; 接收到的停止位为 1 或 SM2=0。,则停止位送入RB8,8位数据进入SBUF,并置RI1,完成一次接收过程。否则,所接收到的一桢信息将丢失,接收器复位,并从新开始检测负跳变,以便接收下一桢信息。注意:接收中断标志RI应由软件清除。,3. 模式 2 和模式 3。 串行口工作于模式 2 和模式 3 时, 被定义为 9 位异步通信接口。 它们的每帧数据结构是 11 位的: 最低位是起始位(0), 其后是 8 位数据位(低位在先), 第 10 位是用户定义位(SCON中的 TB8或 RB8), 最后一位是
24、停止位(1)。模式 2 和模式3 工作原理相似, 唯一的差别是模式 2 的波特率是固定的, 即为 f / 32或 fOSC / 64; 而模式 3的波特率是可变的, 与定时器 T1的溢出率有关。,(1) 模式 2和模式 3的发送过程。 发送过程是由执行任何一条 SBUF为目的寄存器的指令来启动的。 由“写入SBUF”信号把 8位数据装入 SBUF, 同时还把 TB8 装入发送移位寄存器的第 9 位, 并通知发送控制器要求进行一次发送。发送开始, 把一个起始位(0)送到 TXD端。 移位后, 数据由移位寄存器送到TXD端。再过一位, 出现第一个移位脉冲。 第一次移位时, 把一个停止位“1”由控制
25、器的停止位发生端送入移位寄存器的第 9 位。 此后, 每次移位时, 把 0 送入第 9 位。因此, 当 TB8 的内容送到移位寄存器的输出位置时, 其左面一位是停止位“1”, 而再往左的所有位全为“0”。 这种状态由零检测器检测到后, 就通知发送控制器作最后一次移位, 然后置 TI=1, 请求申请中断。第 9 位数据(TB8)由软件置位或清零, 可以作为数据的奇偶校验位, 也可以作为多机通信中的地址、数据标志位。如把 TB8 作为奇偶校验位, 可以在发送程序中, 在数据写入 SBUF之前, 先将数据位写入 TB8。,(2) 模式2和模式3接收过程。 与模式 1类似, 模式 2和模式 3接收过程
26、始于在 RXD端检测到负跳变时,为此, CPU以波特率 16倍的采样速率对 RXD端不断采样。一检测到负跳变, 16分频计数器就立刻复位, 同时把1FFH写入输入移位寄存器。计数器的16个状态把一位时间等分成16份, 在每一位的第7、8、9个状态时, 位检测器对 RXD端的值采样。如果所接收到的起始位无效(为1),则复位接收电路, 等待另一个负跳变的到来。 若起始位有效(为 0)则起始位移入移位寄存器, 并开始接收这一帧的其余位。 当起始位 0 移到最左面时, 通知接收控制器进行最后一次移位。 把 8 位数据装入接收缓冲器 SBUF, 第 9 位数据装入SCON中的 RB8, 并置中断标志RI
27、=1。,装入 SBUF和 RB8以及置位 RI的信号只有在产生最后一个移位脉冲且同满足下列两个条件, 才会产生: RI=0; SM2 =0 或接收到的第 9 位数据为“1”。 上述两个条件中任一个不满足, 所接收的数据帧就会丢失, 不再恢复。 两者都满足时, 第 9 位数据装入 TB8, 前 8 位数据装入 SBUF。 请注意: 与模式 1 不同, 模式 2 和 3 中装入 RB8 的是第 9 位数据, 而不是停止位。所接收的停止位的值与SBUF、 RB8 和 RI都没有关系, 利用这一特点可用于多机通信中。,6.5.4 多机通信,图 6.10 多处理机通信系统,6.5.5 波特率串行口每秒钟
28、发送或接收的数据位数称为波特率。 假设发送一位数据所需时间为T, 则波特率为 1/T。 (1) 模式 0 的波特率等于单片机晶振频率的 1/12, 即每个机器周期接收或发送一位数据。 (2) 模式 2 的波特率与电源控制器PCON的最高位SMOD的写入值有关: 即SMOD=0, 波特率为(1/64) fOSC; SMOD=1, 波特率为(1/32)fOSC。,(3) 模式 1 和模式 3 的波特率除了与SMOD位有关之外, 还与定时器 T1 的溢出率有关。 定时器 T1 作为波特率发生器, 常选用定时方式 2( 8 位重装载初值方式), 并且禁止 T1 中断。此时 TH1 从初值计数到产生溢出
29、, 它每秒钟溢出的次数称为溢出率。 于是,表 6.3 定时器T1产生的常用波特率,假设某MCS - 51 单片机系统, 串行口工作于模式 3, 要求传送波特率为1 200 Hz, 作为波特率发生器的定时器T1工作在方式 2 时, 请求出计数初值为多少? 设单片机的振荡频率为6 MHz。 因为串行口工作于模式 3 时的波特率为,所以,当SMOD=0 时, 初值TH1=256-6106/(1 2001232/1)=243=0F3H当SMOD=1 时, 初值TH1=256-6106/(12001232/2)=230=0E6H,6.6 串行口的应用,一、 串行口的编程串行口需初始化后, 才能完成数据的
30、输入、输出。其初始化过程如下: (1) 按选定串行口的操作模式设定SCON的SM0、SM1两位二进制编码。(2) 对于操作模式 2 或 3, 应根据需要在 TB8 中写入待发送的第 9 位数据。(3) 若选定的操作模式不是模式 0, 还需设定接收/发送的波特率。设定SMOD的状态, 以控制波特率是否加倍。若选定操作模式1或3, 则应对定时器 T1进行初始化以设定其溢出率。,二、 串行口的应用,例1 用 8051 串行口外接 74LS165 移位寄存器扩展8位输入口, 输入数据由 8 个开关提供, 另有一个开关 K提供联络信号。电路示意如图6.11 所示。当开关K合上时, 表示要求输入数据。输入
31、 8 位开关量, 处理不同的程序。,图 6.11,程序如下: START: JB P1.0, $ ; 开关K未合上, 等待SETB P1.1 ; 165并行输入数据CLR P1.1 ; 开始串行移位MOV SCON, 10H ; 串行口模式 0并启动接收JNB RI, $ ; 查询RICLR RI ; 查询结束, 清RIMOV A, SBUF ; 输入数据 ; 根据 A处理不同任务SJMP START ; 准备下一次接收。,例 2 利用串行口进行双机通信。,图 6.12 双机通信系统,甲机发送(采用查询方式):MOV SCON, 80H ; 设置工作方式2MOV PCON, 00; 置SMOD
32、=0, 波特率不加倍MOV R0, 40H ; 数据区地址指针MOVR2, 10H ; 数据长度 LOOP: MOV A, R0 ; 取发送数据MOV C, P ; 奇偶位送TB8MOVTB8, CMOV SBUF, A ; 送串口并开始发送数据,WAIT: JBCTI, NEXT ; 检测是否发送结束并清TISJMP WAIT NEXT: INC R0; 修改发送数据地址指针DJNZR2, LOOPRET 乙机接收(查询方式): MOV SCON, 90H; 模作模式2, 并允许接收 MOV PCON, 00H; 置SMOD=0 MOV RO, 60H ; 置数据区地址指针 MOV R2,
33、10H ; 等待接收数据长度,LOOP: JBC RI, READ ; 等待接收数据并清RISJMP LOOP READ: MOV A, SBUF ; 读一帧数据MOV C, PJNC LP0 ; C不为 1 转LP0JNB RB8, ERR ; RB8=0, 即 RB8不为 P转ERRAJMP LP1 LP0: JB RB8, ERR ; RB8=1, 即 RB8不为 P转ERR LP1: MOV R0, A ; RB8=P, 接收一帧数据INC R0DJNZ R2, LOOPRET ERR: ; 出错处理程序,例 2 单片机和PC之间利用串行口进行通信51单片机有一个全双工的串行通讯口,和PC机之间可以方便地进行串口通讯。电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,可以采用专用芯片MAX232,也可以用几个三极管进行转换,但还是用专用芯片简单可靠。一般采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。,TTL电平和RS-232电平的转换,