单片机串口通信实战指南
目录
串口介绍
通信的基本概念
并行通信和串行通信
同步通信和异步通信
串行异步通信方式
串行同步通信方式
通信协议
单片机常见通信接口
串行通信三种模式
串口参数
传输速度
串口的连接
电平标准
串行口的组成
串口数据缓冲寄存器
串行口控制寄存器
串口工作方式
电源控制寄存器
单片机内部串口模式图
波特率发生器
T1初值的设定
fosc采用11.0592MHz的原因
晶振频率和波特率初值对照表
串行口的初始化编程
串口通信案例
keil文件
串口介绍
通信的基本概念
含义:通信就是两个设备之间进行的数据传输。
并行通信和串行通信
注意:
同步通信和异步通信
前言:串行通信按信息的格式又可以分为异步通信和同步通信两种方式。
串行异步通信方式
理解:异步通信是指数据传送按位发送,基本以一个字符为单位,字符与字符之间的传送是完全异步的,一个字符中位与位之间的传送基本上是同步的。
注意:异步通信要求双方要有相同的传输速度(波特率)才可以通信。
串行同步通信方式
理解:同步通信是指数据传送以数据块(一组字符)为单位,字符与字符之间,字符内部的位与位之间都同步。(时钟同步)
注意:同步通信过程中双方都要有时钟引脚,双方的2个时钟clk引脚是连在一起的,通信时由主机传送时钟信号提供同步脉冲,双方要根据这个时钟信号来确定发送或接收每个位,确保数据传输时完全同步。
通信协议
前言:沟通的双方需要遵守一套既定的规则,这就是通信的协议。
注意:
单片机常见通信接口
注意:
串行通信三种模式
注意:MCS-51单片机具有一个异步全双工UART串口,可以同时发送、接受数据,发送,接收数据可通过查询或中断方式处理,使用十分灵活。
串口参数
注意:
传输速度
波特率(bps)=一个字符的二进制位数*字符个数/秒
总结:
串口的连接
注意:我们的电脑与单片机的通信就是通过串口,UTX为电脑的发送串口,应连接到单片机的RXD串口(P3.0);URX微电脑的接收串口,应连接在单片机的TXD串口(P3.1)
电平标准
含义:电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有以下三种。
串行口的组成
串口数据缓冲寄存器
SBUF:物理上是两个独立的8位寄存器(读和写有各自的缓冲寄存器),但是占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器(两者不会冲突)。
串行口控制寄存器
串口工作方式
电源控制寄存器
注意:当SMOD位为1时,波特率加倍。
单片机内部串口模式图
理解:单片机与电脑发送异步串口数据的时候,需要规定发送和接受的速度,也就是波特率,电脑可以通过串口助手设定波特率,而单片机设定波特率就需要设定T1;相对于单片机来说,它发送数据首先要将数据写入SBUF中,当发送完成后TI会置1,引发串口中断进而执行对应的操作;当单片机接收外部发送的数据,那么就会先将外部数据缓存至SBUF中,当接收完成后RI位会置1引发接收中断,进而我们可以在接收中断函数中读取SBUF的接收内容。
注意:
波特率发生器
前言:异步通信没有统一的时钟信号保证同步,那么为了确保数据传输正确;要求通信双方的波特率(传输速度)设置必须相同。计算机的串口调试助手可以很简单的设置波特率,但是单片机也需要用相同的波特率进而保证数据传输的正确。
51提供了一个专门的波特率发生器——T1;我们想要使用9600的波特率就是想串口在传输数据的时候每1/9600s能接收或发送一位二进制数;因此只需要每1/9600s告诉串口一下要接收或发送数据;波特率发生器就可以根据我们设置的时间进行提示;我们进而可以根据1/9600s来设置T1的初值;然后启动TR1按照定时器的工作原理,他将在每次定时时间到的时候溢出进而实现了波特率发生器的功能。
注意:
T1初值的设定
若我们想要使用9600的波特率,首先我们看UART结构图,我们想要使用的波特率他还会进行分频(/2和/16)因此我们想要使用9600波特率,我们需要以9600*2*16的波特率(307200)来算,那么我们就希望每1/307200s初值寄存器溢出一次;;因为我们必须用T1的方式2,所以初值为256-1000000/307200/(12/fosc)
fosc采用11.0592MHz的原因
总结:由此我们可以看到,若11.0592MHz频率的晶振可以获得比较精确的9600波特率;而12MHz频率的晶振就有偏差;因此计算机用9600波特率和单片机串口通信就会有传错率。
晶振频率和波特率初值对照表
串行口的初始化编程
串行口控制寄存器SCON位的确定
根据工作方式确定SM0、SM1位 方式2和方式3确定SM2位 若是接收端,则置允许接收位REN为1 方式2和方式3发送数据,则应将发送数据的第九位写入TB8中 设置波特率
方式0:不需要对波特率进行设置 方式2:设置波特率仅需对PCON中的SMOD位进行设置 方式1和方式3,设置初值 开启中断以及波特率发生器
执行中断程序
串口通信案例
前言:
keil文件
#include <regx52.h>
unsigned char dat=0,flag=0;
void initscon(){
SCON=0x50; //8位异步通信方式,允许接收数据
TMOD=0x20; //配置波特率发生器T1,工作方式为2
TH1=0xFD; //重置TL1
TL1=0xFD; //设置初值(晶振:12MHz;波特率:9600bps)
ES=1; //开启串口中断
EA=1; //开启总中断
TR1=1; //打开波特率发生器T1
}
void main(){
initscon();
while(1){
if(flag){
SBUF=dat; //向串口助手发送数据
flag=0;
}
}
}
void scon_isr() interrupt 4
{
if(TI){
TI=0; //数据发送完清TI
}
if(RI){
RI=0;
dat=SBUF; //接收串口助手发送的值
switch(dat){
case 1:P2_0=~P2_0;break;
case 2:P2_1=~P2_1;break;
case 3:P2_2=~P2_2;break;
case 4:P2_3=~P2_3;break;
case 5:P2_4=~P2_4;break;
case 6:P2_5=~P2_5;break;
case 7:P2_6=~P2_6;break;
case 8:P2_7=~P2_7;break;
default:P2=0xff;
}
flag=1;
}
}
作者:小白菜00