51单片机串口通信

来源:互联网 发布:nymex天然气行情软件 编辑:程序博客网 时间:2024/04/28 03:31

一.串口相关寄存器详解

1.串行口控制寄存器(SCON)

这里写图片描述

SM0和SM1为工作方式选择位,可选择四种工作方式:

这里写图片描述

SM2:多机通信控制位。主要用于方式2和方式3
REN:允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8,在方式2或方式3中,是发送数据的第九位
RB8,在方式2或方式3中,是接收到数据的第九位
RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

2.功率控制寄存器(PCON)

该寄存器只有一位SMOD与串行口工作有关
SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

3.工作方式寄存器(TMOD)

这里写图片描述
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。

这里写图片描述
串口是采用定时器1工作在8位自动重装定时/计数模式,即工作方式2,TMOD=0x20。

4.时钟控制寄存器(TCON)

该寄存器只有第六位与串口有关,用于开启定时器1。
TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

二.8051的串行口结构

这里写图片描述

有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会生重叠错误。

三.波特率的计算

通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =(2· SMOD/64)· fosc
方式1的波特率 =(2· SMOD/32)·T1溢出率)
方式3的波特率 =(2· SMOD/32)·T1溢出率)

对于方式1的定时器初值计算:
T1溢出率= fosc/(12·(28-X))
波特率=(2·SMOD/32)fosc/(12·(28-X))
其中X为定时器的初始值

四.程序实现

1.初始化

串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
(1)确定T1的工作方式(编程TMOD寄存器);
(2)计算T1的初值,装载TH1、TL1;
(3)启动T1(编程TCON中的TR1位);
(4)确定串行口控制(编程SCON寄存器);
(5)如果串行口在中断方式工作,还要进行中断设置(编程IE、IP寄存器)。

假如我们使用的是12Mhz的晶振,然后设置波特率为4800:

void Usart_init(){   SCON=0x50;  //选择工作方式1,允许串行口接收数据     TMOD=0x20;  //选择8位自动重装定时器   PCON=0x80;  //波特率增倍   TH1=0xF3;   //晶振频率12MHZ,SMOD=1   TL1=0xF3;   //波特率为4800时定时器的初值   TR1=1;      //开定时器}

2.接收与发送

我们通过电脑上的串口调试助手发送一个十六进制的数给单片机,然后单片机又把接收到的这个数发回给电脑,实现电脑与单片机的互相通信。

void main(){       unsigned char tmp=0;       Usart_Init();       init_lcd1602();       while(1)       {            /*单片机接收数据*/            while(!RI); //等待接收数据完成            tmp=SBUF;   //获取接受数据            RI=0;       //清除接收标志位            /*单片机发送数据*/            SBUF=tmp;   //将数据写入发送缓冲区中            while(!TI);  //等待发送完毕            TI=0;        //清除发送标志位       }}
2 0
原创粉丝点击