51单片机串口通信基本原理与应用
一:串口通信概述
1.并行通信和串行通信
微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,分为两种:并行通信和串行通信。
并行通信:数据的各位同时发送或接收,每个数据位使用一条导线。
串行通信:数据一位一位的按顺序发送或接收。
2.串行通信
<1>串行通信有SPI,IIC,UART等多种,最常见的最通用的是指UART,大多数情况下,串口通信指的就是UART。
<2>串行通信的制式有单工,半双工,全双工 三种。RS485总线是半双工的通信制式。
<3>串行通信的主要方式有两种:同步和异步。
同步串行通信:需要使用同一个时钟,以数据块为单位传送数据。
异步串行通信:每个设备都有自己的时钟信号,通信中双方的波特率要保持一致,以字符为单位进行数据帧传送,一次传送一个帧。
二:关于波特率的计算
<1>波特率:串口每秒钟传输的位数。
<2>在51单片机的串口通信中,模式1和模式3的波特率的可变的。取决于定时器的1的溢出率,也就是说定时器1每溢出1次,串口就发送一次数据
<3>通常使用定时器1的工作模式2(8位自动重装)来产生波特率,TL1作为脉冲计数寄存器,TH1作为自动重装寄存器,当计数到最大值溢出时,TH1的值会自动装到TL1中。
三:51单片机串口相关寄存器
<1>串口相关寄存器
TH1和TL1:设置波特率参数。
TMOD:设置定时器1的工作模式。
SBUF:串行通信数据的发送和接收缓冲器。
SCON:串行接口控制寄存器。
在这里主要是掌握SCON,跟串口有关的各种属性都在这个寄存器里进行配置:
<2>
SCON=0X50 // 0 1 0 1 0 0 0 0
如果使用STC15F2K602单片机,还需要对新增的辅助寄存器AUXR进行设置,否则无法进行串口数据收发,对于传统的89C52单片机,则不需要。
四:串口通信编程思路
主要分为两部分:串口初始化和数据收发
初始化函数:(可自动生成)
<1>设置定时器1的工作模式,也就是对TMOD寄存器赋值。
<2>计算波特率参数,并赋值给TH1和TL1寄存器
<3>打开定时器1,如果是stc12系列单片机,则要设置AUXR寄存器
<4>设置SCON寄存器
<5>使能串口中断ES
<6>使能总中断EA
数据收发
数据发送采用查询,数据接收采用中断
五:代码
sfr AUXR=0x8e; //新增辅助寄存器
unsigned char tmpRecv;
void Init_UART()
{
TMOD=0x20; //定时器1工作模式为自动重装
TH1=0Xfd; //设置波特率为9600
TL1=0xfd; //11.0592M或12M的12分频
AUXR=0x00; //bit7=1,定时器1不分频,0则12分频
TR1=1; //启动定时器1
SCON=0x50 ; //串口参数为模式1和允许接收
ES=1; //使能串口中断
EA=1; //使能总中断
}
void SendByte(unsigned char dat)
{
SBUF=dat; //将数据放入SBUF缓存器
while(TI==0); //等待发送数据完成
TI=0; //清除发送完成标志
}
void Sevice_UART() interrupt 4
{
if(RI==1)//接收一个完整字节
{
RI=0;
tmpRecv=SBUF;
SendByte (tmpRecv+1);
}