精华内容
下载资源
问答
  • 本文是关于52单片机定时器计数器2做为串行口波特率发生器使用的例子,类似于定时器1作为波特率发生器工作在模式1下,但是不同的是:定时器2作为波特率发生器是16位自动重装的,位数比定时器1作为波特率发生器要高...
  • 51单片机串行口波特率计算

    千次阅读 2019-06-19 21:48:58
    在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。 常用于串行口外接移位寄存器,以...

     

    1.工作方式介绍:

     

    方式 0 这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。 

    常用于串行口外接移位寄存器,以扩展并行I/O口,这种方式不适用与两个MCS-51之间的串行通信。
     

    方式1真正用于数据的串行发送和接收。TXD引脚和RXD引脚分别用于发送和接收数据。

    方式1收发1帧数据为10位,1个起始位(0),8个数据位,1个停止位(1),先发送或接收最低位。


    方式 2 串行口工作于方式2和方式3时,被定义为9位异步通信接口。每帧数据均为11位,1位起始位0,8位数据位(先低位),1位可程控为10的第九位数据和1位停止位1。采用这种方式可接收或发送 11 位数据,以 11 位为一帧,比方式 1 增加了一个数据位,其余相同。第 9 个数据即 D8 位具有特别的用途,可以通过软件控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用于多机通信。方式 2 的波特率固定,只有两种选择,为振荡率的 1/64 1/32 ,可由 PCON 的最高位选择。 

    方式 3 方式 3 与方式 2 完全类似,唯一的区别是方式 3 的波特率是可变的。而帧格式与方式 2- 样为 11 位一帧。所以方式 3 也适合于多机通信。

     

    SM0  SM1   方式   

     0      0        0   同步移位寄存器方式(用于扩展I/O口)

     0      1        1   8位异步收发,波特率可变(由定时器控制)

     1      0        2   9位异步收发,波特率为fosc/64fosc/32

     1      1        3   9位异步收发,波特率可变(由定时器控制)

     

    2.计算公式总结:

     

    方式0波特率固定为:fosc / 12

     

    方式1波特率的计算公式为:(串行口为波特率可变的8位异步通信接口,SMOD为PCON寄存器的最高位值(0或1))

             方式1波特率 =(2^SMOD / 32) * 定时器T1的溢出率

    注:当SMOD=1时,要比SMOD=0时的波特率加倍,所以也称SMOD位为波特率倍增位

     

    方式2的波特率由下式确定:

             方式2波特率=( 2^SMOD / 64) * fosc

    方式3的波特率由下式确定:

             方式3波特率 = (2^SMOD / 32) * 定时器T1的溢出率

     

    溢出速率 = 1 / 溢出时间

    溢出时间(相当于定时时间)= (2^8 – TH1初值)* Tcy

    机器周期Tcy = 12时钟周期 = 12*(1/fosc)

    故:溢出速率 = 1 / 溢出时间 = 1 / [(256 - TH1初值)* (12 / fosc)] = fosc / [12 *(256-TH1初值)]

    计数速率 = 1 / 计数时间 = 1 / (12 / fosc) = fosc / 12

    故也可写成:溢出速率 = 计数速率 / (256-TH1初值) = fosc / [12 *(256-TH1初值)]   

    注:一般来说,定时器方式2用来确定波特率是比较理想的,它不需要中断服务程序设置初值,且算出的波特率比较准确。在用户使用的波特率不是很低的情况下,建议使用定时器T1的方式2来确定波特率。定时器方式1或方式3定时,常用T1作为波特率发生器。

    而对于定时器方式0和方式1的最大特点是计数溢出后,计数器为全0。因而在循环定时或循环计数应用时就存在反复装入计数初值的问题。这不仅影响定时精度,而且也给程序设计带来麻烦。方式2就是针对此问题而设置的。定时器/计数器的方式2位自动恢复初值的(初值自动装入)8位定时器/计数器,TLX作为常数缓冲器,当TLX计数器溢出时,在置1溢出标志位TFX的同时,还自动的将THX中的初值送入至TLX,使TLX从处置开始重新计数。这种方式可以省去用户软件中重装处置的程序,简化定时器初值的计算方法,可以相当精确的确定定时时间。

    而定时器方式3是为了增加1个附加的8位定时器/计数器而提供的,从而使MCS-51具有3个定时器/计数器。方式3只适用于定时器/计数器T0,定时器/计数器T1不能工作在方式3。T1处于方式3时相当于TR0=0,停止计数(此时T1可以用来做串口波特率发生器。)

    展开全文
  • 波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。实际应用在串行I/O与并行I/O之间的...

    方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。

    实际应用在串行I/O口与并行I/O口之间的转换。

    2)方式1

    方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。

    在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。

    1f5f3d71343cc36382425a987cedd5f6.png

    (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。

    (2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后:

    A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

    B、 若RI=0、SM2=1,则只有停止位为1时,才有上述结果。

    C、若RI=0、SM2=1,且停止位为0,则所接数据丢失。

    D、若RI=1,则所接收数据丢失。

    无论出现那种情况,检测器都重新检测RXD的负跳变,以便接收下一帧。

    3)方式2、方式3

    方式2和方式3是9位异步串行通信,一般用在多机通信系统中或奇偶校验的通信过程。在通讯中,TB8和RB8位作为数据的第9位,位SM2也起作用。方式2与方式3的区别只是波特率的设置方式不同。

    (1)发送

    向SBUF写入一个数据就启动串口发送,同时将TB8写入输出移位寄存器第9位。开始时,SEND和DATA都是低电平,把起始位输出到TXD。DATA为高,第一次移位时,将‘1’移入输出移位寄存器的第9位,以后每次移位,左边移入‘0’,当TB8移到输出位时,其左边是一个‘1’和全‘0’。检测到此条件,再进行最后一次移位,/SEND=1,DATA=0,输出停止位,置TI=1。

    (2)接收

    置REN=1,与方式1类似,接收器以波特率的16倍速率采样RXD端。

    起始位0移到输入寄存器的最左边时,进行最后一次移位。在RI=0,SM2=0或接收到的第9位=1时,收到的一字节数据装入SBUF,第9位进入RB8,置RI=1;然后又开始检测RXD端负跳变。

    3、 多机通信

    在这里,多机系统是指‘一主多从’。51系列单片机中,利用第9位TB8/RB8来区分地址与数据信息,用位SM2确定接收方是否对地址或数据帧敏感。其原则是:

    1)发送方用第9位TB8=1标志地址帧,TB8=0标志数据帧。

    2)接收方若设置SM2=1,则只能接收到地址信息,若设SM2=0,则不管是地址还是数据帧,都能接收到。

    利用方式2、3的特点,在点对点的通讯中,在发送方可以用第9位TB8作为奇偶校验位。在接收方,SM2位必须清0。

    4、波特率

    1)方式0的波特率=fosc/12

    2)方式2的波特率=2^smod*fosc/64

    3)方式1、3的波特率由T1或T2的溢出率和SMOD位确定:

    (1)用T1:波特率=2^smod*T1定时器的溢出率/32,T1为方式2T1定时器溢出率=1/((12/fosc)*(256-X))例:已知fosc=6MHz,SMOD=0,设置波特率为2400,求T1的计数初值X。

    波特率=1/((12/fosc)*(256-X))/32=fosc/12*32(256-X)(256-X)=fosc/2400/384=6M/2400/384;256-X~=6.5104X~=250=FAH 只能近似计算。

    若fosc=11.0592MHz, 则256-X=11.0592M/2400/384=4068/384=12 X=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。

    如果SMOD=1,则同样的X初值得出的波特率加倍。

    (3)用T2:

    在52型单片机中,串口方式1、3的波特率发生器选择由TCLK、RCLK位确定是T1还是T2。若TCLK=1,则发送器波特率来自T2,否则来自T1。若RCLK=1,则接收器波特率来自T2,否则来自T1。

    由T2产生的波特率与SMOD无关。T2定时的最小单元=2/fosc。T2的溢出脉冲16分频后作为串口的发送或接收脉冲。

    波特率=(1/((2/fosc)(65536-X)))/16=fosc/(32(65536-X))例:已知fosc=11.0592MHz,求波特率=2400时的X2400=11059200/(32(65536-X)) 65536-X=144 X=65392=FF70H计数器初值寄存器:RCAP2H=0FFH,RCAP2L=70H。

    展开全文
  • 串行通信波特率设置

    2009-09-18 20:35:00
    通常结合定时计数器使用,以T1作为串行波特率发生器使用,其工作于方式2(之所以选择这个方式是因为该方式为自动重装载方式,可以为以后免去不少麻烦)。串行通信的Baud是由T1的计数溢出率决定的,有Baud=2smod/32 ...

    在串行通信中,波特率的设置与单片机外接的晶振有关,还与定时计数中的初值设置有关。串行通信方式0,其波特率(Baud)是固定的,但是方式一的波特率是可调的。通常结合定时计数器使用,以T1作为串行波特率发生器使用,其工作于方式2(之所以选择这个方式是因为该方式为自动重装载方式,可以为以后免去不少麻烦)。串行通信的Baud是由T1的计数溢出率决定的,有

    Baud=2smod/32  *(定时器1溢出率),溢出率为溢出周期的倒数。假定计数初值为X,则计数溢出周期为

    12/fosc *(256-X);则有

    Baud=(2smod/32)  *  fosc/[12*(256-X)],一般来说,事先都会知道要设置的波特率是多少,从而根据上述公司,可以推出求初值X的计算公式。

    当所取晶振为11.0592M时,不同的波特率所对应的初值如图:

    展开全文
  • 内含程序包括使用定时器2作为串口发生器的定时器和使用专门的波特率发生器,详尽的示例,经过测试成功。
  • 利用定时器计数器2作为串口波特率发生器(reg52.h文件缺少对T2CON的定义,需自己定义,在reg52.h头文件加sfr T2CON = 0xC8;)。 程序如下: #include "reg52.h" #include "intrins.h" #include "stdio.h" #define u8...

    利用定时器计数器2作为串口波特率发生器(reg52.h文件缺少对T2CON的定义,需自己定义,在reg52.h头文件加sfr T2CON = 0xC8;)。
    程序如下:

    #include "reg52.h"
    #include "intrins.h"
    #include "stdio.h"
    #define u8 unsigned char
    #define u32 unsigned int
    	
    #define FOSC 12000000L      //System frequency
    #define BAUD 9600       //UART baudrate
    
    char *buf="Roger that";
    void delayms(u32 ms)
    {
    	u32 i,j;
    	for(i=ms;i>0;i--)
    	for(j=115;j>0;j--);
    }
    void Timer2Init(void)		//100微秒@12.000MHz
    {
    	T2MOD = 0;		//初始化模式寄存器
    	T2CON = 0x34;           //Timer2 start run
    	TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule
      TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
    	TR2 = 1;		//定时器2开始计时
    }
    void main()
    {
    	
    	Timer2Init();
    	SCON = 0x50;            //8-bit variable UART
    	ES = 1;                 //Enable UART interrupt
      EA = 1;                 //Open master interrupt switch
    	//printf("STC89-90xx\r\nUart Test !\r\n");
    	while(1)
    	{
    	}
    
    }
    /*----------------------------
    UART interrupt service routine
    ----------------------------*/
    void Uart_Isr() interrupt 4 using 1
    {
    	static u8 i;
      if (RI)
      {
        RI = 0;             //Clear receive interrupt flag
        P1 = SBUF;          //P0 show UART data
    		for(i=0;*(buf+i)!='\0';i++)
    		{
    			SBUF=*(buf+i);
    			while(!TI);
    			TI=0;
    		}
      }  
    }
    
    展开全文
  • 51的定时器本来就很不够用,用串口时再使用定时器1来产生波特率,那系统使用定时器就更加捉襟见肘了,STC11/10xx系列单片机内部自带的串口独立波特率发生器,使用它就可以将定时器1释放出来当定时器来用了。...
  • (基于51核的STC12C5A60S2,keil ...1. 定时发送1字节数据给电脑,波特率9600 #include <STC12C5A60S2.h> typedef unsigned char u8; sbit BEEP = P1 ^ 0; //置1则响 //----------------------------...
  • 学习串行口时,感觉挺复杂得 ,但是进入代码之后感觉还行,所以说还是得多练习实践。 2.80c51的串行口结构 2.1、内部结构介绍 AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲...
  • 单片机—串行口

    2020-12-28 10:58:35
    目录前言一、串行口结构与相关寄存器1、串行口结构2、相关SFR二、串行口的工作方式三、串行口的初始化 前言 串行口知识简单整理 一、串行口结构与相关寄存器 1、串行口结构 (1)8051系列单片机片上有UART(通用...
  • 51单片机串行口中断的使用

    千次阅读 2020-06-28 18:05:34
    51单片机串行口中断的使用初始化中断服务程序主程序 初始化 void SCON_init() { SCON = 0x50; //0101 0000 TMOD = 0x20;...2、波特率发生器由定时器T1构成 中断服务程序 void zhongduan4() interrupt 4 {
  • 计算波特率

    千次阅读 2014-02-18 19:16:19
    波特率计算 在串行通信中,收发双方对发送或...串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。 一、方式0的波特率 方式0时,移位时钟脉冲由56(即第
  • ARM7 串口波特率的设置

    千次阅读 2018-02-08 14:40:58
    UARTn除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的APB时钟(PCLK)分频值,波特率时钟必须是目标波特率的16倍。UnDLL和UnDLM寄存器一起构成一个16位除数。其中,UnDLL包含的是除数的低8位,UnDLM...
  • 1、检错信息编码: a、校验:知道错了,但不知道在哪里 b、纠错:知道错了,并知道错在哪里 c、奇偶校验码:每个数据加一个额外奇偶校验位/发现错误 ①、奇校验码——数据中包含奇数个...a、波特率:单位时间内传送二进
  • 单片机串行口介绍

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

    千次阅读 2010-01-09 18:21:00
    一、串行口的控制寄存器MCS-51单片机串行口是由缓冲器SBUF、移位寄存器、串行口控制寄存器SCON、电源控制寄存器PCON及波特率发生器T1组成。1.串行口数据缓冲器SBUFMCS-51单片机内的串行接口部分,具有两
  • //串口1初始化,晶振11.0592,波特率9600,使能中断 void Uart1_Init(void) { TMOD = 0x20; //定时器工作在定时器1的方式2 PCON = 0x00; //不倍频 SCON = 0x50; //串口工作在方式1,并且启动串行接收 TH1 = 0...
  • 波特率计算

    2012-03-07 15:42:30
    波特率计算 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。...串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源
  • 单片机的串行口及应用 通信方式: ​ 1.并行通信:数据的各位同时进行传送。...波特率: 每秒传送二进制属马的位数,单位pbs (位/秒),衡量的是数据的传输速率,常用的波特率有2400bps、4800bps、9...
  • T2 的波特率发生方式类似于常数自动重 改,不免有些麻烦。为此,笔者经过实践,找到一 装入方式,用X 代替(RCAP2H、RCAP2L),则串 16 种可以两全其美的办法:从机侦测主机位信息并 行方式 1、3的波特率公式为 ...
  • 单片机 波特率设置

    千次阅读 2014-01-03 12:55:24
    在串行通信中,收发双方对发送或...串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。 一、方式0的波特率 方式0时,移位时钟脉冲由S6(即第6个状态周期
  • 串口、波特率等概念

    万次阅读 多人点赞 2018-06-09 17:00:53
    波特率发生器实质是设计一个分频器,用于产生和RS232通信同步的时钟。在系统中用一个计数器来完成这个功能,分频系数N决定了波特率的数值。该计数器一般工作在一个频率较高的系统时钟下,当计数到N/2时将输出置为高...
  • 串行口由2个数据缓冲区、一个移位寄存器、一个串行控制寄存器和一个波特率发生器(通常用定时器)组成。相关寄存器:工作模式: 1、模式0:同步移位寄存器 在模式0状态,串行通信接口工作在同步移位寄存器模式,...
  • 51单片机定时器和波特率

    千次阅读 2017-12-10 10:22:17
    1.引言: 在串行通信中,收发双方发送或接收的数据... 串行口的四种工作方式对应这三种波特率,由于输入的移位时钟的来源不同,所以各种方式的波特率的计算公式也不同。 2.各种方式的波特率介绍 工作方式0 方式0时,
  • 51单片机 11.0592MHz 产生115200 波特率

    万次阅读 多人点赞 2015-05-14 12:21:31
    51单片机 11.0592MHz 产生115200 波特率 连接:http://homezzy.blog.hexun.com/29601793_d.html 具体定义如下:  SM0 SM1 SM2 REN TB8 RB8 TI RI  SM0、SM1为串行口工作模式设置位,这样两位可以对应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,719
精华内容 1,487
热门标签
关键字:

串行口波特率发生器