C51单片机————串行接口


C51单片机————串行接口


Created with Raphaël 2.1.2 张三 张三 李四 李四 嘿,四哥,我最近在学习串行接口? 想了想!有我啥事 嗯!牛逼 我有点不懂? 哪里不懂哇 额! 都不懂 。。。

1.引文

计算机和外界的信息交换叫做通信。

串行和并行

基本的通信方式分为2种:串行和并行
串行通信:这种通信方式发送/接收数据是一位一位按顺序(bit)的进行传输的(相当于公路的单行道吧!)

传输线多(每次多传一位就多一根线)、价格贵、适合近距离的传输、传输速度快

并行通信:发送/接收数据可以是多位同时传输的(到底是多少位一起传输,要看硬件设备了)

传输线只需要1到2根就可以、便宜、远距离传输、但是速度慢(别人一次传几个,你一次传一个你说慢不慢)


同步和异步

这个怎么区分呢?
根据帧信息的格式区分的!
同步:我的理解就是通信的双方拥有相同的时间线,严格按照此时间线进行通信
1. 通信的数据格式是 :同步字符–连续的数据–校验字节
2. 速度高于异步,硬件结构高
异步:可以看做不同时间轴的操作
1. 通信的数据格式是 :一帧数据为11位的帧格式:起始位–数据8位–校验位-停止位 (1帧==11位)

通俗点的理解:
大家都买过衣服吧!在商场去买和在某宝上买就像同步和异步操作。
在商场买衣服,需要选衣服,选了衣服后让服务员帮你包好,然后结束自己带回家,这个过程是连续的。
在某宝上呢?你只是需要选衣服、下单然后就等着收快递了,虽然衣服还没有送到家,但是你买衣服的任务已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了。
额。。。好像也不通俗。。。


通信方向

单工传送:单行道,数据只可以朝着一个方向!
半双工:可以双向传送的车道,但是两个方向不可同时使用(不能同时发送接收)
全双工:双向传送的车道,可同时发送接收。

2.串行通信的任务

Created with Raphaël 2.1.2 李四 李四 张三 张三 CPU处理什么数据的?知道吗 额,并行数据 对了!那他怎么处理串行数据呢? 对啊!怎么处理啊? 以手蒙面状 。。。

串行接口就在这儿起作用了?
CPU处理并行数据的,让他处理串行数据的话就需要串行接口的帮忙了!CPU还要遵守串行通信的协议(通信双方都需要遵守的约定,约定有:数据格式、同步方式、传送步骤、检查/纠错的方式、控制符的定义。。。)

串行接口的任务:
  1. 数据的处理(不同的串行通信有不同的数据格式)
  2. 并行数据和串行数据的转换
  3. 数据的传输速度
  4. 传输的错误检测(奇偶校验位、校验码。。。)
串行接口的类型:

串行通信接口Serial Communication Interface:设备之间互联接口,互相之间距离较长

串行扩展接口Serial Expand Interface: SPI IIC。。。

Baud rate | bps | Band width:

Baud rate波特率:单位时间里传输的二进制代码有效位数

bps比特率:单位时间里传输的码元个数

Band width带宽:
1. 模拟信号中:带宽是信号所占频率
2. 数字信号里:带宽是传送数字信号速率

单片机中波特率和比特率数值上相同(一个状态对应一个1或0)


3.单片机串行口结构和工作原理

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接收到的数据


(1)SCON 串行口控制寄存器(地址98h)
SCON (98H)
SM0
SM1SM2
REN TB8
RB8 TI
RI
方式选择
多机通信控制
串行接收允许欲发的第九位
欲收的第九位发送中有无中断
接收中有无中断
有四种方式0、1、2、3
方式2、3时候用
0禁止、1允许方式2、3中
方式2、3中软件清零 硬件置一
软件清零 硬件置一

(2)PCON 串行口控制寄存器(地址87h)
PCON (78H)
SMOD
XX
X GF1
GF0PD
IDL
波特率加倍位
XX
X通用标志位掉电方式位待机方式位
1加倍、0不加倍
XX
X用户可作为软件使用标志1激活掉电工作方式1激活待机工作方式

4.单片机串行口工作方式


方式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=2SMOD32fosc12256X 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=2SMODfosc64 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=2SMOD32fosc12256X 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(分别是发送和接收)位提供的

5.单片机串行口编程

编程要点:
1. 波特率计算
2. 控制字填写
3. 两种工作方式选择(查询和中断)
4. 两方波特率一致,可约定某一个标志字符作为发送数据的开始(多机通信中,标志字符就是各分机的地址)


  • 查询方式:
    发送程序:发数据— 查询TI — 发送下一个数据(先发后查)
    接收程序:查询RI—读数据—查询RI—读下一个数据(先查后收)
  • 中断方式:
    发送程序:发数据—等待中断 — 发送下一个数据
    接收程序:等待中断,在中断中再接收下一个数据

两种方式中都要注意清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

如有错误!请多多包含,方便的话留个言!我好马上修改。

  • 22
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
书名:《Visual C#.NET串口通信及测控应用典型实例》(电子工业出版社.李江全.邓红涛.刘巧.李伟) PDF格式扫描版,全书分为8章,共369页。2012年5月出版。 全书压缩打包成3部分,这是第3部分 内容简介 本书从工程应用的角度出发,通过8个典型应用实例,包括PC与PC、PC与单片机、PC与PLC、PC与远程I/O模块、PC与智能仪器、PC与无线数传模块、Pc与USB数据采集模块等组成的测控系统,利用SerialPort控件和MSComm控件编写C#.NET串口通信程序,并对计算机测控系统中的4类典型应用((模拟量输入(AI)、模拟量输出(AO)、数字量输入(DI)和数字量输出(DO)的程序设计方法进行了详细的讲解。 目 录 第1章 PC与PC串口通信 1.1 串口通信概述 1.1.1 串口通信的基本概念 1.1.2 RS-232C接口标准 1.1.3 RS-422/485接口标准 1.1.4 串口通信线路连接 1.1.5 PC中的串行端口 1.1.6 虚拟串口的使用 1.2 VC++.NET串行通信控件与API函数 1.2.1 MSComm控件的使用 1.2.2 SerialPort控件的使用 1.2.3 串行通信API函数 1.3 PC与PC串口通信实例 1.3.1 两台PC串口通信 1.3.2 一台PC双串口互通信 第2章 PC与单片机串口通信 2.1 典型单片机开发板简介 2.1.1 单片机测控系统的组成 2.1.2 单片机开发板B的功能 2.1.3 单片机开发板B的主要电路 2.2 PC与单片机串口通信实例 2.2.1 PC与单个单片机串口通信 2.2.2 PC与多个单片机串口通信 2.3 PC与单片机串口通信测控应用实例 2.3.1 模拟量输入 2.3.2 模拟量输出 2.3.3 开关量输入 2.3.4 开关量输出 第3章 PC与西门子PLC串口通信 3.1 西门子PLC模拟量扩展模块与通信协议 3.1.1 西门子PLC模拟量输入模块 3.1.2 西门子PLC PPI通信协议 3.2 PC与西门子PLC串口通信测控应用实例 3.2.1 模拟量输入 3.2.2 模拟量输出 3.2.3 开关量输入 3.2.4 开关量输出 第4章 PC与三菱PLC串口通信 4.1 三菱PLC特殊功能模块与通信协议 4.1.1 FX2N系列PLC的特殊功能模块 4.1.2 三菱PLC编程口通信协议 4.2 PC与三菱PLC串口通信测控应用实例 4.2.1 模拟量输入 4.2.2 模拟量输出 4.2.3 开关量输入 4.2.4 开关量输出 第5章 PC与分布式I/O模块串口通信 5.1 典型分布式I/O模块简介 5.1.1 集散控制系统的结构与特点 5.1.2 ADAM4000远程数据采集控制系统 5.1.3 ADAM4000系列模块简介 5.1.4 ADAM4000系列模块的软件安装 5.2 PC与分布式I/O模块串口通信测控应用实例 5.2.1 模拟量输入 5.2.2 模拟量输出 5.2.3 数字量输入 5.2.4 数字量输出 第6章 PC与智能仪器串口通信 6.1 典型智能仪器简介 6.1.1 智能仪器的结构与特点 6.1.2 XMT-3000A型智能仪器的通信协议 6.2 PC与智能仪器串口通信测控应用实例 6.2.1 PC与单台智能仪器温度测控 6.2.2 PC与多台智能仪器温度测控 第7章 PC与无线数据传输模块串口通信 7.1 典型无线数传模块简介 7.1.1 无线数传技术概述 7.1.2 DTD46X系列无线数传模块 7.2 PC与无线数传模块串口通信测控应用实例 7.2.1 设计任务 7.2.2 线路连接 7.2.3 利用C51语言实现基于DS18B20的单片机温度测控 7.2.4 利用汇编语言实现基于DS18B20的单片机温度测控 7.2.5 利用VC++.NET实现PC与无线数传模块温度测控 第8章 USB串行总线模块测控应用 8.1 USB总线在数据采集系统中的应用 8.1.1 USB总线及其数据采集系统的特点 8.1.2 采用USB传输的数据采集系统 8.1.3 典型USB数据采集模块及应用 8.1.4 VC++.NET数据采集与控制的方式 8.2 PC与USB数据采集模块测控应用实例 8.2.1 模拟量输入 8.2.2 模拟量输出 8.2.3 数字量输入 8.2.4 数字量输出 参考文献
C51单片机串口通讯是将单片机与其他设备(如电脑、其他单片机等)之间进行数据传输的一种方式。C51单片机内置了一个串口通讯模块,可以实现串口通讯功能。 C51单片机串口通讯的具体步骤如下: 1. 配置串口通讯的波特率、校验位、数据位等参数。 2. 初始化串口通讯模块。 3. 发送数据:将需要发送的数据存储在串口发送缓冲区中,当串口发送缓冲区为空时,将数据发送出去。 4. 接收数据:当有数据到达串口接收缓冲区时,从串口接收缓冲区中读取数据。 C51单片机串口通讯的具体实现可以参考以下代码示例: ```c #include <reg52.h> #include <stdio.h> // 定义波特率为9600 #define BAUDRATE 9600 // 定义计算波特率的预分频值 #define PRESCALER (65536 - (11059200 / 12 / BAUDRATE)) // 初始化串口通讯模块 void InitUART() { // 设置波特率 TMOD &= 0x0F; TMOD |= 0x20; TH1 = PRESCALER / 256; TL1 = PRESCALER % 256; // 启用串口通讯模块 TR1 = 1; // 设置串口通讯模式 SCON = 0x50; } // 发送一个字符 void SendChar(char c) { SBUF = c; while (TI == 0) ; TI = 0; } // 发送一个字符串 void SendString(char *s) { while (*s != '\0') { SendChar(*s); s++; } } // 接收一个字符 char ReceiveChar() { while (RI == 0) ; RI = 0; return SBUF; } // 主函数 void main() { char data; InitUART(); SendString("Hello, world!\r\n"); while (1) { data = ReceiveChar(); SendChar(data); } } ``` 以上代码实现了C51单片机与电脑之间的串口通讯,可以通过终端软件(如SecureCRT、TeraTerm等)进行测试和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值