4. 串行接口与定时计数器
description
Transcript of 4. 串行接口与定时计数器
4. 串行接口与定时计数器
1. 串行接口的一般概念 单片机与外界进行信息交换称之为通讯 (Communication) 。
单片机的通讯方式有两种: 并行通讯 : 数据的各位同时发送或接收。 串行通讯 : 数据一位一位顺序发送或接收。参看下图:
一、串行接口及应用
( 一 ). 异步通讯 以字符为传送单位用起始位和停止位标识每个字符的开始和结束。字符
间隔不固定,只需字符传送时同步。 异步通讯常用格式:一个字符帧
一 . 串行通讯的基本方式
D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位
异步通讯的双方需要两项约定:1. 字符格式一帧字符位数的规定:数据位,校验位,起始位和停止位。
2. 波特率 ( 位 / 秒 )—— 对传送速率的规定波特率:每秒钟传送的位数,记为 bps ( bit/sec )。例:要求每秒传送 120 个字符,每帧为 10 位。解: B=120×10=1200 波特 每位 0.83ms数据位传输率 =120×8=960 位 / 秒
(二)同步通讯:数据块传递开始要用同步字符来指示,
要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。
串行通信的校验方法
目的:保证高效而无差错的传送数据。校验位:可以奇校验、偶校验或没有校验位。
奇偶校验:主要用于对一个字符的传输过程进行校验。 通常把数据位和校验位中 1 的个数为奇数个称为奇校验。 通常把数据位和校验位中 1 的个数为偶数个称为偶校验。
异步传输信息冗余较大,例如: 1+8+1+2 中有效位数只有 8位。
串行传输中的数据传输方向如果在通信过程的任意时刻,信息只能由一方 A 传
到另一方 B ,则称为单工。(无线电对讲机)如果在任意时刻,信息既可由 A 传到 B ,又能由 B
传 A ,但只能由一个方向上的传输存在,称为半双工传输。如果在任意时刻,线路上存在 A 到 B 和 B 到 A 的
双向信号传输,则称为全双工。(电话)
1. 数据缓冲器 SBUF
发送 SBUF 和接收 SBUF 共用一个地址 99H 。
1 )发送 SBUF 存放待发送的 8 位数据,写入 SBUF 将同时启动发送。
发送指令: MOV SBUF , A2 )接收 SBUF 存放已接收成功的 8 位数据,供 CPU 读
取。 接收指令: MOV A , SBUF
一 . 串行接口控制字
SM0 SM1 SM2 REN TB8 RB8 TI RI
2. 串行口控制 / 状态寄存器 SCON(98H)
SM0 , SM1 :选择串行口 4 种工作方式。SM2 :多机控制位,用于多机通讯。REN :允许接收控制位, REN=1 ,允许接收; REN=0 ,禁止接收。TB8 发送的第 9 位数据位,可用作校验位和地址 / 数据标识位RB8 :接收的第 9 位数据位或停止位TI :发送中断标志,发送一帧结束, TI=1 ,必须软件清零RI :接收中断标志,接收一帧结束, RI=1 ,必须软件清零
3. 节电控制寄存器 PCON
SMOD(PCON.7) :波特率加倍控制位。SMOD=1 ,波特率加倍, SMOD=0 ,则不加倍。
串行口的工作方式方式 0 :同步方式(移位寄存器方式)
要想移位寄存器工作,需要向其时钟输入端 CLK送去移位脉冲,接收一个脉冲便移动一位。该脉冲由 TXD提供(移位脉冲),参与发送或接收的数据均出入于 RXD 端。可用于扩展8 位并行输入输出口
输出 : 将 8 位数据以 fos/12 的固定波特率从 RXD 输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI 由硬件置位。
输入 : 置位允许接收控制位 REN= 1 。当( RI ) =0和( REN ) =1 同时满足时,开始接收。当接收到第 8 位数据时,将数据移入接收寄存器,并由硬件置位 RI 。
方式 1: 波特率可变的 10 位异步通讯接口
发送或接收一帧信息,包括 1 个起始位 0 , 8 个数据位和 1个停止位 1 。
输出:串行数据从 TXD引脚输出,发送完一帧数据后,就由硬件置位 TI 。 输入:在( REN ) =1 时,串行口采样 RXD引脚,当采样到 1至 0 的跳变时,确认是开始位 0 ,就开始接收一帧数据。只有当( RI ) =0且停止位为 1 或者( SM2 ) =0 时,停止位才进入 RB8 , 8 位数据才能进入接收寄存器,并由硬件置位中断标志 RI ;否则信息丢失。所以在方式 1 接收时,应先用软件清零 RI 和 SM2 标志。
方式 2 :固定波特率的 11 位 UART方式它比方式 1增加了一位可程控为 1 或 0 的第 9 位数据。输出 : 它可作为多机通讯中地址 / 数据信息的标志位,也可以作为数据的奇偶校验位。输入 : 在接收到附加的第 9 位数据后,当( RI ) =0或者( SM2 ) =0 时,第 9 位数据才进入 RB8 , 8 位数据才能进入接收寄存器,并由硬件置位中断标志 RI ;否则信息丢失。且不置位 RI 。
再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测 RXD 上从 1 到 0 的跳变。
( 4 )方式 3 :异步第 9 位方式 方式 3 为波特率可变的 11 位 UART 方式。
除波特率外,其余与方式 2 相同。
当时钟频率选用 11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
右表列出了定时器 T1 工作于方式 2 常用波特率及初值。
常用波特率
Fosc(MHZ)
SMOD TH1 初值
19200 11.0592 1 FDH
9600 11.0592 0 FDH
4800 11.0592 0 FAH
2400 11.0592 0 F4h
1200 11.0592 0 E8h
串口的电平转换电路 RS232 使 EIA ( Electronics Indu
stries Association )组织推荐的、目前最常用的一种串行通讯接口标准。采用 25芯连接器或 9芯连接器。
常用电平为 -12V~+12V 逻辑“ 1” 为 -3V~-25V, 逻辑“ 0” 为 +3V~+25V TTL 与 EIA 之间需要用接口电路
进行转换
为什么需要电平转换电路
单片机使用的是 TTL电平,单片机的串口输出信号也是如此,
串行通信中一般使用的是 RS232 通信协议 需要外接接口进行电平匹配
MAX232 和单片机串口连接的典型电路
单片机和单片机之间的串行通信也需要电平转换芯片吗?
对于两个单片机而言,二者都是 TTL电平,所以不需要电平转换芯片。
定时 / 计数器中的核心部件为可预置初值计数器。预置初值后开始计数,直至计数值归 0 或产生溢出,可申请中断。
K1 K2
可预置初值计数器 中断请求
功能选择
启动控制
内部时钟脉冲(定时)
外部输入脉冲(计数)
溢出信号计数脉冲
计数初值
二.定时 / 计数器的工作原理
例:设 CTC 中为 8 位加 1 计数器。按要求选择功能和初值。
1. 要求检测到 100 个脉冲,发中断请求,通知 CPU 。选计数功能,计数初值为 156 。
2. 要求定时每隔 100s 时间,发一次中断请求。设内部时钟周期 1s
选定时功能,计数初值为 156 。
一.定时 / 计数器的应用1.计数功能:生产线上产品计数。每个产品通过得到一个脉冲信号,
计数器记录脉冲个数,当计数值与设定值相等,启动包装机器。
检测转速。电机转动一圈发出一个脉冲,计数器记录一秒时间内脉冲个数,显示转速。
2.定时功能:用于实时控制,定时采样、定时启动等。当定时时间与设定值相等,执行规定操作。
3 定时 / 计数器电路 CTC
3-2-1 MCS-51 定时 / 计数器
2 个可独立控制的 16 位定时器 / 计数器: T0 、 T1定时器初始化编程:1. 功能选择(定时 / 计数)2. 位数选择( 8/13/16 位)3. 启动方式选择(内部启动 / 外部启动)4. 启动控制(启动 / 停止)5.恢复初值方式(自动重装 / 软件重装)
GATE C/T M1 M0 GATE C/T M1 M0
1 )功能选择位 C/T :=0 ,定时功能,计数内部机器周期脉冲;=1 ,计数功能,计数引脚 T0(T1) 输入的负脉冲。
1.TMOD 定时器方式寄存器( 89H )
T1 T0
一 . 定时器控制、状态寄存器
2 )方式选择位 M1 、 M0 : 4 种工作方式: 13/16/8 位
M1 M0 方式 功能描述0 0 0 13 位0 1 1 16 位1 0 2 8 位自动重装1 1 3 T0 为两个 8 位
3 )门控方式选择位 GATE :
=0 ,非门控方式 (内部启动 ) :TRx=1 ,启动定时器工作;TRx=0 ,停止定时器工作。
=1 ,门控方式 ( 外部启动 ) : TRx=1且引脚 INTx=1才启动。
确定定时器工作方式指令: MOV TMOD , #方式字
例:设 T0 用方式 2非门控定时, T1 用方式 1门控计数。MOV TMOD , #
2.TCON 定时器控制 / 状态寄存器
1 )启动控制位 TR0 、 TR1=0 ,停止定时器工作=1 ,启动定时器工作例:启动 T0 : SETB TR0
2 )溢出中断标志位 TF0 、 TF1定时器溢出使 TFx=1 ,引起中断请求, CPU响应 Tx中断后,自动清 0 TFx。
可用软件检测 TFx,必须软件清 0 。WAIT : JBC TF0 , NEXT ;检测 T0是否溢出
SJMP WAIT ;未溢出,继续检测NEXT : … ;溢出, TF0 清 0 ,处理溢出
3.可预置初值的 16 位加 1 计数器 TH0 、 TL0 、 TH1 、TL1预置 T0初值指令: MOV TH0 , #XH
MOV TL0 , #XL
二 . 定时器工作方式由方式选择位 M1 、 M0设定
1. 方式 013 位定时 / 计数器。 THx 8 位和 TLx低 5位组成 13 位加 1 计数器
计数外部脉冲个数: 1~ 8192(21
3)定时时间 (T=1s) : 1s ~ 8.19
ms
2. 方式 116 位定时 / 计数器。 THx8 位和 TLx8 位组成 16 位加 1
计数器计数外部脉冲个数: 1~ 65536(216)定时时间 (T=1s) : 1s ~ 65536×T= 65.54ms
3. 方式 2
自动恢复初值 8 位定时 / 计数器。 TLx为 8 位加 1 计数器, THx为 8 位初值暂存器。
用于需要重复定时和计数的场合。最大计数值: 256 (28)最大定时时间 (T=1s) : 256s
4. 方式 3
T0分成 2 个 8 位定时器: TL0 定时 / 计数器和 TH0 定时器TL0占用 T0 控制位: C/T , TR0 ,GATE ;TH0占用 T1 控制位: TR1,TF1 。T1 不能使用方式 3 工作
5. 计算时间常数 X( 计算初值 )
计数功能: X= 2n -计数值 n : 8/13/16 定时功能: X= 2n - t/T t :定时时间、 T :机器周期
定时器初始化编程:使用定时器工作之前,先写入控制寄存器,确定好定时器工作方式
1. 按实际需要选择定时 / 计数功能2. 按时间或计数长度选择方式3. 计算时间常数
初始化编程格式:MOV TMOD , # 方式字;选择方式MOV THx , #XH ;装入 Tx 时间常数MOV TLx , #XL
(SETB EA ) ;开 Tx 中断(SETB ETx ) SETB TRx ;启动 Tx定时器
三 . MCS-51 定时器的应用
4. 溢出处理编程格式:
1 )查询方式:先查询定时器溢出标志,再进行溢出处理。… ;定时器初始化
WAIT : JBC TFx, PT ;检测溢出标志SJMP WAIT
PT : MOV THx, #XH ;重装时间常数MOV TLx, #XL
… ;溢出处理SJMP WAIT
2 )中断方式:初始化后执行其他任务,中断服务程序处理溢出。
ORG 0000HLJMP MAINORG 000BH(001BH) ; Tx中断入口LJMP PTS
MAIN : … ;初始化后执行其他程序
PTS : … ;溢出中断服务程序
MOV THx, #XH ;重装时间常数MOV TLx, #XLRETI
四 . 举例由 P1.0 输出方波信号,周期
为 2ms , 设 fosc=12MHz。
2ms
解:每隔 1ms改变一次 P1.0 的输出状态。用 T0非门控方式 1 定时。计算时间常数: X = 216 - t/T = 216 -1000/1 = FC18H
( 1 )查询方式: ORG 0000h
JMP STARTORG 1000H
START: MOV TMOD,#01HMOV TL0,#18HMOV TH0,#0FCHSETB TR0
LOOP: JBC TF0,PTF0SJMP LOOP
PTF0: CPL P1.0MOV TL0,#18HMOV TH0,#0FCHSJMP LOOP
END
( 2 )中断方式 ORG 0000HAJMPMAINORG 000BHAJMPPT0INTORG 0100H
MAIN: MOV SP,#60HMOV TMOD,#01HMOV TL0,#18HMOV TH0,#0FCHSETBEASETBET0SETBTR0
HERE: SJMP HERE PT0INT: CPL P1.0
MOV TL0,#18HMOV TH0,#0FCHRETI
END
长定时方法:增加一个软件计数器或一个硬件计数器。
硬件方式: T0 定时, T1 计数T0 的定时跳变信号 P1.0 的负跳变次
数,计满 5个跳变为 1 秒。
P1.0P1.0
P1.7P1.7
编制程序使 P1.7驱动 LED亮 1 秒灭 1 秒地闪烁。
设时钟频率为 6MHz
T0 方式 1 定时, T1 方式 2 计数T1 计数值为 5,初值为 #0FBH ;设置 T0 的定时值为 100ms ,初值为 #3CH ;T0溢出后 ( 每 100ms), P1.0反转一次同时 P1.0 每下跳变一次(反转两次), T1 计数一次累计 5次, P1.7反转一次
START : MOV TMOD , #61H ; T0 方式 1 定时, T1 方式 2 计数 MOV TL1 , #0FBH ;差 5 个负跳变就溢出,同时自动重装 MOV TH1 , #0FBH ; T1 计数值为 5 CLR P1.0 SETB TR1 ; T1 开始计数
LOOP1 : CPL P1.7LOOP2 : MOV TL0 , #3CH ;设置 T0 的定时值为 100ms ,
MOV TH0 , #0B0H ;每 100ms 作一次反相跳变 SETB TR0 ; T0 开始计数
LOOP3: JBC TF0 , LOOP4;T0溢出后 ( 每 100ms), P1.0反转一次SJMP LOOP3; 同时 P1.0 每下跳变一次(反转两次),
LOOP4 : CPL P1.0 ; T1 计数一次JBC TF1 , LOOP1 ;累计 5次, P1.7反转一次SJMP LOOP2
START: MOV TMOD,#61H;T0 方式 1 定时, T1 方式 2 计数 MOV TL1,#0FBH;差 5个负跳变就溢出,同时自动重装 MOV TH1,#0FBH;T1 计数值为 5 CLR P1.0 SETB TR1;T1 开始计数 LOOP1: CPL P1.7 LOOP2 : MOV TL0,#3CH;T设置 0 的定时值为 100ms ,
MOV TH0,#0B0H ;每 100ms 作一次反相跳变
SETB TR0 ;T0 开始计数 LOOP3: JBC TF0,LOOP4;T0溢出后 ( 每 100ms), P1.0反转一次 SJMP LOOP3;同时 P1.0 每下跳变一次(反转两次), LOOP4: CPL P1.0;T1 计数一次 JBC TF1,lOOP1; 累计 5次, P1.7反转一次 SJMP LOOP2 end
例定时器外部引脚 T0(T1) 用作外部中断信号输入端。
外部负脉冲引起中断请求,选计数方式,时间常数为 FFH 。
例:门控方式测量正脉冲宽度解: INT1 引脚输入被检测信
号,记录在正脉冲的时间内包含机器脉冲个数。
TR1=1 T1 启动 TR1=0(门控方式 ) ( T1
停止)
INT1
1 )设脉宽小于 65.5ms等待查询 INT1 ,正脉冲过后,读出 TH1TL1 。
START : MOV TMOD , #90H;T1门控方式( INT1= 1 启动定时),方式 1 定时
MOV TL1 , #0H ; T1 清零 MOV TH1 , #0H
WAIT1 : JB P3.3 , WAIT1 ;等待负脉冲的到来 SETB TR1 ;开始定时
WAIT2 : JNBP3.3 , WAIT2 ;等待正脉冲的到来
WAIT3 : JB P3.3 , WAIT3 ;等待负脉冲的到来CLR TR1 ;结束定时MOV R2 , TL1MOV R3 , TH1
…
2 )设脉宽大于 65.5ms ,中断方式记录 TH1TL1溢出中断次数。
SETB TR1SETB ET1 ;开 T1 中断SETB EA
WAIT2 : JNB P3.3 ,WAIT2 ;等待正脉冲到来WAIT3 : JB P3.3 ,WAIT3 ;等待正脉冲结束
CLR TR1 ;关闭 T1MOV IE , #00 ;关闭中断MOV R2 , TL1 ;读出 T1MOV R3 , TH1LCALL PPS ;计算脉宽
HERE : SJMP HERE ;其他任务PRIC :INC R4 ;记录溢出次数
RETIPPS : … ;计算脉宽子程序
计算脉宽的子程序的计算式如下:脉宽 t = ( R4 ×216 + R3 R2 ) ×T ( T 为机器周期)