C51串口通讯
@
电路图
计算机通信
1,PC机与PC机通信
2,PC机与单片机通信(本讲只讲这一种)
3,单片机与单片机通信
串行通讯与并行通讯
并行通信通常是将数据字节的各位用多条数据线同时进行传送
特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送
特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂
并行通信:数据多位同时传送
控制简单,传输速度快,传输线较多
串行通信:数据字节一位一位在一条传输线上逐个传送
传输线少,可利用电话网,但传送控制复杂
串行通讯
1,异步通讯
收、发设备使用各自时钟
以字符(构成的帧)为单位
字符间是异步的
字符内各位是同步的
特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高
数据格式
2,同步通讯
发送方时钟与接收方时钟同步。既保持位同步,也保持字符同步
传输方向分为(单工,半双工,全双工)
传输速率与传输距离
比特率:每秒钟传输二进制代码的位数
波特率:每秒钟调制信号变化的次数,即每秒钟发送的位数,单位是:波特(Baud)
1,波特率和比特率不总是相同的,但对于基带传输,比特率和波特率是相同的
2,传输距离随传输速率的增加而减小
串口结构
有两个物理上独立的接收、发送缓冲器SBUF寄存器,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误
工作方式寄存器SCON
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
- RI:接收中断标志位
接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位) - TI:发送中断标志位
发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位) - TB8:用来存放发送的第9位。
- RB8:用来存放接收的第9位。
- REN:是串行接收允许位
0时:允许串行接收
1时:禁止串行接收
SM0 | SM1 | 方式 | 说明 | 波特率 |
---|---|---|---|---|
0 | 0 | 0 | 移位寄存器 | fosc/12 (fosc晶振频率) |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fosc/64 or fosc/32 |
1 | 1 | 3 | 11位异步收发器(9位数据) | 可变 |
SM2:多级通信控制位
因为多级通信是在工作方式2和工作方式3下进行的,因此SM2主要用在工作方式2和工作方式3。
当SM2=0时:不论接收的第9位是0还是1,都接收数据,产生中断。当SM2=1时:只有在接收到的第9位为1时,才接收数据,并产生中断;而如果接收到的第9位为0时,则将接收到的数据丢弃,不产生中断
工作方式寄存器PCON
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | SMOD | - | - | - | - | - | - | - |
- PCON是没有位寻址的,也就是说不能直接操作* * * SMOD要直接操作PCON寄存器。
- SMOD:是波特率是否加倍的选择位。
0时:波特率不加倍。
1时:波特率加倍
波特率与溢出率
- 波特率定义:串口通信时的速率,即每秒传输二进制代码的位数。 单位:bps;1位 = 1bps
- 定时器的溢出率定义:定时器记满溢出的频率;即一秒内定时器溢出的次数;单位:HZ
初值计算
1,波特率=(2SMOD)/32定时器T1的溢出率
定时器T1的溢出率=单片机内部时钟频率/(256-X)X是定时器的初值
2,波特率=(2SMOD)/32(单片机内部时钟频率/(256-X))
- 方式0:fosc/12 //fosc为系统晶振频率
- 方式1:(2^SMOD/32)*(T1溢出率)
- 方式2:(2^SMOD/64)*fosc
- 方式3:(2^SMOD/32)*(T1溢出率)
单片机中,常用的晶振频率为:12MHz和11.0592MHz,选用的波特率也相对固定
初值计算例子
通信方式为方式1,波特率为9600bps,晶振频率为11.0592MHZ,smod = 1时,定时器T1装入的初值为X
方式1的公式
波特率 =(2^SMOD/32)*(T1溢出率)
则9600 = (2^1/32) * (11059200 / (256 - X) * 12)
所以初值x = 250
公式解释
可以先看看上篇关于周期的内容C51定时器计数器
一个机器周期可以传输一位bit,所以理论上晶振为11.0592M的C51在一秒内可以传输11059200位bit,但如果要设定波特率位9600,如下
11059200 / 12 是一秒内有多少个机械周期,再除于16-(2^1/32),这里是这样的,实际上串口模块比我们模拟的要复杂和精确一些,采取的方式是把一位信号采集16次,其中第7、8、9次取出来,两次如果是高电平,那么就认定这一位数据是1,如果两次是低电平,那么就认定这一位是0,再除于计数值-(265-X),表示一秒内定时器溢出多少次,即溢出一次即传输一位bit,也就是一秒内传输多少位的波特率
代码步骤
先设置波特率:
设置定时器T1为工作方式2(设置TMOD寄存器)
给计数器赋初值(工作方式2会自动重装)
设置串口工作方式:
设置SCON(如果允许)
如果使用中断方式,那么打开相应的中断和总中断。
打开定时器T1,开始产生波特率。
设置TRx
代码示例
/************************************************************
配合串口助手使用 将pc机发出的数据传送到单片机中,单片机将接收到的数据发送到pc机 可以在串口助手上显示
波特率:9600
************************************************************/
#include<reg52.h>
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //SMOD=0,32分频
TH1=0Xfd; //计数器初始值设置,注意波特率是9600的
TL1=0Xfd;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartConfiguration();
while(1);
}
void uart() interrupt 4
{
unsigned char date;
date = SBUF;//取出接收到的数据
RI = 0;//清除接收中断标志位
SBUF = date;//将接收到的数据放回发送缓存器
while(!TI);//等待发送数据完成
TI = 0;//清除发送中断标志位
}
...Thank you for reading...______________________Heisenberg_Poppings