串口通信

串口通信
  
  通信按照基本类型可以分为并行通信和串行通信。并行通信的各个数据位同时传送,但占用资源多,成本高;而串行通信的数据位是由低位到高位一位一位发送的。
  常用的通信从传输方向上可以分为单工通信、半双工通信、全双工通信三类。
 1.单工通信就是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥控器、收音机广播等,都是单工通信技术。
 2.半双工通信是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如我们的对讲机就是典型的半双工。
 3.全双工通信就发送数据的同时也能够接收数据,两者同步进行,就如同我们的电话一样,我们说话的同时也可以听到对方的声音。

二.串口通信的基本知识:
  通常一个单片机有两个引脚是来做UART通信的,P3.0(RXD)、P3.1(TXD),两个单片机通信的示意图:
  网络慢死了

TXD 是串行发送引脚,RXD是串行接收引脚。两个单片机之间要通信,首先电源基准得一样,所以我们要把两个单片机的 GND 相互连接起来。

串行通信的数据发送过程:
网络慢死了

在 UART 通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止
位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。

三、串口通信速率的约定:

  串口通信的时候涉及到引脚的高低电平的持续时间,比如发送一个0和1,发送引脚先持续一段低电平,在持续一段高电平,那么这个数据就发送过去了,这个时间是如何约定的,这就需要了解通信当中的另外一个概念——波特率(baud)。
  发送一位二进制的时间=1/baud,通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。

四.USB转串口通信

现在大多数的笔记本电脑上已经没有串口了,所以一般我们的电路板上会有一个USB转串口的芯片,以实现实现USB通信协议和标准UART串行通信协议的转换,一般常用的芯片有ch340和pl2303这两个转串口的芯片

五、UART模块介绍:
  51单片机的 UART串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成。
SCON-串行控制寄存器的位分配(地址0x98,可位寻址)

76543210
符号SM0SM1SM2RENTB8RB8TIRI
复位值00000000

SCON - 串行寄存器位描述

符号描述
7/6SM0/SM1这两位共同决定了串口通信的模式 0~模式 3 共 4 种模式。 我们最常用的就是模式 1,也就是 SM0=0, SM1=1,下边我们重点就讲模式 1,其它模式从略。
5SM2多机通信控制位(极少用),模式 1 直接清零。
4REN使能串行接收。由软件置位使能接收,软件清零则禁止接收。
3TB8模式 2 和 3 中要发送的第 9 位数据(很少用)。
2RB8模式 2 和 3 中接收到的第 9 位数据(很少用),模式 1 用来接收停止位。
1TI发送中断标志位,当发送电路发送到停止位的中间位置时, TI 由硬件置 1,必须通过软件清零。
0RI接收中断标志位,当接收电路接收到停止位的中间位置时, RI 由硬件置 1,必须通过软件清零。

可以位寻址的含义:支持对寄存器的单个位进行操作,不可位寻址的只能一次性对寄存器进行整体操作。

串口通信的波特率,只能由定时器T1或T2产生,不能由T0产生。使用定时器2,则需要配置额外的寄存器,默认使用的是定时器1。使用定时器1产生波特率需要使用定时器1的模式2,即自动重载模式:

TH1 = TL1 = 256 - 晶振值/12/2/16/波特率

波特率有关的还有一个寄存器,是一个电源管理寄存器PCON,他的最高位可以把波特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:

TH1 = TL1 = 256 - 晶振值/12 /16 /波特率

关于SBUF寄存器:
  串口通信的发送和接收电路在物理上有2个名字相同的SBUF寄存器,它们的地址也都是0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。意思就是说,有2个房间,两个房间的门牌号是一样的,其中一个只出人不进人,另外一个只进人不出人,这样的话,我们就可以实现UART的全双工通信,相互之间不会产生干扰。我们每次只操作SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收 SBUF 还是发送 SBUF。

//例:发送  
SBUF = 1;
//接受
P0 = SBUF;

六、串口通信的基本配置步骤:
1、配置串口为模式 1。
2、配置定时器 T1 为模式 2,即自动重装模式。
3、根据波特率计算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 进行波特率加倍。
4、打开定时器控制寄存器 TR1,让定时器跑起来。

T1 做波特率发生器的时候,千万不要再使能 T1 的中断了。否则会使产生的波特率发生错误。

void UART_Init(unsigned int baud)
{
SCON = 0x50; //配置串口为模式 1
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x20; //配置 T1 为模式 2
TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止 T1 中断
//ES = 1 ; //使能串口中断
TR1 = 1; //启动 T1
}

当我们使用串口中断的时候:

//首先main函数中打开总中断
main()
{ 
EA = 1;  //使能总中断
UART_Init(9600);  //将里面的串口使能中断打开
...}
//串口中断服务函数
void InterruptUART() interrupt 4
{
if (RI) //接收到字节
{
RI = 0; //手动清零接收中断标志位
SBUF = SBUF + 1; //接收的数据+1 后发回,左边是发送 SBUF,右边是接收 SBUF
}
if (TI) //字节发送完毕
{
TI = 0; //手动清零发送中断标志位
}
}

串口接收和发送数据的时候,都是一个字节一个字节的进行的,假如我们想要发送一个字符串的话,我们可以先写好一个字节的发送函数,然后再写一个发送字符串的函数,通过循环的方式一个字节一个字节的发送过去,这样我们就可以放字符串了。

七、关于ASCII码:
   我们常用的字符就包含了0~9的数字、A~Z/a~z的字母、还有各种标点符号等。那么在单片机系统里面我们怎么来表示它们呢?ASCII码(AmericanStandardCodeforInformationInterchange,即美国信息互换标准代码)可以完成这个使命:我们知道,在单片机中一个字节的数据可以有 0~255 共 256个值,我们取其中的0~127共128个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,当我们用字符格式发送一个小a,其实发送的是十六进制的0x61,这样就体现了ASCII码表的用处,其具体的对应关系如表:
           ASCII码字符表

ASC控制ASCII字符ASCII字符ASCII字符
000NUL032(space)064@096
001SOH033!065A097a
002STX034066B098b
003ETX035#067C099c
004EOT036$068D100d
005END037%069E101e
006ACK038&070F102f
007BEL039071G103g
008BS040(072H104h
009HT041)073I105i
010LF042*074J106j
011VT043+075K107k
012FF044076L108l
013CR045-077M109m
014SO046078N110n
015SI047/079O111o
016DLE0480080P112p
017DC10491081Q113q
018DC20502082R114r
019DC30513083S115s
020DC40524084T116t
021NAK0535085U117u
022SYN0546086V118v
023ETB0557087W119w
024CAN0568088X120x
025EM0579089Y121y
026SUB058:090Z122z
027ESC059;091[123{
028FS060<092\124¦
029GS061=093]125}
030RS062>094^126~
031US063?095_127DEL
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值