串行通信
一.串行通信的基本方式
- 异步通信
- 以字符为传送单位,用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。
异步通信常用格式:一个字符帧![]()
- 异步通信的双方需要两项约定:
1.字符格式
一帧字符位数的规定:数据位,校验位,起始位和停止位。 - 2.波特率(位/秒)对传送速率的规定
例:要求每秒传送120个字符,每帧为10位。
解: B=120×10=1200波特 每位0.83ms
数据位传输率=120×8=960位/秒
- 以字符为传送单位,用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。
- 同步通信
- 以一串字符为一个传送单位,字符间不加标识位,在一串字符开始用同步字符标识,硬件要求高,通讯双方须严格同步。
二.串行接口功能
1.发送器:并串数据格式转换,添加标识位和校验位,一帧发送结束,设置结束标志,申请中断。
2.接收器:串并数据格式转换,检查错误,去掉标识位,保存有效数据,设置接收结束标志,申请中断。
3.控制器:接收编程命令和控制参数,设置工作方式:同步/异步、字符格式、波特率、校验方式、数据位与同步时钟比例等。
三.串行数据传送方向
- 单工通信:数据单向传送。
- 半双工通信:数据可分时双向传送。
- 全双工通信:可同时进行发送和接收。
-----------------------------------------------------------------------------------------------
MCS-51串行接口
1个全双工串行接口,可同时进行发送和接收。
串行接口输入/输出引脚:TXD(P3.1)、RXD(P3.0)
数据格式如图3.7-1:按不同方式,一帧位数 8/10/11发送接收时,数据皆低位在前。

一帧字符发送/接收结束,置位标志位(TI/RI)并申请中断。
中断控制:中断允许位ES
中断入口:0023H
一.串行接口控制
1.数据缓冲器SBUF
发送SBUF和接收SBUF共用一个地址99H 。
1)发送SBUF存放待发送的8位数据,写入SBUF将同时启动发送。 发送指令: MOV SBUF,A
2)接收SBUF存放已接收成功的8位数据,供CPU读取。 读取串行口接收数据指令:
MOV A,SBUF
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,则不加倍。
二. 串行接口的工作方式
SM0,SM1选择四种工作方式。
(1) 模式0:同步移位寄存器方式。用于扩展并行I/O接口。
1.一帧8位,无起始位和停止位。
2.RXD:数据输入/输出端。
TXD:同步脉冲输出端,每个脉冲对应一个数据位。
3.波特率B = fosc/12
如: fosc=12MHz, B=1MHz,每位数据占1s。
4.发送过程:写入SBUF,启动发送,一帧发送结束,TI=1。
接收过程:REN=1且RI=0,启动接收,一帧接收完毕,RI=1。


2.RXD:接收数据端。 TXD:发送数据端。
3.波特率:用T1作为波特率发生器,B=(2SMOD/32)×T1溢出率。
4.发送:写入SBUF,同时启动发送,一帧发送结束,TI=1。
接收:REN=1,允许接收。接收完一帧,若RI=0且停止位为1 (或SM2=0),将接收数据装入SBUF,停止位装入RB8,并使RI=1;否则丢弃接收数据,不置位RI。


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.发送:先装入TB8,写入SBUF并启动发送,发送结束,TI=1。
接收:REN=1,允许接收。接收完一帧,若RI=0且第9位为1 (或SM2=0),将接收数据装入接收SBUF,第9位装入RB8,使RI=1;否则丢弃接收数据,不置位RI。


(2)推出定时时长 : t = 1/T1溢出率
(3)推出定时器计数值:C = t / T
(4)推出定时器初值:X = M – C
T是单片机机器周期 :T = 12/fOSC
M = 2n ,n = 8、13、16,是定时器的模值
fOSC是单片机振荡器频率
(2)SMOD = 1、2
(3)不需要使用定时器
模式2可选两种波特率: B = (2SMOD /64)×fosc
模式1、3为可变波特率,用T1作波特率发生器。B = (2SMOD/32)×T1溢出率
溢出时间 t1 = 1/T1溢出率 机器周期 T = 12/fosc
t1换算成溢出机器周期数 Y = t1/ T = fosc/(12×T1)
T1模式2的时间常数 X = 28 – Y = 28 - fosc/(12×T1)
溢出率 T1 = fosc/[12×(28 – X)]
波特率 B = (2SMOD /32)×fosc/[12×(28-X)]
串行口模式1、3,根据波特率选择T1工作模式,计算时间常数。
T1选模式2: TH1 = X = 28 – (fosc/12)×(2SMOD/32) ÷ B
T1选模式1用于低波特率,需考虑T1重装时间常数时间。
1 SIO:MOV SCON, #模式字;设置串行口工作模式 2 ;并清中断标志TI、RI 3 MOV PCON, #80H ;设置波特率倍增模式 4 MOV TMOD, #20H ;设置T1工作模式 5 MOV TH1, #X ;选定波特率 6 MOV TL1, #X 7 SETB TR1 ;启动定时器1 8 SETB(/CLR) EA ;开放/禁止总中断 9 SETB(/CLR) ES ;允许/禁止串行口中断
三、串行口数据发送程序格式
例3-8-1 发送程序:先发送一个字符,等待(TI)=1后再发送下一个字符。
1 TRAM: MOV A,@R0 ;取数据 2 MOV SBUF,A ;发送一个字符 3 WAIT: JBC TI,NEXT ;等待发送结束 4 SJMP WAIT ;短跳转 5 NEXT: INC R0 ;递增数据缓冲区指针 SJMP TRAM ;短跳转
2.中断方式:
1 ORG 0023H ;串行口中断入口 2 AJMP SINT ;跳转至中断服务程序 3 MAIN: … ;初始化编程 4 TRAM: MOV A,@R0 ;取数据 5 MOV SBUF,A ;发送第一个字符 6 H: SJMP H ;其它工作 7 SINT:CLR TI ;中断服务程序,清中断标志 8 INC R0 ;递增缓冲区指针 9 MOV A,@R0 ;取数据 10 MOV SBUF,A ;发送下一个字符 11 RETI ;中断返回
四、串行口数据接收程序格式
例3-8-2 接收程序:(REN)=1、(RI)=0等待接收,当(RI)=1,
从SBUF读取数据。
1.查询方式:
1 WAIT: JBC RI,NEXT ;查询等待 2 SJMP WAIT 3 NEXT: MOV A,SBUF ;读取接收数据 4 MOV @R0,A ;保存数据 5 INC R0 ;准备下一次接收 6 SJMP WAIT
2.中断方式:
1 ORG 0023H ;串行中断入口 2 AJMP RINT ;跳转至中断服务程序 3 MAIN: … ;初始化编程 4 H: SJMP H ;其它任务 5 RINT: CLR RI ;清中断标志 6 MOV A,SBUF ;读取接收数据 7 MOV @R0,A ;保存数据 8 INC R0 ;递增缓冲区指针 9 RETI ;中断返回
例3-8-3 异步通讯程序
1.发送程序:将片内RAM 50H为起始单元的16个数由串行口发送出去。要求发送波特率为系统时钟的32分频,并进行奇偶校验。
1 MAINT: MOV SCON,#80H;串行口初始化:串行模式2 2 MOV PCON,#80H;波特率倍增 3 SETB EA ;开总中断 4 SETB ES ;允许串行口中断 5 MOV R0,#50H ;设数据指针 6 MOV R7,#10H ;数据长度 7 LOOP: MOV A,@R0 ;取一个字符 8 MOV C,P ;加奇偶校验 9 MOV TB8,C 10 MOV SBUF,A ;启动一次发送 11 HERE: SJMP HERE ;原地跳转 12 ORG 0023H ;串行口中断入口 13 AJMP TRANI ;中断服务程序 14 TRANI: PUSH A ;保护现场 15 PUSH PSW 16 CLR TI ;清发送结束标志 17 DJNZ R7,NEXT ;16个数据是否发送完? 18 CLR ES ;发送完,关闭串行口中断
SJMP loop 19 NEXT: INC R0 ;未发送完,修改指针 20 MOV A,@R0 ;取下一个字符 21 MOV C,P ;加奇偶校验 22 MOV TB8,C 23 MOV SBUF,A ;发送一个字符 24 loop: POP PSW ;恢复现场 25 POP A 26 RETI ;中断返回 27 28 29
2. 接收程序:串行输入16个字符,存入片内RAM的50H起始单元,串行口波特率为2400(设晶振为11.0592MHz)。
1 RECS: MOV SCON,#50H ;串行口模式1允许接收 2 MOV TMOD,#20H ;T1模式2定时 3 MOV TL1,#0F4H ;写入T1时间常数 4 MOV TH1,#0F4H 5 SETB TR1 ;启动T1 6 MOV R0,#50H ;设数据指针 7 MOV R7,#10H ;接收数据长度 8 WAIT: JBC RI,NEXT ;等待串行口接收 9 SJMP WAIT 10 NEXT: MOV A,SBUF ;读取接收字符 11 MOV @R0,A ;保存一个字符 12 INC R0 ;修改指针 13 DJNZ R7,WAIT ;全部字符接收完? 14 RET 15
3. 接收程序:串行输入16个字符,进行奇偶校验。
1 RECS: MOV SCON,#0D0H ;串行口模式3允许接收 2 MOV TMOD,#20H ;T1模式2定时 3 MOV TL1,#0F4H ;写入T1时间常数 4 MOV TH1,#0F4H 5 SETB TR1 ;启动T1 6 MOV R0,#50H ;设数据指针 7 MOV R7,#10H ;接收数据长度 8 WAIT: JBC RI,NEXT ;等待串行口接收 9 SJMP WAIT 10 NEXT: MOV A,SBUF ;取一个接收字符 11 JNB P,COMP ;奇偶校验 12 JNB RB8,ERR ;P≠RB8,数据出错 13 SJMP RIGHT ;P=RB8,数据正确 14 COMP: JB RB8,ERR 15 RIGHT: MOV @R0,A ;保存一个字符 16 INC R0 ;修改指针 17 DJNZ R7,WAIT ;全部字符接收完? 18 CLR F0 ;F0 =0,接收数据全部正确 19 RETERR: SETB F0 ;F0 =1,接收数据出错 20 RET


浙公网安备 33010602011771号