串行通信

一.串行通信的基本方式

  • 异步通信
    • 以字符为传送单位,用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。
      异步通信常用格式:一个字符帧
    • 异步通信的双方需要两项约定:
      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,每位数据占1s。
4.发送过程:写入SBUF,启动发送,一帧发送结束,TI=1。
  接收过程:REN=1且RI=0,启动接收,一帧接收完毕,RI=1。

写入SCON使REN=0,TI=0;然后执行写入SBUF的指令,8位数据装入发送SBUF,硬件启动串行口发送器进行一次发送。通过发送移
  位寄存器将8位数据逐位送到RXD引脚,每个机器周期内发送一位数据。对应发送数据的每一位,由TXD引脚同步输出一个移位脉
  冲。发送完一帧,自动置位TI标志,并申请串行口中断。若CPU响应中断,则将从0023H单元开始执行串行口的中断服务程序。
写入SCON使REN = 1、RI = 0,将启动串行口接收器开始接收。由TXD输出移位脉冲,每对应一个移位脉冲,采样一次RXD引脚信
  号。每个机器周期采样一次RXD引脚,采到的数据位送入接收移位寄存器后,接收移位寄存器左移一位。接收完一帧,自动置位RI标
  志,申请串行口中断,并将接收下来的8位数据装入接收SBUF。若CPU响应中断,则从0023H单元开始执行串行口的中断服务程序。
(2) 模式1—— 8位数据异步通讯方式。
1.一帧10位:8位数据位,1个起始位(0),1个停止位(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。
执行写入SBUF指令,将8位数据装入发送SBUF,并启动发送器进行一次发送:先将起始位“0”送到TXD引脚,再从低到高
  逐位发送8位数据,最后发送停止位“1”。每位发送占用的时间由设定的波特率决定。发送完一帧数据,置位TI标志,申
  请串行口中断。
当REN=1时,允许接收器准备接收。开始,以16倍于波特率的速率检测RXD引脚的负跳变,当检测到负跳变后,启动一次
  接收,接收完一帧信息,判断是否满足条件:RI = 0,而且停止位为1(或SM2=0)。若同时满足这两个条件,则置位RI标
  志,申请串行口中断,并将接收的8位数据装入接收SBUF,停止位装入RB8;否则接收无效,丢失所接收的一帧信息,
  且不影响RI标志。一位时间以后,接收器重新开始检测RXD端的负跳变,以准备接收下一帧数据。
(3) 模式2和模式3
9位数据异步通讯模式。
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。
 
(4)波特率计算
一、可变波特率计算思考过程
(1)波特率:B = (2SMOD/32)×T1溢出率
(2)推出定时时长 : t = 1/T1溢出率
(3)推出定时器计数值:C = t / T
(4)推出定时器初值:X = M – C
  T是单片机机器周期 :T = 12/fOSC
              M = 2n ,n = 8、13、16,是定时器的模值
          fOSC是单片机振荡器频率
二、固定波特率计算思考过程
(1)固定波特率:B = (2SMOD/64)×fosc
(2)SMOD = 1、2
(3)不需要使用定时器
--------------------------------------------------------------------------
模式0为固定波特率: B  = fosc/12 
模式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.查询方式:
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

 

 

 

 

 

 
posted @ 2020-04-01 10:34  pc11  阅读(1620)  评论(0)    收藏  举报