徐晓峰
2021.5.8
两种通信方式
- 串行通信:
串行通信是将数据字节分成一位一位的形式在。 - 并行通信:
并行通信通常是将数据字节的各位用多条数据线同时进行传送 。
串行通信又分两种
- 同步通信
同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。此时数据以位的形式连续发送 - 异步通信
异步通信的发送方和接收方使用各自的时钟控制数据的发射接收,发送端可以在任意时候发送字符。此时数据以帧的形式连续发送(一个帧数据有十位:分别是一个起始位、八个数据位、一个停止位)
波特率
计算
波特率用来衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。
- 例如:最常用的传输速率9600,其意思是,每秒传输960帧数据,一帧数据是十个二进制数。即960*10=9600
设置
一般是将定时中断1(T1)作为波特率的发生器,并且T1采用的是工作方式2。
- 此时波特率的计算公式为:
解释一下公式中的几个含义
- SMOD:波特率选择位
SMOD属于PCON寄存器,不可位寻址,其可作为波特率加倍标志,置0的时候不加倍,置1的时候串行通信方式波特率加倍
- fosc:单片机的晶振频率
51单片机仿真一般默认的是12Mhz,但其误差相对较大,精准计时一般采用11.0529MHz
- 256-T初:每次定时器计数的次数
此时波特率发生器T1是工作方式2(八位数据自动装填),初始值在开始时装入TH1和TL1,正常工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
注:八位二进制数的范围是0~255,共256个数
波特率9600的初始化设置
- 1、 设置定时器T1的工作方式:
TMOD=0X20;// 使定时器T1处于工作方式2; - 2、计算T1的初始值:
TH1=0XFD;
TL1=0XFD;// 并装载TH1和TL1,波特率为9600bps时 - 3、启动T1:
TR1=1; // 打开T1定时器
PCON=0X80; //波特率加倍
SCON=0X50; //设置为工作方式1:8位数据位
串口工作方式的选择
- 设置SM0和SM1,设置工作方式
TI与RI的作用
- TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0;)
- RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0;)
两者都在SCON寄存器内
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/165d22e14d290537c9cd165a700e9618.png)
串行通信实验源码
#include <reg51.h>
void delay(unsigned int x);
void putchar(unsigned char data1); //字符发送函数
void putstring(unsigned char *dat);//字符串发送函数
void main(void)
{
unsigned char c = 0;
SCON = 0x40; //串口工作方式设置
TMOD = 0x20; //定时器工作方式设置
PCON = 0x00; //波特率倍增设置
TL1 = 0xfd; //波特率设置
TH1 = 0xfd;
TI = 0; // 清0发送中断标志
TR1 = 1; //开启定时器
while(1)
{
// 在这里略过笔者个人输出的内容,如果需要输出
// 在while中加入输出,常规C语言即可
//实在写不来的同学,在后面见附件
}
}
void delay(unsigned int x) //延时
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
void putchar(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
void putstring(unsigned char *dat)
{
while(*dat != '\0') //判断字符串是否发送完毕
{
putchar(*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
}
}
实验原理图如下
- 原理图十分的简单,只需要RX-TX,TX-RX,即可
这里的仿真串口检测在这里!
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cb62e4e016c0bd325931af56b4e32afd.png)
可能有些朋友发现仿真运行却打不开这个串口终端…
运行后在这里点开
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d2e41331b89822510e4351ca068163b1.png)
就可以查看显示的是什么了,否则是观察不到的
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/de1b0ce00b6f01fd0bf00608c8751889.png)
(究极保姆教学…我尽力了)
附上打包的工程文件:
https://download.csdn.net/download/Alangman/18480056