【STC15】串行口1的相关寄存器解读


  • 资料来源于STC15手册。

  • 定时器2经常作为波特率发生器来使用。

  • 串行口1的控制寄存器SCONPCON

STC15系列单片机的串行口1设有两个控制寄存器:串行控制寄存器SCON波特率选择特殊功能寄存器PCON

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下:

  • SCON:串行控制寄存器(可位寻址)

    SMO/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。
  • 当PCON寄存器中的SMODO/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。
    其中SM0、SM1按下列组合确定串行口1的工作方式:
  • SM2:允许方式2或方式3多机通信控制位。
    在方式2或方式3时,如果SM2位为1且REN位为1,则接收机处于地址帧筛选状态。此时可以利用接收到的第9位(即RB8)来筛选地址帧:若RB8=1,说明该帧是地址帧,地址信息可以进入SBUF,并使RI为1,进而在中断服务程序中再进行地址号比较;若RB8=0,说明该帧不是地址帧,应丢掉且保持RI=0。在方式2或方式3中,如果SM2位为0且REN位为1,接收收机处于地址帧筛选被禁止状态。不论收到的RB8为0或1,均可使接收到的信息进入SBUF,并使RI=1,此时RB8通常为校验位。
    方式1和方式0是非多机通信方式,在这两种方式时,要设置SM2应为0。
  • REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。
  • TB8:在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。例如,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。在方式0和方式1中,该位不用.
    RB8:在方式2或方式3,是接收到的第9位数据,作为奇偶校验位或地址帧/数据帧的标志位。
    方式0中不用RB8(置SM2=0).方式1中也不用RB8(置SM2=0,RB8是接收到的停止位)。
  • TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零。
  • RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后RI必须用软件清零,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须由软件清零。
  • SCON的所有位可通过整机复位信号复位为全“0”。SCON的字节地址为98H,可位寻址,各位地址为98H~9FH,可用软件实现位设置。

串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。
电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。

  • 电源控制寄存器PCON格式如下:
  • PCON:电源控制寄存器(不可位寻址)
  • SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率不加倍。复位时SMOD=0。
  • SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;当SMOD0=0,SCON寄存器中的SMO/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD0=0
  • PCON中的其他位都与串行口1无关,在此不作介绍。

串行口数据缓冲寄存器SBUF

STC15系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。

串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A)
的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送.

串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。

由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

辅助寄存器AUXR

  • AUXR:辅助寄存器(不可位寻址)


串口1可以选择定时器1做波特率发生器,也可以选择定时器2作为波特率发生器。当设置AUXR寄存器中的S1ST2位(串行口波特率选择位)为1时,串行口1选择定时器2作为波特率发生器,此时定时器1可以释放出来作为定时器/计数器/时钟输出使用.

对于STC15系列单片机,串口2只能使用定时器2作为波特率发生器,不能够选择其他定时器作为其波特率发生器;而串口1默认选择定时器2作为其波特率发生器,也可以选择定时器1作为其波特率发生器;串口3默认选择定时器2作为其波特率发生器,也可以选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可以选择定时器4作为其波特率发生器。

定时器2的寄存器T2H, T2L

定时器2寄存器T2H(地址为D6H,复位值为00H)及寄存器T2L(地址为D7H,复位值为00H)用于保存重装时间常数。
注意:对于STC15系列单片机,串口2只能使用定时器2作为波特率发生器,不能够选择其他定时器作为其波特率发生器;而串口1默认选择定时器2作为其波特率发生器,也可以选择定时器1作为其波特率发生器;串口3默认选择定时器2作为其波特率发生器,也可以选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可以选择定时器4作为其波特率发生器。

与串行口1中断相关的寄存器位ES和PS

串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:
IE:中断允许寄存器(可位寻址)


-IP:中断优先级控制寄存器低(可位寻址)

将串口1进行切换的寄存器AUXR1(P_SW1)


  • 串口1建议放在[P3.6/RxD_2,P3.7/TxD_2]或[P1.6/RxD_3/XTAL2,P1.7/TxD_3/XTAL1]上。

串口1的中继广播方式设置位——TxRx/CLKDIV.4


串行口1工作模式1:8位UART,波特率可变

当软件设置SCON的SM0、SM1为“01”时,串行口1则以模式1工作。此模式为8位UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可变,即可根据需要进行设置。TxD/P3.1为发送信息,RxD/P3.0为接收端接收信息,串行口为全双工接受/发送串行口。

模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条写“SBUF“的指令就启动串行通信的发送,写“SBUF”信号还把“1”装入发送移位寄存器的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。

移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入“0”作补充。当数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位“1”,在它的左边各位全为“0”,这个状态条件,使TX控制单元作最后一次移位输出,然后使允许发送信号“SEND”失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。

模式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16分频的速率采样串行接收端口RxD,当检测到RxD端口从“1”→“0”的负跳变时就启动接收器准备接收数据,并立即复位16分频计数器,将1FFH植装入移位寄存器。复位16分频计数器是使它与输入位时间同步。

16分频计数器的16个状态是将1波特率(每位接收时间)均为16等份,在每位时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样直经“三中取二”的值,即3次采样至少2次相同的值,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为“0”(低电平),则起始位无效,复位接收电路,并重新检测“1"~”0”的跳变。如果接收到的起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。

接收的数据从接收移位寄存器的右边移入,已装入的1FFH向左边移出,当起始位"0"移到移位寄存器的最左边时,使RX控制器作最后一次移位,完成一帧的接收。若同时满足以下两个条件:

  • ·RI=0;
  • ·SM2=0或接收到的停止位为1。

则接收到的数据有效,实现装载入SBUF,停止位进入RB8,置位RI,即RI=1,向主机请求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收器重又检测RxD端口上的"1"一”0”的跳变,继续下一帧的接收。接收有效,在响应中断后,必须由软件清0,即RI=0。通常情况下,串行通信工作于模式1时,SM2设置为"0"。

  • 串行通信模式1的波特率是可变的,可变的波特率由定时器/计数器1或定时器2产生,优先选择定时器2产生波特率。

当串行口1用定时器2作为其波特率发生器时,串行口1的波特率=(定时器T2的溢出率)/4.
(注意:此时波特率也与SMOD无关。)

  • 当串行口1用定时器1作为其波特率发生器且定时器1工作于模式0(16位自动重装载模式)时,串行口1的波特率=(定时器1的溢出率)/4.
    (注意:此时波特率与SMOD无关。)

串口示例程序


/*************  功能说明    **************使用说明:使用前确认MAIN_Fosc(时钟频率)和 波特率
双串口全双工中断方式收发通讯程序。
设置Timer2做波特率发生器
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.******************************************/#define   MAIN_Fosc           16000000uL  //定义主时钟
#include "stdio.h"
#include    "STC15Fxxxx.H"#define     BaudRate1           115200uL        //波特率
#define     UART1_BUF_LENGTH    32
#define     Timer2_Reload   (65536UL -(MAIN_Fosc / 4 / BaudRate1))      //Timer2 重装值u8  TX1_Cnt;    //发送计数
u8  RX1_Cnt;    //接收计数
bit B_TX1_Busy; //发送忙标志u8   idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲void  UART1_config(); // 选择波特率使用Timer2做波特率char putchar(unsigned char c);//串口打印函数
//void  PrintString1(u8 *puts);
void  delay_ms(unsigned int ms);//延时函数//========================================================================
// 函数: void main(void)
// 描述: 主函数。
//========================================================================
void main(void)
{P1M1 |=0x00; P1M0 |=0x01;//设置P10为推挽输出
//  P0M1 = 0;  P0M0 = 0;  //设置为准双向口
//  P1M1 = 0;  P1M0 = 0;  //设置为准双向口
//  P2M1 = 0;  P2M0 = 0;  //设置为准双向口
//  P3M1 = 0;  P3M0 = 0;  //设置为准双向口
//  P4M1 = 0;  P4M0 = 0;  //设置为准双向口
//  P5M1 = 0;  P5M0 = 0;  //设置为准双向口
//  P6M1 = 0;  P6M0 = 0;  //设置为准双向口
//  P7M1 = 0;  P7M0 = 0;  //设置为准双向口S1_USE_P30P31();UART1_config();    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.EA = 1;   //允许总中断printf("STC15F2K60S2 UART1 Test Prgramme!\r\n");   //UART1发送一个字符串while (1){printf("\t perseverance51 \r\n"); delay_ms(500);P10 = ~P10;if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))    //收到数据, 发送空闲{SBUF = RX1_Buffer[TX1_Cnt];       //把收到的数据远样返回B_TX1_Busy = 1;if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;}}
}//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts:  字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
///*
//void PrintString1(u8 *puts)   //发送一个字符串
//{//    for (; *puts != 0;   puts++)       //遇到停止符0结束
//  {//      SBUF = *puts;
//      B_TX1_Busy = 1;
//      while(B_TX1_Busy);
//  }
//}
//*/
//----------------------------------------------------------
//  函数名称:putchar(unsigned char c)
//  函数功能:串口发送一个字节
//      功能:包含stdio.h实现printf打印
//----------------------------------------------------------  char putchar(unsigned char c)
{SBUF = c;                     //发送数据B_TX1_Busy = 1;while(B_TX1_Busy);
//     while(!TI);                  //等待发送完成
//     TI=0;                           //清零发送标志位;return c;
}//========================================================================
// 函数: void UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void    UART1_config()  // 选择波特率使用Timer2做波特率
{/*********** 波特率使用定时器2 *****************/SCON = 0x50;     //8位数据,可变波特率AUXR |= 0x01;      //S1 BRT Use Timer2;AUXR |= 0x04;      //定时器时钟1T模式TH2 = Timer2_Reload  / 256;TL2 = Timer2_Reload  % 256;AUXR |= 0x10;       //定时器2开始计时//SCON = (SCON & 0x3f) | 0x40;   //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
//  PS  = 1;   //高优先级中断ES  = 1;   //允许中断REN = 1; //允许接收P_SW1 &= 0x3f;//串口在[P3.0/RxD,P3.1/TxD]P_SW1 |= 0x00;        //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟)
//  PCON2 |=  (1<<4);    //内部短路RXD与TXD, 做中继, ENABLE,DISABLEPCON2 &=0x3f;//主时钟不对外输出时钟,B_TX1_Busy = 0;TX1_Cnt = 0;RX1_Cnt = 0;
}//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{if(RI){RI = 0;RX1_Buffer[RX1_Cnt] = SBUF;if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0;   //防溢出}if(TI){TI = 0;B_TX1_Busy = 0;}
}//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void  delay_ms(unsigned int ms)
{unsigned int i;do{i = MAIN_Fosc / 13000;while(--i)    ;   //14T per loop}while(--ms);
}

【STC15】串行口1的相关寄存器解读相关推荐

  1. 51单片机串行口程序c语言编程,单片机C语言编程串行口通讯.ppt

    单片机C语言编程串行口通讯 第7章 MCS-51单片机串行口 第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举 ...

  2. (九)单片机串行口 内部结构的讲解 01

    1. 基本概念 常用于数据通信的传输方式有单工.半双工.全双工和多工方式. 单工方式:数据仅按一个固定方向传送.因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集. 半双工方 ...

  3. 串行异步通信_单片机串行口介绍

    串行口是单片机与外界进行信息交换的工具,8051单片机的通信方式有两种: 并行通信:数据的各位同时发送或接收. 串行通信:数据一位一位次序发送或接收. 串行通信的方式 异步通信 用一个起始位0表示字符 ...

  4. 51单片机串行口的使用与串行通信

    51单片机串行口的使用与串行通信 串行通信: 俩个概念: RS232接口标准: 串行口的使用: 串行口的结构: 串行口相关寄存器: 串行口的工作方式: 方式0:同步移位寄存器方式 利用方式0扩展并行I ...

  5. 俩个PC机通过串行口互联,实现件的无差错传输。程序必须用中断方式来完成任务

      课程设计(论文)任务书 一.设计题目:1.题目名称      PC机通过串行口互联 2.题目来源               二.目的和意义 俩个PC机通过串行口互联,实现件的无差错传输.程序必须 ...

  6. 计算机组成原理实验串行口,计算机组成原理实验2.ppt

    文档介绍: 计算机组成原理实验(二) 第六章 FD-CES实验台功能模块介绍 6.1 前言 6.6 总线缓冲模块 6.2 运算器模块 6.7 微程序控制模块 6.3 寄存器堆模块 6.8 启停和时序模 ...

  7. qj71c24n通讯实例_Q系列串行口通信模块用户参考手册QJ71C24N(基础篇).pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp电子工程/通信技术&nbsp>&nbsp数据通信与网络 Q系列串行口通信模块用户参考手册QJ ...

  8. max232c语言,串行口通信(STC89C52+MAX232):串行口通信硬件设计详解

    一. STC89C52与MAX232连接原理图 二. 串行口通信原理 1. 基本通信方式 a. 并行通信 定义: 将数据字节的各位用多条数据线同时进行传送, 每一位数据都需要一条传输线, 还需要一条信 ...

  9. 串行口中断服务函数的触发条件-------TI/RI 触发

    串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...

  10. 微机接口串行口的测试

    要求 运用微机系统串行口知识,进行微机系统串行偶的测试:完成硬件测试环境,编写程序对微机系统的串口进行自发自收外环测试:数据发送从键盘输入,接收数据在屏幕显示. 硬件 实验前,首先要进行串口的连接以实 ...

最新文章

  1. LeetCode: Unique Binary Search Trees [095]
  2. 使用LeakCanary遇到的问题 就是不弹出来
  3. python可以实现操作系统管理_Python并发编程 —— 操作系统基础
  4. 最大字段和---C语言实现
  5. Unity 3D Hierarchy视图
  6. 什么是决定计算机内部寄存器,问题解答之 计算机中寄存器定义,分类
  7. matlab getdata函数,用getdata函数读取数据的时候数据读取不过来
  8. Python数据挖掘实战-唐宇迪-专题视频课程
  9. Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)
  10. Balsamiq Mockups 产品原型图绘制工具的破解和使用教程
  11. 计算机毕业设计Python+uniapp扫码点餐微信小程序(小程序+源码+LW)
  12. android手机密码忘了,安卓手机密码忘记了怎么解锁
  13. 时间字符串和时间戳的转换
  14. 【算法类】【预处理】利用skit-learn分割训练集测试集
  15. 英语不好能学会python吗_英语不好可以学习python编程吗?老男孩python入门
  16. 20亿人数据再被盗取,波及40多个国家和地区
  17. 矢量计算机和标量计算机
  18. 【转】渗透工具包2014贺岁版发布
  19. python爬取“百度小姐姐”
  20. 用C语言“调戏”qq

热门文章

  1. SPSS实战:多因素方差分析(以随机区组设计为例)
  2. ipadpro画流程图_流程图制作软件,这款软件让你5分钟就能搞定流程图
  3. 第二课:基于树莓派的10个经典项目(树莓派能做什么)
  4. 沪深股市股票交易规则
  5. 3D建模的几种常用建模方法
  6. MySQL操作语句(快速办公)
  7. windows安装配置jdk1.8
  8. 静态多层Map缓存清除
  9. 使用Python对比两个excel表格中的重复数据
  10. word 2016插入空白页页眉的办法