计算机和外界的信息交换叫做通信。
基本的通信方式分为2种:串行和并行
串行通信:这种通信方式发送/接收数据是一位一位按顺序(bit)的进行传输的(相当于公路的单行道吧!)
传输线多(每次多传一位就多一根线)、价格贵、适合近距离的传输、传输速度快
并行通信:发送/接收数据可以是多位同时传输的(到底是多少位一起传输,要看硬件设备了)
传输线只需要1到2根就可以、便宜、远距离传输、但是速度慢(别人一次传几个,你一次传一个你说慢不慢)
这个怎么区分呢?
根据帧信息的格式区分的!
同步:我的理解就是通信的双方拥有相同的时间线,严格按照此时间线进行通信
1. 通信的数据格式是 :同步字符–连续的数据–校验字节
2. 速度高于异步,硬件结构高
异步:可以看做不同时间轴的操作
1. 通信的数据格式是 :一帧数据为11位的帧格式:起始位–数据8位–校验位-停止位 (1帧==11位)
通俗点的理解:
大家都买过衣服吧!在商场去买和在某宝上买就像同步和异步操作。
在商场买衣服,需要选衣服,选了衣服后让服务员帮你包好,然后结束自己带回家,这个过程是连续的。
在某宝上呢?你只是需要选衣服、下单然后就等着收快递了,虽然衣服还没有送到家,但是你买衣服的任务已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了。
额。。。好像也不通俗。。。
单工传送:单行道,数据只可以朝着一个方向!
半双工:可以双向传送的车道,但是两个方向不可同时使用(不能同时发送接收)
全双工:双向传送的车道,可同时发送接收。
串行接口就在这儿起作用了?
CPU处理并行数据的,让他处理串行数据的话就需要串行接口的帮忙了!CPU还要遵守串行通信的协议(通信双方都需要遵守的约定,约定有:数据格式、同步方式、传送步骤、检查/纠错的方式、控制符的定义。。。)
串行通信接口Serial Communication Interface:设备之间互联接口,互相之间距离较长
串行扩展接口Serial Expand Interface: SPI IIC。。。
Baud rate波特率:单位时间里传输的二进制代码有效位数
bps比特率:单位时间里传输的码元个数
Band width带宽:
1. 模拟信号中:带宽是信号所占频率
2. 数字信号里:带宽是传送数字信号速率
单片机中波特率和比特率数值上相同(一个状态对应一个1或0)
51单片机的串行口:可编程、全双工。
1. 可作为UART(Universal Asynchronous Receiver/Transmitter)
2. 同步移位器
3. 帧格式:8位、10位、11位
4. 可设置波特率
SBUF:发送和接收的数据缓冲区
SOCN:串行口控制寄存器 (98H)
PCON:电源控制寄存器 (87H)
TI:发送中断标志位 (方式0:发送结束硬件置1 发送前软件置0)
RI:接收中断标志位 (方式0:发送结束硬件置1 发送前软件置0)
TXD: P3.1引脚,发送数据口
RXD: P3.0引脚,接收数据口
发送和接收SBUF可同时发送接收(它们在物理上独立的)但是它们公用 SFR地址99H。
发送时:data 写入SBUF ,经过TXD发出
接收时:存储RXD接收到的数据
SCON (98H) | |||||||
SM0 |
SM1 | SM2 |
REN | TB8 |
RB8 | TI |
RI |
方式选择 |
多机通信控制 |
串行接收允许 | 欲发的第九位 |
欲收的第九位 | 发送中有无中断 |
接收中有无中断 | |
有四种方式0、1、2、3 |
方式2、3时候用 |
0禁止、1允许 | 方式2、3中 |
方式2、3中 | 软件清零 硬件置一 |
软件清零 硬件置一 |
PCON (78H) | |||||||
SMOD |
X | X |
X | GF1 |
GF0 | PD |
IDL |
波特率加倍位 |
X | X |
X | 通用标志位 | 掉电方式位 | 待机方式位 | |
1加倍、0不加倍 |
X | X |
X | 用户可作为软件使用标志 | 1激活掉电工作方式 | 1激活待机工作方式 |
方式0:
方式0 :移位寄存器IO方式 |
TXD:移位数据IO |
RXD:移位时钟IO |
波特率 = fosc / 12 |
8位 数据为一帧,不设置其实和停止位,从最低位开始发送 |
发送过程:(1).写SBUF(2).8位数据发完,TI=1(3).发送下一数据 |
接收过程:(1).REN=1(2).8位数据收完,RI=1(3).读SBUF |
功能:(1)短距离单片机之间数据传输(2)扩展输出接口 。。。 |
方式1:
方式1:波特率可变10位异步通信方式 |
TXD:串行数据发送端 |
RXD:串行数据接收端 |
波特率 :
baudrate=2SMOD32∗(T1的溢出率) b a u d r a t e = 2 S M O D 32 ∗ ( T 1 的 溢 出 率 )
|
波特率 :
baudrate=2SMOD32∗fosc12∗(256−X) b a u d r a t e = 2 S M O D 32 ∗ f o s c 12 ∗ ( 256 − X )
>> X为T1的计数初值 T1工作在方式2(这是计数器的工作方式哈) |
10位 数据为一帧,从最低位开始发送 起始位和停止位是自动插入的 |
使用了T1计数器 |
方式2:
方式2:波特率固定11位异步通信方式 |
TXD:串行数据发送端 |
RXD:串行数据接收端 |
波特率固定 :
baudrate=2SMOD∗fosc64 b a u d r a t e = 2 S M O D ∗ f o s c 64
|
11位 数据为一帧,从最低位开始发送 |
起始位和停止位是自动插入的 |
第九个数据是TB8、RB8(分别是发送和接收)位提供的 |
方式3:
方式3:波特率可变11位异步通信方式 (数据格式同方式2、波特率计算同方式1) |
TXD:串行数据发送端 |
RXD:串行数据接收端 |
波特率可变同方式1 :
baudrate=2SMOD32∗fosc12∗(256−X) b a u d r a t e = 2 S M O D 32 ∗ f o s c 12 ∗ ( 256 − X )
>> X为T1的计数初值 T1工作在方式2(这是计数器的工作方式哈) |
11位 数据为一帧,从最低位开始发送 |
起始位和停止位是自动插入的 |
第九个数据是TB8、RB8(分别是发送和接收)位提供的 |
编程要点:
1. 波特率计算
2. 控制字填写
3. 两种工作方式选择(查询和中断)
4. 两方波特率一致,可约定某一个标志字符作为发送数据的开始(多机通信中,标志字符就是各分机的地址)
两种方式中都要注意清TI、RI
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TMOD,#20H ;TMOD设置 T1方式二
MOV TH0 ,#3cH;
TL0 = #0b0H; ;初值
MOV SCON,#40H ;SCON设置 串行方式1
MOV R0,#20h ;发送的数据缓冲区起始地址
MOV R7,#32 ;发送的数据个数
SETB TR1 ;启动定时器,TRx = 1
SETB EA ;中断总开关
SETB ET1 ;定时器0 允许中断
LOOP:
MOV SBUF,@R0;发送的数据放到缓冲区
JNB TI,$ ; TI==0 死循环
CLR TI ;软件清零
INC R0 ;下一个数据
DJNZ R7,LOOP;是否发完
HERE:AJMP HERE
END
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TMOD,#20H ;TMOD设置 T1方式二
MOV TH0 ,#3cH;
TL0 = #0b0H; ;初值
MOV SCON,#50H ;串行方式1 可接收REN
MOV R0,#20h ;发送的数据缓冲区起始地址
MOV R7,#32 ;发送的数据个数
SETB TR1 ;启动定时器,TRx = 1
SETB EA ;中断总开关
SETB ET1 ;定时器0 允许中断
LOOP:JNB RI,$ ;RI ==0 死循环
CLR RI ;软件清零
MOV @R0,SBUF;发送的数据放到缓冲区
INC R0 ;下一个数据
DJNZ R7,LOOP;是否发完
HERE:AJMP HERE
END
如有错误!请多多包含,方便的话留个言!我好马上修改。