第 7 章 mcs - 51 串行口

25
7 7 MCS MCS 51 51 第第第 第第第 7.1 7.1 第第第第第第第第第 第第第第第第第第第 7.2 7.2 第第第第 第第第第 7.3 7.3 第第第第第第第第第 第第第第第第第第第 7.4 7.4 第第第第第 第第第第第

Upload: velma-slater

Post on 03-Jan-2016

64 views

Category:

Documents


2 download

DESCRIPTION

第 7 章 MCS - 51 串行口. 7.1 串口通讯的基本方式. 7.2 串口控制. 7.3 串行接口的工作方式. 7.4 串口的应用. 起始位. D 0. D 2. D 3. D 4. D 6. D 7. D 5. D 1. 停止位. 7.1 串口通讯的基本方式. ( 一 ). 异步通讯 以字符为传送单位用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。 异步通讯常用格式:一个字符帧. 异步通讯的双方需要两项约定: 1. 字符格式 一帧字符位数的规定:数据位,校验位,起始位和停止位。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 7 章   MCS - 51 串行口

第第 77 章 章 MCSMCS -- 5151 串行串行口口

7.1 7.1 串口通讯的基本方式串口通讯的基本方式

7.2 7.2 串口控制串口控制

7.3 7.3 串行接口的工作方式串行接口的工作方式

7.4 7.4 串口的应用串口的应用

Page 2: 第 7 章   MCS - 51 串行口

7.1 7.1 串口通讯的基本方式串口通讯的基本方式

( 一 ). 异步通讯以字符为传送单位用起始位和停止位标识每个字符的开始和结束字

符间隔不固定,只需字符传送时同步。异步通讯常用格式:一个字符帧

异步通讯的双方需要两项约定:1.字符格式一帧字符位数的规定:数据位,校验位,起始位和停止位。2. 波特率 (位 /秒 )对传送速率的规定例:要求每秒传送 120个字符,每帧为 10位。解: B=120×10=1200 波特 每位 0.83ms数据位传输率 =120×8=960 位 /秒( 二 ). 同步通讯以一串字符为一个传送单位,字符间不加标识位,在一串字符开

始用同步字符标识,硬件要求高,通讯双方须严格同步。

D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位

Page 3: 第 7 章   MCS - 51 串行口

二 .串行接口功能1.发送器:并串数据格式转换,添加标识位和校验

位,一帧发送结束,设置结束标志,申请中断。2.接收器:串并数据格式转换,检查错误,去掉标

识位,保存有效数据,设置接收结束标志,申请中断。3.控制器:接收编程命令和控制参数,设置工作方式:

同步 /异步、字符格式、波特率、校验方式、数据位与同步时钟比例等。

三 .串行数据传送方向单工通讯:数据单向传送。半双工通讯:数据可分时双向传送。全双工通讯:可同时进行发送和接收。

发送器 接收器发送器接收器

Page 4: 第 7 章   MCS - 51 串行口

7.2 MCS-51 串行控制 1 个全双工串行接口,可同时进行发送和接收。

串行接口输入 /输出引脚: TXD(P3.1) 、 RXD(P3.0)数据格式:按不同方式,一帧位数 8/10/11 发送 /接

收时,数据皆低位在前。

一帧字符发送 /接收结束,置位标志位 (TI/RI) 并申请 SIO 中断。中断控制:中断允许位 ES中断入口: 0023H

D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位

D0 D1 D2 D3 D4D5 D6 D7

D0 D1 D2 D3 D4 D5 D6 D8 停止位起始位 D7

Page 5: 第 7 章   MCS - 51 串行口

串行接口控制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.节电控制寄存器 PCONSMOD(PCON.7) :波特率加倍控制位。SMOD=1 ,波特率加倍, SMOD=0 ,则不加倍。

Page 6: 第 7 章   MCS - 51 串行口

7.3 串行接口的工作方式 由 SM0 , SM1 选择四种工作方式。

(1) 方式 0:同步移位寄存器方式。用于扩展并行 I/O 接口。1. 一帧 8位,无起始位和停止位。2.RXD :数据输入 /输出端。 TXD :同步脉冲输出端,每个脉冲对应一个数据位。3.波特率 B = fosc/12

如: fosc=12MHz , B=1MHz ,每位数据占 1s 。4. 发送过程:串行数据从 RXD 引脚输出, TXD 引脚输出移位脉冲。 CP

U 将数据写入发送寄存器( SBUF )时,立即启动发送,将 8位数据以 fos/12 的固定波特率从 RXD 输出,低位在前,高位在后。发送完一帧数据后,发送中断标志 TI由硬件置位。

5.接收过程:当串行口以方式 0接收时,先置位允许接收控制位 REN 。此时, RXD 为串行数据输入端, TXD 仍为同步脉冲移位输出端。当( RI) =0 和( REN ) =1 同时满足时,开始接收。当接收到第 8位数据时,将数据移入接收寄存器,并由硬件置位 RI。

Page 7: 第 7 章   MCS - 51 串行口

发送时序

写入SBUF

RXD 输出

TXD

TI

D0 D1 D2 D3 D4 D5 D6 D7

写REN=1RI=0RXD 输入

RI

接收时序

(a)

(b)

方式 0发送和接收过程时序

Page 8: 第 7 章   MCS - 51 串行口

•数据从 RXD( P3.0 )引脚串行输出,低位在先,高位在后; TXD( P3.1 )引脚输出移位脉冲,其频率为 foc/12 ;发送完毕后,中断标志位 TI为 1。如要发送数据,如下所示:

•    MOV SCON,#00H ; 串行口方式 0• MOV SBUF,A ; 将数据送出• JNB TI,$ ; 等待数据发送完毕

移位寄存器方式

Page 9: 第 7 章   MCS - 51 串行口

下面两图分别是方式 0扩展输出和输入的接线图

Page 10: 第 7 章   MCS - 51 串行口

(2) 方式 1 8 位数据异步通讯方式。

1. 一帧 10 位: 8 位数据位, 1 个起始位 (0) , 1 个停止位 (1) 。 2.RXD :接收数据端。 TXD :发送数据端。3. 波特率:用 T1 作为波特率发生器, B=(2SMOD/32)×T1溢出率。4. 发送:当 CPU执行 MOV A , SBUF 指令将数据写入发送缓冲 SBUF 时,就启

动发送。串行数据从 TXD 引脚输出,发送完一帧数据后,就由硬件置位 TI。 接收: REN=1 ,允许接收。串行口采样 RXD 引脚,当采样到 1至 0 的跳变时,

确认是开始位 0,就开始接收一帧数据。只有当 RI=0且停止位为 1或者( SM2) =0时,停止位才进入 RB8 , 8位数据才能进入接收寄存器,并由硬件置位中断标志 RI;否则丢弃接收数据,不置位 RI。所以在方式 1接收时,应先用软件清零 RI和 SM2 标志。

当 REN=1 , CPU 开始采样 RXD 引脚负跳变信号,若出现负跳变,才进入数据接收状态,先检测起始位,若第一位为 0,继续接收其余位;否则,停止接收,重新采样负跳变。

数据采样速率为波特率 16倍频,在数据位中间,用第 7、 8、 9个脉冲采样 3次数据位,并 3中取 2保留采样值。

Page 11: 第 7 章   MCS - 51 串行口

写入SBUF

采样

( a ) 发送时序图

TXD数据输出

TI

D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位

RXD输入数据

( b ) 接收时序图

D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位

RI

检测负跳变

串行方式 1发送和接收时序图

Page 12: 第 7 章   MCS - 51 串行口

(3) 方式 2和方式 39 位数据异步通讯方式。1.一帧为 11位: 9位数据位, 1个起始位 (0) , 1个停止位 (1) 。 第

9位数据位在 TB8/RB8 中,常用作校验位和多机通讯标识位。2.RXD :接收数据端, TXD :发送数据端。3.波特率: 方式 2: B=(2SMOD/64)×fosc 。

方式 3: B=(2SMOD/32)×T1溢出率 。4.发送:发送的串行数据由 TXD 端输出一帧信息为 11位,第 9位附加数

据来自 SCON 寄存器的 TB8 位,用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。当 CPU执行一条数据写入 SUBF 的指令时,就启动发送器发送。发送一帧信息后,置位中断标志 TI。

5. 接收: REN=1 ,允许接收。串行口采样 RXD 引脚,当采样到 1至 0 的跳变时,确认是开始位 0,就开始接收一帧数据。在接收到附加的第 9位数据后,当( RI) =0 或者( SM2 ) =0 时,第 9位数据才进入 RB8 , 8位数据才能进入接收寄存器,并由硬件置位中断标志 RI;否则信息丢失。且不置位 RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测 RXD上从 1到 0的跳变。

Page 13: 第 7 章   MCS - 51 串行口

发送时序

写入SBUF

TXD 输出

TI

RXD 输入

接收时序

RI

D0 D1 D2 D3 D4 D5 D6 TB8 停止位起始位

D7

D0 D1 D2 D3 D4 D5D6 RB8 停止位

起始位D7

检测负跳变

串行方式 2、 3发送和接收时序图

Page 14: 第 7 章   MCS - 51 串行口

( 4)波特率的计算在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在

8051 串行口的四种工作方式中,方式 0和 2的波特率是固定的,而方式 1和 3的波特率是可变的,由定时器 T1的溢出率控制。

方式 0为固定波特率: B=fosc/12方式 2可选两种波特率: B=(2SMOD /64)×fosc 方式 1、 3为可变波特率,用 T1作波特率发生器。

B=(2SMOD/32)×T1溢出率T1为方式 2的时间常数: X = 28 - t/T溢出时间: t= (28 -X)T = (28 -X)×12/ foscT1溢出率 =1/t= fosc /[12×(2n -X)]

波特率 B=(2SMOD /32)×fosc/[12×(28-X)]串行口方式 1、 3,根据波特率选择 T1工作方式,计算时间常数。T1选方式 2: TH1=X= 28-fosc/12×2SMOD/(32×B)T1 选方式 1用于低波特率,需考虑 T1重装时间常数时间。

Page 15: 第 7 章   MCS - 51 串行口

当时钟频率选用 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 

Page 16: 第 7 章   MCS - 51 串行口

7.4 串行口的应用串行口初始化编程格式:

SIO: MOV SCON , #控制状态字;写方式字且 TI=RI=0 (MOV PCON , #80H) ;波特率加倍 ( MOV TMOD , #20H ) ; T1作波特率发生器

( MOV TH1 , #X ) ;选定波特率 ( MOV TL1 , #X ) ( SETB TR1) ( SETB EA) ;开串行口中断 ( SETB ES)

Page 17: 第 7 章   MCS - 51 串行口

发送程序:先发送一个字符,等待 TI=1 后再发送下一个字符。1.查询方式:TRAM : MOV A , @R0 ;取数据

MOV SBUF , A ;发送一个字符WAIT : JBC TI , NEXT ;等待发送结束

SJMP WAITNEXT : INC R0 ;准备下一次发送

SJMP TRAM2. 中断方式:

ORG 0023H ;串行口中断入口 AJMP SINT

MAIN : … ;初始化编程TRAM : MOV A , @R0 ;取数据

MOV SBUF , A ;发送第一个字符H: SJMP H ;其它工作SINT : CLR TI ;中断服务程序

INC R0MOV A , @R0 ;取数据MOV SBUF , A ;发送下一个字符RETI

Page 18: 第 7 章   MCS - 51 串行口

接收程序: REN=1 、 RI=0 等待接收,当 RI=1 ,从 SBUF 读取数据。1.查询方式: WAIT : JBC RI , NEXT ;查询等待

SJMP WAITNEXT : MOV A , SBUF ;读取接收数据

MOV @R0 , A ;保存数据INC R0 ;准备下一次接收SJMP WAIT

2. 中断方式:ORG 0023HAJMP RINT

MAIN : … ;初始化编程 H : SJMP H ;其它任务 RINT : CLR RI ;清中断标志

MOV A , SBUF ;读取接收数据MOV @R0 , A ;保存数据INC R0RETI

Page 19: 第 7 章   MCS - 51 串行口

(一)串行口方式 0 用于扩展单片机的并行 I/O 接口。

编程 8051 单片机串行口方式 0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。

Page 20: 第 7 章   MCS - 51 串行口

例:用 8051 串行口外接 CD4094 扩展 8位并行输出口,如图所示, 8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。 串行口方式 0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于 TI或 RI 标志。串行发送时,可以靠 TI 置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或 者通过查询 TI 的状态,只要 TI为 0就继续查询, TI为 1就结束查询,发送下一帧数据。在串行接收时,则由 RI引起中断或对 RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器 SCON 进行初始化。在方式 0中将,将 00H 送 SCON就可以了。下面给出应用程序:

Page 21: 第 7 章   MCS - 51 串行口

ORG 2000H START: MOV SCON,#00H ; 置串行口工作方式 0

MOV A,#80H ;最高位灯先亮 CLR P1.0 ;关闭并行输出(避象传输过程中,各 LE

D 的“暗红”现象)OUT0: MOV SBUF,A ; 开始串行输出 OUT1: JNB TI,OUT1 ; 输出完否

CLR TI ; 完了,清 TI标志,以备下次发送 SETB P1.0 ;打开并行口输出 ACALL DELAY ;延时一段时间 RR A ;循环右移 CLR P1.0 ;关闭并行输出 JMP OUT0 ;循环

说明: DELAY 延时子程序前 面已经讲过,这里就不给出了。

Page 22: 第 7 章   MCS - 51 串行口

( 二 )异步通讯程序举例 1. 发送程序:将片内 RAM 50H 起始单元的 16 个数由串行口发送。要求发送波特率为系统时钟的 32 分频,并进行奇偶校验。MAINT : MOV SCON , #80H ;串行口初始化

MOV PCON , #80H ;波特率SETB EASETB ES ;开串行口中断MOV R0 , #50H ;设数据指针MOV R7 , #10H ;数据长度

LOOP : MOV A , @R0 ;取一个字符MOV C , P ;加奇偶校验MOV TB8 , CMOV SBUF , A ;启动一次发送

HERE : SJMP HERE ; CPU执行其它任务

Page 23: 第 7 章   MCS - 51 串行口

ORG 0023H ;串行口中断入口AJMP TRANI

TRANI : PUSH A ;保护现场PUSH PSWCLR TI ;清发送结束标志DJNZ R7 , NEXT ;是否发送完?

CLR ES ;发送完,关闭串行口中断 SJMP TEND

NEXT : INC R0 ;未发送完,修改指针MOV A , @R0 ;取下一个字符MOV C , P ;加奇偶校验MOV TB8 , CMOV SBUF , A ;发送一个字符POP PSW ;恢复现场POP A

TEND : RETI ;中断返回

Page 24: 第 7 章   MCS - 51 串行口

2. 接收程序: 串行输入 16个字符,存入片内 RAM 的 50H 起始单元,串行口波特率为 2400( 设晶振为 11.0592MHz) 。

RECS : MOV SCON , #50H ;串行口方式 1允许接收MOV TMOD , #20H ; T1 方式 2定

时 MOV TL1 , #0F4H ;写入 T1时间常数 MOV TH1 , #0F4H

SETB TR1 ;启动 T1MOV R0 , #50H ;设数据

指针 MOV R7 , #10H ;接收数据长度 WAIT: JBC RI , NEXT ;等待串行口接收

SJMP WAITNEXT: MOV A , SBUF ;读取接收字符

MOV @R0 , A ;保存一个字符INC R0 ;修改指针DJNZ R7 , WAIT ;全部字符接收完 ?RET

SM0 SM1 SM2 REN TB8 RB8 TI RI

Page 25: 第 7 章   MCS - 51 串行口

3. 接收程序: 串行输入 16个字符,进行奇偶校验。RECS : MOV SCON , #0D0H ;串行口方式 3允许接收

MOV TMOD , #20H ; T1 方式 2定时 MOV TL1 , #0F4H ;写入 T1时间常数

MOV TH1 , #0F4HSETB TR1 ;启动 T1

MOV R0 , #50H ;设数据指针 MOV R7 , #10H ;接收数据长度 WAIT: JBC RI , NEXT ;等待串行口接收

SJMP WAITNEXT: MOV A , SBUF ;取一个接收字符

JNB P , COMP ;奇偶校验JNB RB8 , ERR ; P≠RB8 ,数据出错

SJMP RIGHT ; P=RB8 ,数据正确COMP: JB RB8 , ERRRIGHT: MOV @R0 , A ;保存一个字符

INC R0 ;修改指针DJNZ R7 , WAIT ;全部字符接收完 ?CLR F0 ; F0 =0 ,接收数据全部正确

RETERR : SETB F0 ; F0 =1 ,接收数据出错RET