串行接口的简称为串口,也称为串行通信接口或者串行通讯接口(COM接口),是采用串行通信的扩展接口。
串行接口是指数据一位一位的进行顺序传送,其特点通信线路简单,只要一堆传输线就能实现双向通信,大大降低成本,适用远距离通信,单传输速度较慢。
设备间接线通信的一种方式;(通信的本质是数据的传送)
数据一位一位顺序传送
双向通信,全双工
传送速度相对较慢
全双工(允许二台设备间同时进行双向数据传输)
半双工(允许二台设备之间的双向数据传输,但不能同时进行)
串行接口按电气标准和协议可分为:RS-232-C、RS-422、RS-485等。
RS-232-C、RS-422、RS-485的标准只对接口的电气特性做出规定,不涉及插件、电缆或协议。
RS-232——**标准串口**,是最常用的一种(电脑9针串口、最高速率20kb/s),**点对点**传输,传输距离**最大15m**,适合本地设备间的通信。
RS-422——接受其采用高输入阻抗,比RS-232更强的驱动能力,支持**点对多的双向通信**。最多可接10个节点,1个主设备、多个从设备,从设备之间不能通信;最大传输距离1219m,传输速率最大可达10Mb/s,平衡双绞线的长度与传输速率成反比;
RS-485——从RS-422基础上发展而来,总线上最多接32个设备。
UART——异步串行,通用异步接收、发送。
UART包含TTL电平串口和RS232电平串口
TTL即晶体管——晶体管逻辑的简称,是计算机处理器控制的设备内部部分之间通信的标准技术,其数据表示采用二进制规定。
RS232电平——逻辑1为-3~-15v电压
逻辑0为3~15v电压(笔记本用RS232和单片机通信,需要用到usb转2329针串口)
TTL电平——逻辑1等价与+5v,
逻辑0等价于0v
输出高电平>=2.4v,输出低电平<=0.4v
输入高电平>=2.4v,输入低电平<=0.8v
笔记本通过TTL与单片机通信:
TX发送线(端口)P3.1口
RX接收线(端口)P3.0口
需要用到USB转TTL,使用ch340通信
①、接线方式
TXD(transmit data发送数据)
RXD(receive data接收数据)
TXD\RXD交叉接线,GND接GND
②、SBUF
输入/输出数据有个缓冲区SBUF,用99H地址码,但是对应两个独立的8位寄存器
在51中data是关键字,不可乱用
接收数据:`char data=SBUF`,外部数据→RXD串口→串行输入移位寄存器→SBUF,用定义的变量来承接数据。(只能读出,不能写入)
发送数据:`SBUF=data`,内部数据→SBUF→串行输出移位寄存器→TXD输出数据(只能写入,不能读出)
①、波特率
UART异步串行接口,通信双方使用时钟不同,双方硬件配置不同,因此需要约定通信速度,叫做波特率。
用stc-isp波特率计算器生成波特率
在串口助手下选择波特率、校验位、停止位。
②、配置波特率
需要配置PCON、SCON、AUXR(抗干扰)、TMOD、TL1、TH1、ET1、TR1
1)、AUXR中B1面向外接的EXTRAM,B0:ALEOFF减少电磁辐射
sfr AUXR = 0x8e; //声明AUXR寄存器的地址
AUXR=0x01; //降低晶振对外界干扰,减少电磁辐射
/*ALEOFF位置1,禁止ALE信号输出,提升系统的EMI性能,复位后为0,ALE信号正常输出*/
2)、SCON——串行控制寄存器:选择串行通信工作方式
根据B7的SM0、B6的SM1组合确定串口工作方式。如下图:
方式0 和 方式2直接和晶振挂钩,不能配置。
方式1 和 方式3能根据定时器溢出率来配置。
正常情况下选择方式1、3来配置。
B4的REN——允许/禁止串行接收控制位(是否接收,REN=1为接收)
3)、PCON——配置波特率加倍或不加倍,一般不加倍,
D7的**SMOD**与串口通信有关
(SMOD=1;串口方式1,2,3,时,波特率加倍)
(SMOD=0;串口方式1,2,3,时,波特率正常,不加倍)
D6的**SMOD0**帧错误有效检测控制位。
4)、配置定时器1——定时器1的工作方式,8位自动重装。TMOD&=0F;TMOD|=20;波特率由内部定时器(晶振)产生,用软件设置不同波特率和选择不同的工作场合。
主机可以通过查询或中断方式对接收、发送进行程序处理。
配置高四位,M1=1,M0=0,:8位自动重装载定时器,当溢出时将TH1的值自动装入TL1。
5)、配置完PCON,计算出波特率初始值TH1与TL1;
波特率=(2^SMOD/32)x(晶振频率/12/(256-TH1))
9600=(2^0/32)x(11059200/12/(256-TH1))
9600x32=11059200/12/(256-TH1)
307200=921600/(256-TH1)
256-TH1=3
TH1=253,
二进制:1111 1101
十六进制:TH1=0xFD;TL1=0xFD;
6)、禁止定时器中断,ET1=0
7)、启动定时器,TR1=1
依据手册,自行配置,需要配置
PCON、SCON、AUXR(抗干扰)、TMOD、TL1、TH1、ET1、TR1
SCON = 0x40; //配置串口工作方式1,REN不能接收
PCON = //使用默认不倍速,不配置,不动
TMOD &= 0x0F //先把高四位清0:0000 1111
TMOD |= 0x20 //或上0010 0000为0010 0000,设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器
#include "reg52.h"
#include
sfr AUXR = 0x8E; //声明AUXR寄存器的地址
//串口初始化
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 Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
char data_msg = 'a';
//配置c51串口的通信方式
UartInit();
while(1){
Delay1000ms();
//往发送缓冲区中写入数据,就完成了数据的发送
SBUF = data_msg;
}
}