十天学会单片机Day4串行口通信
并行与串行基本通信方式
1.并行通信方式
通常是将数据字节的各位用多条数据线同时进行传送。
并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。
2.串行通信方式
是将数据字节分成一位一位的形式在一条传输线上逐个地传送。
串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
3.异步串行通信方式
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。
异步通信的数据格式:
异步通信不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
4.同步串行通信方式
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。
同步通信是以特定的位组合“01111110”作为帧的开始和结束标志,所传输的一帧数据可以是任意位。所以传输的效率较高,但实现的硬件设备比异步通信复杂。
面向字符的同步格式:
面向位的同步格式:
5.串行通信的制式
单工:数据传输仅能沿一个方向,不能实现反向传输。
半双工:指数据传输可以沿两个方向,但需要分时进行。
全双工:指数据可以同时进行双向传输。
6.串行通信的错误校验
奇偶校验:在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。
代码和校验:发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。
循环冗余校验:通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。
7.串行通信接口
RS-232
RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。(阳头)
MAX232:把TTL电平从0V和5V转换到3V~15V或-3V~-15V之间。
分立元件实现RS-232电平与TTL电平转换电路。
TXD 为低 Q3导通 PCRXD拉高(如PC用中断接受的话会产生中断);TXD发送高电平,Q3截止,PCRXD内部高阻,而PCTXD平时是-3~-15V,拉低PCRXD。
PC发送信号:当PCTXD为低电平,Q4截止,RXD拉高为高电平;当PCTXD变高时,Q4导通,RXD被Q4拉倒低电平。双向转换。
MAX232芯片实现RS232电平与TTL电平转换
CH340 USB-COM转换芯片
8.波特率与定时器初值的关系
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位×240个/秒 = 2400 bps
方式0的波特率 = fosc/12
方式2的波特率 =(2^SMOD/64)· fosc
方式1的波特率 =(2^SMOD/32)·(T1溢出率)
方式3的波特率 =(2^SMOD/32)·(T1溢出率)
fosc为晶振频率。SMOD是PCON寄存器最高位。T1溢出率是定时器T1溢出的频率。
T1溢出率=fosc / {12 * [ 256- (TH1) ] }
方式1,在给定时器计满溢出时,自动进入中断服务程序,然后我们需手动再次给定时器装初值。
方式2,当定时器计满溢出后,单片机会自动为其装初值,并且无须进入中断服务程序进行任何处理。定时器溢出速率就会绝对稳定。
Eg:已知串行口通信在串口方式1下,波特率为9600bps,系统晶振频率为11.0592MHZ,求TL1和TH1中装入的数值?
取SMOD=0
9600 = (1/32)*11059200/ {12 *[256 - (X)] }
X=253,转换成16进制0xFD
9.串行口结构
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。
10.寄存器
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符号 | SMOD | (SMOD0) | (LVDF) | (P0F) | GF1 | GF0 | PD | IDL |
SMOD-该位与串口通信波特率有关
SMOD=0:串口方式123时,波特率正常
SMOD=1:串口方式123时,波特率加倍。
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0 | SM1 | 方式 | 功能说明 |
0 | 0 | 0 | 同步移位寄存器方式(通常用于扩展I/O口) |
0 | 1 | 1 | 10位异步收发(8位数据),波特率可变 |
1 | 0 | 2 | 11位异步收发(9位数据),波特率固定 |
1 | 1 | 3 | 11位异步收发(9位数据),波特率可变 |
SM2-多机通信控制位
主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。
在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。
REN-允许串行接收位
由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8-在方式2或方式3中,是发送数据的第九位
可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
在方式0和方式1中,该位未用。
RB8-在方式2或方式3中,是接收到数据的第九位
作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
TI-发送中断标志位
在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI-接收中断标志位
在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请
定时器/计数器工作方式寄存器TMOD在之前已经有过5.
11.步骤
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
⑤串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)
- //串口方式1 I get X
- #include <reg52.h>
- unsigned char flag, a, i;
- unsigned char code table[]="I get ";
- void init()
- {
- TMOD = 0x20;//确定T1工作方式 自动重载8位定时器,收TR1控制
- TH1 = 0xFD;//装初值
- TL1 = 0xFD;
- TR1 = ;//开启定时器
- REN = ;//允许串行口接受
- SM0 = ;//方式1
- SM1 = ;
- EA = ;//中断总开关开
- ES = ;//串行口中断打开
- }
- void main()
- {
- init();
- while()
- {
- if(flag == ) { //有接收
- ES = ; //串行口中断关闭
- for(i = ; i < ; i++) {
- SBUF = table[i]; //SBUF发送寄存器I get
- while(!TI); //发送
- TI = ; //发送中断标志位清0
- }
- SBUF = a; //把接收到的缓存在a中的给SBUF发送
- while(!TI); //发送
- TI = ; //软件清0
- ES = ; //打开串行口中断
- flag = ; //标志清0
- }
- }
- }
- void ser() interrupt
- { //RI=1接收到串行口中断
- RI = ; //软件清0
- a = SBUF; //读取SBUF中数据存于a
- flag = ; //标志置1 代表有接收
- }
- //方式2
- #include <reg52.h>
- void InitUART(void)
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = TH1;
- PCON = 0x00;
- EA = ;
- ES = ;
- TR1 = ;
- }
- void SendOneByte(unsigned char c)
- {
- SBUF = c;
- while(!TI);
- TI = ;
- }
- void main(void)
- {
- InitUART();
- }
- void UARTInterrupt(void) interrupt
- {
- if(RI)
- {
- RI = ;
- //add your code here!
- }
- else
- TI = ;
- }
十天学会单片机Day4串行口通信的更多相关文章
- 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)
1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...
- (九)串行口方式0 拓展并行输出端口 02 74LS164芯片
1.先讲解74LS164 移位芯片: 74HC164.74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出. 数据通过两个输入端(DSA 或 DSB)之一串行输入:任一输入端可 ...
- (九)串行口方式0 拓展并行输入端口 74LS165 芯片
74LS165芯片讲解: 外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单 ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
- 《十天学会单片机和C语言编程》
<十天学会单片机和C语言编程> 大家注意了这个文件只有最新版迅雷可以下载,下面的lesson几就是第几课.点击右键使用迅雷下载. ed2k://|file|[十天学会单片机和C语言编程]. ...
- 80C51串行口
串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度 单工.半双工.全双工 单工数据传输只支持数据在一个方向上传输 半双工数据传输允许数据在两个方向上传输,但是,在 ...
- setserial - 取得/设置 Linux 串行口的信息
总览 setserial [ -abqvVWZ] 设备 [ 命令参数一 [ 设备变元参数 ] ] ... setserial -g [-abGv ] 设备一 ... 描述 setserial 是一个用 ...
- 自制单片机之六……串行I2C总线E2PROM AT24CXXX的应用
这一篇介绍I2C存储器的使用.主要是介绍AT24CXX系列器件,它分为两类,主要是通过被存储容量地址来分的,一类是AT24C02-AT24C16,它的存储容量从256字节到2048字节.另一类是AT2 ...
- 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...
随机推荐
- OLAP如何实现数据的聚合计算-分析过程
- gcc编译, gdb调试, makefile写法
//test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...
- 【转】appium_python_API文档
1.contextscontexts(self): Returns the contexts within the current session. 返回当前会话中的上下文,使用后可以识别H5页面的控 ...
- 纯CSS最小响应网格布局
lemonade.css是一个超级小的CSS可以帮助你创建一个完全响应和灵活自如的网格布局,包括所需网页的头部. 样式链接 <link rel= href=> HTML结构这样创建一个多列 ...
- Oozie 中各种类型的作业执行结果记录
一,提交的作业被SUSPEND,然后再被KILL,记录如下: TYPE1: appType WORKFLOW_JOB id 0000002-160516095026479-oozie-oozi-W e ...
- Flash图表控件FusionCharts如何自定义图表上的垂直线
什么是垂直分割线 垂直(或条形图中的水平)分隔线是用来帮助用户分隔数据块的.可以被放置在任何两个数据点,即使是不规则的间隔也可以. <chart caption='Monthly Revenue ...
- 利用KeyVault来加强存储Azure Storage访问密钥管理
很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了. 但是很多时候存储账号的Key就会不小心分发到开人员.测试人员.和管理员手 ...
- 开源项目:FFmpeg
ffmpeg命令行使用 将JPG格式图片转成YUV420P格式: ffmpeg -i Z:\demo\pic.jpg -s 720x480 Z:\demo\pic.yuv 解码H265成YUV420 ...
- Something wrong with FTK's index search results
My friend she told me last week that FTK could not "see" keywords in a plain text files wh ...
- Excel2007给表格设置成只读加密属性 让他人无法修改
在制作一些报表和公司的表格时,我们常常需要给Excel表格加密或者设置成只读属性来加以防护这些重要表格.给表格加密可以预防他人无法打开表格,只有通过输入正确的密码后才可以正常打开.设置成只读的话,可以 ...