开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!
废话
因为是通过观看郭天祥《新概念51单片机C语言教程》在B站的视频来学习的,所以有些内容加快学习的,(毕竟人家是十天学会单片机,哈哈哈),所以先来总结一些串口通信的笔记,然后接着学习吧。说半天废话,主要的意思就是这篇内容是笔记,是我认为重要的内容,一定会有遗漏,详细参考郭天祥《新概念51单片机C语言教程》。
串口通信概念
计算机通信分为串行通信和并行通信,我们主要学习串行通信。
串行:将数据分成一位一位的形式在一条传输线逐个传送。而串行通信也有两种形式:异步和同步。
异步:
- 以字符为单位
- 各帧之间还有间隔
- 效率不高
同步:要建立发送方时钟频率对接收方时钟频率的直接控制
- 外同步
- 自同步
这两种同步的目的都是为了两方的时钟一致
错误校验:判断传输过程中内容是否出
- 奇偶校验
- 代码和校验
- 循环冗余校验
比特率(波特率):即串口通信中数据传输速率
- 每秒钟传输二进制代码的位数
- 单位:位/秒(bps)
- 波特率与传输距离成正比
常见接口
-
RS-232C接口
定义数据终端(DIE)与数据通信设备(DCE)之间物理接口
规定使用25针连接器
TXD:25针–>2 9针–>3
SGND:25针–>7 9针–>5
RXD:25针–>3 9针–>2
存在问题:
传输距离短、传输速率低
电平偏移
抗干扰能力差(不得不采用比较大的电压振幅) -
RS-442A接口
输入驱动器为双端平行驱动器
差分接收器可到分辨率200mv以上的电位差
90kbps时,传输距离为1200m
- RS-485接口
多发送器标准
传输距离可达1200m,速率可达1Mbps
用在工业控制 - 80C51串行口
有两个物理上独立的接受、发送寄存器SBUF
发送时cpu主动完成的,不会产生重叠错误
80C51串行口
控制寄存器SCON:用来设定串行口的工作方式、接受/发送控制、设置状态标志。
串行口工作方式有4种,由SCON寄存器种SM0和SM1控制
一般情况下我们使用工作方式1(SM0=0;SM1=1;)10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制)
允许串行口接受位:REN
我们若想接受数据REN必须为1(REN=1;)
发送中断标志位:TI
简单说就是内容发送完毕后,由内部硬件使TI置1,向CPU发出中断申请,必须由软件清0。
接受中断标志位:RI
简单说就是内容接受完毕后,由内部硬件使RI置1,向CPU发出中断申请,必须由软件清0。
波特率倍增位SMOD(PCON^7)
串行口工作方式为1、2、3时,波特率与SMOD有关
SMOD=1 波特率提高一倍
SMOD=0 波特率不变
- 波特率计算
这里只说方式1的计算公式。
波特率=(2^SMOD/32)*(T1溢出率)
使T1工作在自动装入的8位定时器模式(方式2)
T1溢出率=fosc/[12X(256-TH1)]
可以用软件计算哦!!!
编写步骤
初始化
- 确定T1的工作方式(TMOD)
- 设T1的初值(波特率初值,8位,TH1和TL1一样)
- (看情况)PCON=0x80;(加倍)
- 启动T1(TR1)
- 中断设置(串口中断、总中断)
可以在主函数中用查询法也可以用中断法写中断函数
接受数据(相对于单片机)
设定一变量存放数据(一般定义为全局变量)
软件清0(RI)
存放SBUF的数据 SBUF–>变量
发送数据(相对于单片机)
设定一变量存放数据(一般定义为全局变量)
SBUF存放数据 变量–>SBUF
检测数据是否发送完毕(可用while循环)
软件清0(TI)
应用
用户在计算机以16进制通过串口发送数据,点亮对应LED并且传回计算机。
#include "reg52.h"
#include "intrins.h"
#define led P2
typedef unsigned int u16;
typedef unsigned char u8;
u8 recData;
void SeriInit(){
TMOD=0x20;
TH1=0xF4;
TL1=0xF4;
PCON=0x80;
TR1=1;
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
}
void main(){
SeriInit();
while(1);
void Seri() interrupt 4{
RI=0;
recData=SBUF;
led=recData;
SBUF=recData;
while(!TI);
TI=0;
}