串口(单片机-单片机,单片机-电脑,单片机与各种模块通信)

1通信:

在了解串口之前,我们先要知道通信,通信就是两台设备或者多台设备之间进行数据交流的一种方式,两者之间可以实现协同工作,相互传递信息和指令,实现协同控制和信息处理

1通信方式:
1:按照数据传送方式可以分为串行通信和并行通信

并行通信:数据的各位同时进行发送或接受的通信方式。优点是传输的速率高。缺点是

串行通信:一位一位的按顺序发送或者接受的通信方式。优点就是所需的传输线少,成本低。缺点就是传输的速率慢,适合远距离传输

2:按照通信的数据同步方式,可以分为异步通信和同步通信

同步通信就是指发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定发送数据,接受端根据发送端提供的时钟信号,以及大家的约定来接受数据

异步通信:接受方并不知道数据什么时候会到,收发双方可以有各自的时钟

3:按照数据的传输方向又可以分为单工,半双工,全双工通信

这里我就附上自己学习时的笔记

2:串口通信的介绍

51单片机串口通信是指通过单片机内部硬件自带的串口模块实现的通信方式。串口通信是一种全双工,异步通信方式,它通过发送和接收数据来使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,单片机不仅可以使用串口来实现通信,还可以通过IO口模拟实现多种其他通信,比如 SPI,IIC等。在51单片机内部自带UART这个通信接口,所以可以实现单片机串口通信

 那么单片机怎么实现实现通信的呢

在单片机内部的UART串口通信中有两跟通讯线(发送端TXD和接受端RXD),在双向通信的时候要进行交叉连接也就是设备1的TXD端要连接在设备2 的RXD端

3:工作模式

STC89C52里面的UART有四种模式:

模式0:同步移位寄存器

模式1:8位UART,波特率可变

模式2:9位UART,波特率固定

模式3:9位UART,波特率可变

4:串口配置的相关寄存器

1:SCON寄存器是用来选择串口通信的工作方式

其中SM0和SM1用来决定串口通信的工作方式,上图有介绍

REN:当REN=1时,允许串口接受通信,就可以启动串口接收器RXD,进行接受数据;当REN=0时,禁止串口接收数据

TI:发送中断请求标志位。在方式0,当串口发送数据第八位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后,必须用软件复位,即TI=0

RI:接受中断请求标志位。当串口接受数据第八位结束时,由内部硬件自动置位,即RI=1,向主机请求中断,响应中断后,必须用软件复位,即RI=0。

 2:电源控制寄存器PCON

 在这个寄存器里面最重要的就是SMOD这一位,它决定了波特率是否加倍,当SMOD=0时,各工作方式加倍;当SMOD=1时,串行通信方式加倍

注意在这里,波特率的计算我们可以在STC里面直接获取,不过要注意配置的方式

我用自己学习时的笔记展示给大家参考一下

3:SBUF寄存器

这个寄存器在串口通信里面就非常重要了,SBUF这个寄存器里面实际上有两个寄存器,一个是用于发送数据,一个是用于接受数据,以下会展示自己在学习时所画的串口模式图:

 了解了这些,我们就可以进行串口配置

串口加上定时器的配置:

​
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x40;		//设定模式1,REN置0
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;			//设置定时初始值
	TH1 = 0xFD;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	ES=1;               //开启串口中断
	EA=1;               //开启总中断
}

​

中断函数的配置

void UART_Routine() interrupt 4
{
    if(RI==1) //判断是否接受中断请求
     {
      UART_SendByte(SBUF); //中断后取出数据发送给电脑
      RI=0; //软件清零
     }
}

5:单片机向电脑发送数据中的主要的代码

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char Sec;
void main()
{
	UART_Init();
	while(1)
	{
		UART_SendByte(Sec);
		Sec++;
		Delay(1000);
	}

}
#include <REGX52.H>

void UART_Init()
{
    SCON = 0x40;
	PCON |= 0x80;
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xF3;
	TH1 = 0xF3;
	ET1 = 0;
	TR1 = 1;
}
	
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;

}	

6:电脑通过串口控制单片机上的LED主要代码展示

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char Sec;
void main()
{
	UART_Init();
	while(1)
	{
		
	}

}

void UART_Routine() interrupt 4
{
	if(RI==1)
	{
		P2=SBUF;
		UART_SendByte(SBUF);
		RI=0;
	}
	
		
}
#include <REGX52.H>


void UART_Init()
{
    SCON = 0x50;
	PCON |= 0x80;
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xF3;
	TH1 = 0xF3;
	ET1 = 0;
	TR1 = 1;
	EA=1;
	ES=1;
	
}
	
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;

}	

在这里SCON配置为0x50,就是让单片机可以进行数据中断

这里在讲一下可位寻址和不可为寻址,可位寻址就是可以对地址一位一位的处理,像SCON寄存器还有TCON寄存器,而不可为寻址就只能对整个地址进行处理,像PCON寄存器还有TMOD寄存器

在串口通信里面用定时器1

上面的代码是我自己在跟随江科大的视频学习的,可能会有一些错误或者理解的错误,希望各路大佬看到了可以指点小白一二,谢谢

作者:Jelly也要学习

物联沃分享整理
物联沃-IOTWORD物联网 » 串口(单片机-单片机,单片机-电脑,单片机与各种模块通信)

发表回复