单片机控制串口通信

来源:互联网 发布:php pathinfo 中文 编辑:程序博客网 时间:2024/04/26 14:54
串口通信的内容比较重要,大家一定要掌握,工业上应用非常多,其中232总线、485总线以及以它们为基础建成的ModBus网络工业通信系统都需要用到串口,下面我来为大家一步步介绍串口通信的相关知识。

一、通信数据的发送方式简介

通信是机器与机器之间数据交换的桥梁,按数据发送方式分为串口通信和并口通信也可以叫串行通信和并行通信。

串行通信:

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。


注意:
串口用于ASCII码字符的传输,通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。


并行通信:
并行通信指一组数据的各数据位在多条线上同时被传输的通信方式,并行通信控制简单,传输速度快;
由于传输线较多,长距离传送时成本高且接收方的各位同时接受存在困难。本章节主要讨论串行通信
并行不论述,大家知道概念即可


二、什么是同步通信,什么是异步通信?
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。
为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。

异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有位间隔的整数倍的关系,但同一个字符内的各位之间的距离均为"位间隔"的整数倍。

同步也分为外同步和自同步

同步通信指通信时要建立发送方时钟对接受方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为"位间隔"的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。

外同步比较好理解,即在发送端和接收端之间提供单独的时钟线路,接收端按这个频率进行接收采样,原理就是触发器的原理。如下图



自同步比较难理解,它是在传输的信号中嵌入时钟的信息,接收端从接收的信号波形提取时钟信息的一种方法,如果你有学习过收音机的工作原理你就比较容易理解,它提取信息的方式如同调谐回路和本机振荡混频后输出的中频信号。如下图


三、通信工作方式的简要说明
1、单工
单工是指数据传输仅能沿着一个方向,不能实现反向传输。
经典产品:收音机
2、半双工
半双工是指数据传输可以沿两个方向传输,但不能实现同时传输。
经典产品:对讲机
3、全双工
全双工是指数据可以同时进行双向传输。
经典产品:手机


总结:由上面的结论可以得出单片机的串口通信是异步全双工的


四、通信参数说明

波特率:波特率是指每秒传输的符号数。1波特(B)= 1比特(bit)= 1位/秒(1bps)[在此不提供计算公式,因为本人从来都没有用到过这个公式计算]
起始位:起始位必须是持续一个比特时间的逻辑"0"电平,标志传送一个字符的开始。
数据位:数据位为5-8位,它紧跟在起始位之后,是被传送字符的有效数据位。传送时先传送字符的低位,后传送字符的高位。数据位究竟是几位,可由硬件或软件来设定。
奇偶位:奇偶校验位仅占一位,用于进行奇校验或偶校验,也可以不设奇偶位。
停止位:停止位为1位、1.5位或2位,可有软件设定。它一定是逻辑“1”电平,标志着传送一个字符的结束。
空闲位:空闲位表示线路处于空闲状态,此时线路上为逻辑“1”电平。空闲位可以没有,此时异步传送的效率为最高。

单片机串口传输格式



五、单片机通信结构图

两个SBUF,单片机内部自动区分发和收不用管,只要赋值和读值就行。


六、寄存器说明




TMOD前面的单片机定时器控制已经讲过就不讲了,至于为什么要设置定时器,看上面的通信结构图就能看出来
IE中串口用到两个
EA:1打开总中断,0关闭总中断;
ES:1打开串口中断,0关闭串口中断;

REN:接收使能


七、硬件设计与通信检测说明
1>测试串口的外围电路一般采用232电平转换电路,232信号电平与TTL信号电平并不兼容,
232标准电平为(0:+5V~+15V,1:-5V~-15V)TTL标准电平为(0:0.3V~1.0V,1:2.5V~5V)
2>单片机串口通信必须共地
3>与单排机通信时先进行PC串口自检测试,确保硬件没有问题。
4>外部晶振一定要选择好,最好用11.0592MHZ,为什么,看看下面的表中误差就清楚了。


八、软件程序设计

设计程序完成串口自检功能,即串口调试助手发送什么就接收什么。

#include <reg52.h>unsigned char a;unsigned char flag;void main(){ TMOD=0x20;   //设置定时器1为方式2 TH1=0xfd;    //装入初值11.0592MHz,9600 TL1=0xfa; TR1=1;       //启动定时器1 SM0=0; SM1=1;       //设置串口为方式1 REN=1;       //接受使能 EA=1;        //打开总中断开关 ES=1;        //打开串口中断开关 while(1) {  if(flag==1) //若有数据接收  {   ES=0;   flag=0;   SBUF=a; //把接收的数据再次赋值到SBUF   while(!TI);   //等待数据发送结束   TI=0;   ES=1;  }    }}void serial() interrupt 4{ a=SBUF;  //把接收的数据存储到a RI=0; flag=1;  //标志位}


0 0
原创粉丝点击