51单片机的串口通信(一)

串口通信好东西,但我没用过。

下面照着普中科技的ppt搬运下。


       随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。

通信方式

并行通信串行通信两种。

并行通信通常是将数据字节的各位用多条数据线同时进行传送 。

图一:并行通信

串行通信是将数据字节分成一位一位的形式在。

图二:串行同行

 

 

 

 

串行通信的传输方向

单工是指数据传输仅能沿一个方向,不能实现反向传输。

半双工是指数据传输可以沿两个方向,但需要分时进行。

全双工是指数据可以同时进行双向传输。

串行通信常见的错误校验 

奇偶校验、循环冗余校验

传输速率(比特率):

比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。

80C51串行口的结构

图三:串口结构

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

串行口的控制寄存器(SCON)(有点复杂,没咋整明白,以后用的时候再说)

用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

图四:SCON

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

图五:工作方式

SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。

REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。

TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。

RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请

RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。 

PCON中只有一位SMOD与串行口工作有关

图六:PCON

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

波特率的计算(用波特率计算器)

方式0的波特率 =  fosc/12

方式2的波特率 =(2SMOD/64)· fosc

方式1的波特率 =(2SMOD/32)·(T1溢出率)

方式3的波特率 =(2SMOD/32)·(T1溢出率)

 T1 溢出率 = fosc /{12×[256 -(TH1)]}

       在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

图七:波特率

串口如何使用 

确定串行口控制(编程SCON寄存器);

确定T1的工作方式(编程TMOD寄存器);

计算T1的初值,装载TH1、TL1;

启动T1(编程TCON中的TR1位);

PC和单片机通信:

#include<reg52.h>

typedef unsigned char uchar;

void Serial_comInit()
{
	SCON=0X50;			//设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1
	TMOD=0X20;//8位重装载
	PCON=0X80;
	TH1=0xF3;//波特率4800
	TL1=0XF3;
	ES=1;						//打开通信中断
	EA=1;						//打开总中断
	TR1=1;					//打开计数器
}

void main(void)
{
	Serial_comInit();
	while(1);
}

void communication() interrupt 4
{
	uchar receiveData;
	receiveData=SBUF;//出去,接,收到的数据
	RI = 0;//清除接收中断标志位
	SBUF=receiveData;//将接收到的数据放入到发送寄存器
	while(!TI);			 //等待发送数据完成
	TI=0;						 //清除发送完成标志位
}

 电脑发送数据到单片机:

(来源:https://blog.csdn.net/u014453898/article/details/57123007


#include<reg52.h>

#define uchar unsigned char

#define uint  unsigned int
uchar buf;

#define led P2

void main(void)

{

SCON=0x50;//设定串口工作方式0101 0000

PCON=0x00;

TMOD=0x20;

EA=1;

ES=1;

TL1=0xfd;//波特率9600

TH1=0xfd;

TR1=1;

while(1);

}

 

//串行中断服务函数

void serial() interrupt 4

	{

	ES=0;		//暂时关闭串口中断

	RI=0;

	buf=SBUF;	//把收到的信息从SBUF放到buf中。

	switch(buf)

	{

	case 0x31: led=0xfe;break;   //二进制 0011 0001  十进制 49 控制字符 1  16进制 0X31

	case 0x32: led=0xfd;break;	 //1111 1101

	case 0x33: led=0xfb;break;

	case 0x34: led=0xf7;break;

	case 0x35: led=0xef;break;   

	case 0x36: led=0xdf;break;	

	case 0x37: led=0xbf;break;

	case 0x38: led=0x7f;break;

	}

	ES=1;		//重新开启串口中断

	SBUF=buf;
	while(!TI);
	TI=0;

}

 

 我的串口助手有点智障,不过程序应该没有啥大问题。

参考文章:

C51学习五)单片机与PC通过串口通信 

 

   

 

 

 

一条传输线上逐个地传送。

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/84706854