06:串口通信一

1、串口的基本认识

  • 串口也就是接口,称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。用来进行数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(全双工)(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

  • 分类:按电气标准及协议来分包括RS-232-C、RS-422、RS485等。

  • RS232:常见的9针串口,最高速率为20Kb/s,传输最大距离15m。如下图所示。
    在这里插入图片描述

  • RS422:最多可接10个节点。即一个主设备,其余为从设备,从设备之间不能通信。最大传输距离为1219m,最大传输速率为10Mb/s。

  • RS485:就是RS422的拓展,可以连接更多的设备

2、串口的电平

  • UART:异步串行,指主设备和从设备之间进行传输数据的频率是不同的,比如单片机向模块发送数据的频率 ≠ 模块向单片机接收数据的频率。这就是所说的波特率,一般我们需要配置波特率

串口电平:

  • RS232电平:1为-3~-15V的电压, 逻辑0为3~15V的电压
  • TTL电平:输出高电平>=2.4V,输出低电平<=0.4V;
    输入高电平>=2.0V,输入低电平<=0.8V,上官一号使用的是TTL电平。

笔记本怎样和上官一号之间进行通信喃?

  • 通过只用CH340芯片将USB转TTL。TX发送线,RX接收线。

3、接线方式

  • RXD:数据接收引脚,数据读取;STC89系列对应P3.0口,
    TXD:数据发送引脚,数据写入;STC89系列对应P3.1口,
    在这里插入图片描述
    如图,交叉连接,单片机的输入引脚连接模块的输出引脚,这样双方才能相互接收和发送数据。而单片机的RX和TX是设置了固定引脚,如下图。
    在这里插入图片描述

4、通过单片机向PC发送每隔1s发送一个字符A

一、

  • 数据缓冲器SBUF:主要用来缓存数据的,分为接收数据缓冲器和发送数据缓冲器,都是独立8位寄存器。
  • 单片机想要发送数据:则给SBUF写入数据,SBUF = data;
  • 单片机想要接收数据:则读取SBUF里面的数据,让data = SBUF;
  • 具体思路图如下:
    在这里插入图片描述

二、

  • 不仅要配置SBUF寄存器,还需要配置波特率,要2个设备之间的波特率一样,才能进行数据的传输

  • PC机的接收方波特率我们配置位9600,无校验位和停止位。
    在这里插入图片描述

  • 而单片机的波特率的配置,代码比较麻烦,我们先用软件自动生成,然后参考它配置了那些东西在进行学习。
    -

生成的代码如下:

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

2给设备都配置好后,我们开始编写剩余代码向PC机发送数据

#include <REGX52.H>
#include "intrins.h"//nop()函数的头文件

sfr AUXR = 0X8E;//reg52.h里面没有定义AUXR的地址,所以我们自己查看手册定义

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void main()
{
	int data_sj = 'A';
	UartInit();
	while(1)
	{
		Delay1000ms();
		SBUF = data_sj;//给SBUF写入数据,完成了数据的发送,这行代码主要体现的是将SBUF里面的数据输出
	}
}
SBUF = data_sj;主要表达的如下图是输出SBUF的这一过程。而不是写入SBUF这一过程,

在这里插入图片描述
在这里插入图片描述
如图:PC机每隔1s接收到一个字符A。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值