首页 > 代码库 > 奶爸业余单片机学习之:UART串口通信学习笔记(一)

奶爸业余单片机学习之:UART串口通信学习笔记(一)

UART串口通信,全名:异步串口通信

UART的四种工作模式:(0,1,2,3)

模式1:SM0 = 0; SM1 = 1;REN = 1  //由SCON(串行口控制寄存器)控制,可位寻址。10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制

模式1功能:以TXD为例,平时没数据时,TXD为高电平,需要发送数据时,先发送一个起始位0,然后发送八位数据位(一个字节),最后发送一位停止位1;

REN位为允许串行接收位:REN = 1:允许串行口接收数据;REN = 0:禁止串行口接收数据。

TI:发送中断标志位。发送停止位开始时,T1由硬件置1,向CPU发送中断请求,不管中断打开与否,都必须进行软件清零。

RI:接收中断标志位。接收停止位的中间时,RI由硬件置1,向CPU发送中断请求,不管中断打开与否,都必须进行软件清零。

定时器1,及其工作方式2:TMOD = 0x20;//TMOD位(89H不可位寻址),即M1 = 1;M0 = 0;功能定时器1工作方式2:8位初值自动重装定时器/计数器

TR1 = 1;//定时器/计数器控制寄存器,TR1 = 1时,定时器1启动。

定时器1初值:由于使用定时器工作方式2(8位初值自动重装),即TL1 = TH1 ;

THL计算方法:

  公式1:波特率 = (2SMOD/32)×T1溢出率;

  公式2:T1溢出率 = 时钟频率/[12×(256-TH1)];其中SMOD由电源管理寄存器控制,串口方式1、2、3时,SMOD = 0为正常波特率,=1时波特率加倍,

由此可见,又公式1及公式2可得:TH1 = 256-[时钟频率/(波特率×12×32)].

使用串口中断时:EA = 1;ES = 1;

SBUF:串口数据缓冲寄存器,发送数据时,只要将数据送入SBUF就能自动发送,如:SBUF = AA;接收数据时,则将SBUF数据读出来即可,如:AA = SBUF;

总结:

UART配置(使用定时器1时):

1、确定T1的工作方式:TMOD = 0X20;

2、计算T1定时器初值TH1\TL1:TH1 = 256-[时钟频率/(波特率×12×32)];

3、打开定时器1:TR1 =1 ;

4、确定串口工作方式(方式1):SM0 = 0;SM1 =1;//或者SCON = 0x50;

5、打开接收允许REN:REN = 1;

6、打开中断 EA = 1;ES = 1(当需要时) 

举例:单片机向电脑发送数据

/*************************************
* 串口通信实验
* 晶振11.0592MHz
* 波特率9600bps
* 分为中断及非中断方式实现
*
**************************************/

#include<reg52.h>

/**********串口通信配置*******************/
void UART_CONFIG(unsigned long baud,cy)//baud波特率,cy晶振
{
  TMOD = 0x20;//定时器1工作方式2,8位初值自动重装
  TH1 = 256-(cy/(12*32*baud));
  TL1 = 256-(cy/(12*32*baud));
  TR1 =1;//打开定时器1
  SM0 = 0;//SM0,SM1的值确定串口工作方式
  SM1 = 1;
  REN = 1;//允许接收数据
}
/********数据发送函数*****************/
void UART_DATA(unsigned int dat)
{
  SBUF = dat;//数据送入SBUF,自动发送
  while(!TI);//TI = 1,发送停止,!T1即等待TI发送完成
}
/********发送延时函数*****************/
void delay_xms(unsigned int xms)
{
  unsigned x, y;
  for(x = 0;x<xms;x++)
  {
    for(y = 0;y<110;y++);
  }
}

int main()
{
  UART_CONFIG(9600,11059200);
  while(1)
  {
    UART_DATA(0);//发送数据
    delay_xms(1000);//1秒延时
  }
  return 0;
}

奶爸业余单片机学习之:UART串口通信学习笔记(一)