51单片机串口设置 - CSDN
  • 51单片机串口配置

    2017-06-10 09:16:23
    1.配置串口工作模式为模式1。即设置SCON寄存器,SCON |= 0X50;(SM0 = 0,SM1 = 1,REN =1). 2.配置定时器1为模式2,即自动重装载模式。TMOD &= 0X0F; TMOD |= 0X20. 3.根据波特率计算TH1,TL1的初值,如果有需要可使用...

    1.配置串口工作模式为模式1。即设置SCON寄存器(SM0,SM1,REN位),SCON |= 0X50;(SM0 = 0,SM1 = 1,REN =1).

    SM0 = 0,SM1 = 0  方式0:同步移位串行方式:波特率= SYSclk / 12.

    SM0 = 0,SM1 = 1  方式1:8位UART,波特率可变: 波特率 =  (2^SMOD / 32) * (定时器1的溢出率)

    SM0 = 1,SM1 = 0  方式2:9位UART: 波特率 =  (2^SMOD / 64) * (SYSclk系统工作时钟频率)

    SM0 = 1,SM1 = 1 方式3: 8位UART,波特率可变: 波特率 =  (2^SMOD / 32) * (定时器1的溢出率)

    注意:

    当单片机工作在12T模式时,定时器1的溢出率 = SYSclk / 12  / (256 - TH1);

    当单片机工作在1T模式时,定时器1的溢出率 = SYSclk / 6  / (256 - TH1);

    SMOD默认为0。具体作用参考数据手册。


    2.配置定时器1为模式2,即自动重装载模式。TMOD &= 0X0F; TMOD |= 0X20.


    3.根据波特率计算TH1,TL1的初值,如果有需要可使用PCON进行波特率加倍(PCON最高位为波特率加倍位)。

    计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 2 / 16 / 波特率;

    如果波特率加倍则:PCON |= 0X80; 计算公式:TH1 = TL1 = 256 - 晶振值 / 12  / 16 / 波特率;


    4.打开定时器控制寄存器TR1,启动定时器。


    5.如果需要开串口中断,则 ES =1;


    while(1)

    {

    while(!RI);// 等待接收完一字节数据

    RI = 0; // 需软件清零

    SBUF = SBUF +1;// 把接收的数据+1再发送出去

    while(!TI);// 等待发送完一字节数据

    TI = 0; // 需软件清零

    }


    注意:如果定时器1作为串口波特率发生器后不可再用作普通定时器。

    一般我们可以准备好要发送的数据,TI = 1,会立即进入串口发送中断,可在串口发送中断中发送要发的数据。RI一旦为1表示接受中断发生,进中断取数据。




    展开全文
  • MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF  SBUF是可以直接寻址的专用...

    原文转载自:http://blog.csdn.net/hzqt210/article/details/6496989


    MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。

    1.      数据缓冲寄存器SBUF

     SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。

     2.      状态控制寄存器SCON

     SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下:

     MSB                                                      LSB 

     

    SM0

     

     

    SM1

     

     

    SM2

     

    REN

     

     

    TB8

     

     

    RB8

     

     

    TI

     

    RI

     

    SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。

     

    SM0  SM1

     

     

    工作方式

     

     

    功能

     

     

    波特率

     

     

    0      0

     

     

    0

     

     

    8位同步移位寄存器

     

     

    Fosc/12

     

     

    0      1

     

     

    1

     

     

    10位UART

     

     

    可变

     

     

    1      0

     

     

    2

     

     

    11位UART

     

     

    Fosc/64或Fosc/32

     

     

    1      1

     

     

    3

     

     

    11位UART

     

     

    可变

     

    SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。

    REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。

    TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。

    RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。

     TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。

     RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。

     系统复位时,SCON的所有位都被清除。

    控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:

     MSB                                                         LSB 

     

    SMOD  

     

    —— 

     

    ——

     

    ——  

     

    GF1  

     

    GF0 

     

    PD 

     

    IDL 

    仅最高位SMOD与串口的控制有关,其他位与掉电方式有关。PCON的地址为87H只能按字节寻址,SMOD是串行通信波特率系数控制位,当串口工作在工作方式1、2时,若使用T1作为波特率发生器其SMOD=1则波特率加倍(见下面详述)。

    GF1 和GF0用于一般的用途,对于AT89系列为通用的标志位,PD为电源下降位,对于AT89系列,PD为1进入掉电状态,IDL为IDLE模式位,对于AT89系列,IDL为1进入空闲工作方式,在PD和IDL同时为1时,PD优先。

     (1)    工作方式0

     SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式。

     其数据传输的波特率固定为Fosc/12,数据由RXD引脚输入或输出,同步时钟由TXD引脚输出。接收/发送的是8位数据,传输是低位在前,帧格式如下:

     

    ……..

     

     

    D0

      

     

    D1

      

     

    D2

      

     

    D3

      

     

    D4

     

     

    D5

     

     

    D6

      

     

    D7

     

     

    …….

      

     (2)工作方式1

    当SM0=0且SM1=1时,串口选择工作方式1,其数据传输的波特率由定时/计数器T1、T2的溢出速率决定,可通过程序设定。当T2CON寄存器中的RCLK和TCLK置位时,用T2作为发送和接收波特率发生器,而RCLK=TCLK=0时,用T1作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。数据由TXD引脚发送,由RXD引脚接收。

    发送或接收一帧的数据为10位,即1位起始位(0)、8位数据位(低位在先)和1位停止位(1)。真格式如下:

     

    起始位0

     

     

    D0

     

     

    D1

     

     

    D2

     

     

    D3

     

     

    D4

     

     

    D5

     

     

    D6

     

     

    D7

     

     

    停止位1

     

    类似于工作方式0,当执行任一条SBUF指令时,就启动串行数据的发送。在执行写入SBUF的指令时,也将“1”写入发送移位寄存器的第9位,并通知发送控制器有发送请求。实际上,发送过程始于内部的16分频计数器下次满度翻转(全“1”变全“0”)后的那几个机器周期的开始。所以,每位的发送过程与16分频计数器同步,而不是与“写SBUF”同步。

     此方式的工作过程包括发送和接收两部分。

     当执行任一条写SBUF指令时,就启动串行数据的发送。在执行写入SBUF的指令时,也将“1”写入发送移位寄存器的第9位,并使发送控制器开始发送。在这期间,内部的定时保证写入SBUF与激活发送之间有一个完整的机器周期。当发送脉冲有效后,移位寄存器的内容由RXD引脚串行移位输出,移位脉冲由TXD引脚输出。

     在发送有效的每个机器周期,发送移位寄存器右移一位,就在其左边补“0 ”。当数据的最高位移到移位寄存器的输出时,原写入第9位的“1”正好移到最高位的左边一位,由此向左的所有位都为“0”,这标志着发送控制器要进行最后依次移位,并撤消发送有效,同时使发送中断标志TI置位。

    当REN=1且接收中断标志RI位清除时,即启动一个接收过程。在下一个机器周期,接收控制器将“11111110”写入接收移位寄存器,并在下一周期内激发接收有效,同时由TXD引脚输出移位脉冲。在移位脉冲的控制下,接收移位寄存器的内容每一个机器周期左移一位,同时由RXD引脚接收一位输入信号。

     每当接收移位寄存器左移一位,原写入的“11111110”也左移一位。当最右边的“0”移到最左边时,标志着接收控制器要进行最后一次移位。在最后移位即将结束时,接收移位寄存器的内容送入到接收数据缓冲寄存器SBUF,然后在启动接收的第10个机器周期时,清除接收信号,将RI置位。

     如果在第一个时钟周期中接收到的不是起始位(“0”),就复位接收电路,继续检测RXD引脚上1到0的跳变。如果接收到的是起始位,就将其移入接收移位寄存器,然后接收该帧的其他位。接收到的位从右边移入,原来写入的1从左边移出,当起始位移到最左边时,接收控制器将控制进行最后一次移位,把接收到的第9为数据送到接收数据缓冲器SBUF和RB8,同时置位RI。

     在进行最后一次移位时,能将数据送入到接收数据缓冲器SBUF和RB8而且置位RI的条件如下:

     ●                RI=0,即上一真数据接收完成时,发出的中断请求已经被响应,SBUF中的上一帧数据已经被取走。

     ●                SM2=0或接收到的停止位为1。

    这两个条件有一个不满足接收到的数据就有可能丢失,并且无法修复;如两者都满足则数据装入SBUF,停止位装入RB8且置位RI。

     开始发送后的一个位周期,发送信号有效,开始将起始位送TXD引脚。一位时间后,数据信号有效。发送移位寄存器将数据由低位到高位顺序输出至TXD引脚。一位时间后第一个移位脉冲出现,将最低数据位从右边移出,同时从左边补上“0”。当数据的最高位移到移位寄存器的输出端时,先前写入第9位的“1”正好移到最高位的左边一位,而它的左区全部为“0”。在第10个位周期(16分频计数器回0时),发送控制器要进行最后一次清除发送信号,同时使发送中断标志TI置位。

     当REN=1且接收中断标志RI位清除后,若在RXD引脚上检测到一个由“1”到“0”的跳变,立即启动一次接收的过程。同时复位16分频计数器,使输入位的边沿与时钟对齐,并将1FFH(9个“1”)写入接收移位寄存器。接收控制器继续以波特率的16倍的速率继续对RXD引脚进行检测,对每一位时间的第7、8、9个计数状态的采样值用多数表决法,当2次或2次以上的采样值相同时,采样值被接受。

     (1)    工作方式2和3

    当SM0=1且SM1=0时,串口选择工作方式2,当SM0=1且SM1=1时,串口选择工作方式3。数据由TXD引脚发送由RXD引脚接收。

     发送和接收的一帧信息为11位,即1位起始位(0),9位数位(低位在前,第9位数据位是可编程位)1位停止位(1)。发送时,可编程位(TB8)可赋0或1,接收时可编程位进入SCON中的RB8。帧的格式如下: 

     

    起始位0

     

     

    D0

     

     

    D1

     

     

    D2

     

     

    D3

     

     

    D4

     

     

    D5

     

     

    D6

     

     

    D7

     

     

    可编程位D8

     

     

    停止位1

     


    展开全文
  • 51单片机串口通信如果全部把发送原理讲完的话可能要打好久几万字, 最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha 串行口工作之前,应对其进行初始化,主要是设置产生...
      51单片机的串口通信如果全部把发送原理讲完的话可能要打好字,
    最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha


    串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
    具体步骤如下:

    1.确定T1的工作方式(编程TMOD寄存器);  
      
    2.计算T1的初值,装载TH1、TL1;  
      
    3.启动T1(编程TCON中的TR1位);  
      
    4.确定串行口控制(编程SCON寄存器);  
      

    5.串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。  


    一言不合上代码:

    #include "reg52.h"           //此头文件中定义了单片机的一些特殊功能寄存器  
      
    typedef unsigned int u16;        
    typedef unsigned char u8;  
      
    void UsartInit()  
    {  
        SCON=0X50;          //0101 000设置串行口控制寄存器sm0,sm1为01,即为工作方式1  
        TMOD=0X20;          //设置计数器工作方式2  
      
         /*看到这里的TMOD=0x20可能有同学会有疑问了,将定时器工作方式寄存器定义为0x20  
          就是将计数器1的M1M0设为10,即方式2(8位初值自动重装的8位定时器/计数器)  
          做过动态数码管的同学可能知道,数码管里的是选择定时器0,为什么要用定时器1呢?  
          单片机内部定时器0和定时器1虽然都是16位定时计数器,但在硬件结构和寄存器配置方面,  
          还是有一些不同之处的,通过对寄存器的配置:  
      
          1,定时器0可分成2个独立的8位定时器,而定时器1则不能;  
          2,定时器1可作为**串口的波特率发生器**,而定时器0则不能。*/  
      
        PCON=0X80;          //定义PCON寄存器中的SMOD=1,波特率加倍  
        TH1=0XF3;               //计数器初始值设置,注意波特率是4800的,当然大家可以改  
        TL1=0XF3;  
        EA=1;               //打开总中断  
        ES=1;               //打开中断允许中的串行口中断允许  
        TR1=1;              //打开计数器  
    }  
    void main()  
    {     
        UsartInit();  //    串口初始化  
        while(1);         
    }  
    void Usart() interrupt 4  
    {  
        u8 rec;  
        rec=SBUF+1;//出去接收到的数据,为了效果更明显,即向pc机发送1,回应2这样的效果  
        RI = 0;//清除接收中断标志位  
        SBUF=rec;//将接收到的数据放入到发送寄存器  
        while(!TI);          //等待发送数据完成  
        TI=0;                        //清除发送完成标志位  
    }


    展开全文
  • 由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。 1.串口配置 51单片机配置除了需要配置2个8位寄存器SCON、...

    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
    由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。
    1.串口配置

    51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。
    (1)状态控制寄存器 SCON
    SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:
    在这里插入图片描述
    SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。
    在这里插入图片描述
    (2)电源与波特率控制寄存器
    控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:
    在这里插入图片描述
    仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按 字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波特率加倍。
    (3)定时器控制模式寄存器
    TMOD是定时器、计数器模式控制寄存器,它是一个逐位定义的8为寄存器,但只能使用字节寻址
    在这里插入图片描述
    当串口工作在工作方式0和2是,波特率固定,方式0时fosc/12;方式2时fosc/32或fosc/64(根据SMOD判断)。当串口工作在方式1时,波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)),X是初值;C/T#为定时器和计数器选择位,0为定时器,1为计数器

    2.串口通用程序
    为了有较好的通用性,将串口程序配置为一个H文件和C文件,往后只要开发51单片机程序,都可以将该两个文件复制在工程中直接使用,无须修改。
    (1)uart.H

    #ifndef _UART_H_
    #define _UART_H_
    
    #include "reg52.h"
    
    void UartInit(void);
    void Send_string(unsigned char *c);
    void Send_Data(unsigned char DAT);
    
    #endif
    

    (2)uart.c

    #include "uart.h"
    
    //串口初始化
    void UartInit(void)
    {
    	/*串口初始化 */
    	TMOD = 0x20;	  //定时器T1使用工作方式2
    	SCON = 0x50;	  //工作方式1,,允许接收   
    	PCON = 0x10;
    	TH1 = 253;        // 设置初值,波特率9600bps
    	TL1 = 253;
    	TR1 = 1;          // 开始计时	
    	ES = 1;         //打开接收中断
    	EA = 1;           // 打开所以中断   
    	TI = 0;
    	RI = 0;
    }
    
    void Send_Data(unsigned char DAT)
    {
    	ES = 0;
    	TI=0;
    	SBUF = DAT ;
    	while(TI==0);
    	TI=0;
    	ES = 1;
    }
    
    void Send_string(unsigned char  *c)
    {
    	while(*c != '\0')
    	{
    		Send_Data(*c++);
    	}	
    }
    
    void RSINTR() interrupt 4 using 2
    {
    	EA=0;
    	if(TI==1) //发送中断	  
    	{
    		TI=0;
    	}
    
    	if(RI==1)	 //接收中断		  
    	{	
    
    		RI=0;								 
    
    	}
    	EA=1;
    }
    
    

    如需串口参考例程, 请关注公众号,首页回复“串口”获取资料
    在这里插入图片描述

    展开全文
  • 51单片机串口通信 环形缓冲区队列最近在做毕业设计刚好涉及到51单片机,简单的研究一下发现51单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理SBUF的值或者串口中断长时间未退出很容易照成数据...
  • 51单片机串口多字节接收
  • 51单片机串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,...
  • 51单片机串口驱动,个人正在使用中,比较好用。
  • 51单片机串口波特率计算方式0的波特率配置方式2的波特率配置方式1和3的波特率配置 232串口模式,共有4钟方式,其中方式0、方式2的波特率是固定的。方式1、方式3的是可变波特率,这两个是用T1定时器作为波特率发生...
  • 51单片机串口接收字符串比较
  • 基于Proteus的两个51单片机之间串口通信的仿真例程
  • 51单片机串口通信,是全双工的,就是可以同时收/发的,互相不影响的。 串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。 但是,对于接收或发送,确实是接收到一...
  • 51单片机串口通讯C语言源码,其中串口测试程序完成串口发送任意字符到单片机,单片机通过P0口LED灯显示。比如 发送16进制的 00 单片机的LED灯全亮 发送FF灯全灭  首先 烧写程序到单片机 晶振 11.0592MHZ  连接好...
  • 关于51单片机串口通信的讲解的博客有很多,这里就不再详细讲解。下面给出程序 1.uart.h #ifndef __UART__ #define __UART__ typedef unsigned char u8; void UART_Init(); void UART_Send_Data(u8 byte); u8 UART_...
  • 51单片机串口程序,字符串16进制发送与接收.docx
  • 51 单片机串口实验

    2016-01-25 11:27:10
    51单片机有一个全双工的串行口。在 PROTEUS 软件中,可以使用虚拟终端,和单片机的串口进行通信实验。此时,并不需要在电路中加上 TTL-RS232 电平转换器件。直接把单片机的串口,和虚拟终端连接在一起就可以了。...
  • 基于51单片机的汇编语言写的串口通讯代码,经测试,有用.
  • 51单片机串口通信时需要有一个定时器去调节与计算机通信的波特率,而定时器设置时需要中断寄存器(IE), 定时器控制寄存器(TCON) ,还有T/C控制寄存器共同配合作用, 但在启动定时器功能时,这三个...
  • 51单片机串口通信

    2020-07-30 23:31:53
    51单片机通信课程代码啊!
1 2 3 4 5 ... 20
收藏数 10,790
精华内容 4,316
热门标签
关键字:

51单片机串口设置