C51单片机————串行接口
C51单片机————串行接口
1.引文
计算机和外界的信息交换叫做通信。
串行和并行
基本的通信方式分为2种:串行和并行
串行通信:这种通信方式发送/接收数据是一位一位按顺序(bit)的进行传输的(相当于公路的单行道吧!)
传输线多(每次多传一位就多一根线)、价格贵、适合近距离的传输、传输速度快
并行通信:发送/接收数据可以是多位同时传输的(到底是多少位一起传输,要看硬件设备了)
传输线只需要1到2根就可以、便宜、远距离传输、但是速度慢(别人一次传几个,你一次传一个你说慢不慢)
同步和异步
这个怎么区分呢?
根据帧信息的格式区分的!
同步:我的理解就是通信的双方拥有相同的时间线,严格按照此时间线进行通信
1. 通信的数据格式是 :同步字符–连续的数据–校验字节
2. 速度高于异步,硬件结构高
异步:可以看做不同时间轴的操作
1. 通信的数据格式是 :一帧数据为11位的帧格式:起始位–数据8位–校验位-停止位 (1帧==11位)
通俗点的理解:
大家都买过衣服吧!在商场去买和在某宝上买就像同步和异步操作。
在商场买衣服,需要选衣服,选了衣服后让服务员帮你包好,然后结束自己带回家,这个过程是连续的。
在某宝上呢?你只是需要选衣服、下单然后就等着收快递了,虽然衣服还没有送到家,但是你买衣服的任务已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了。
额。。。好像也不通俗。。。
通信方向
单工传送:单行道,数据只可以朝着一个方向!
半双工:可以双向传送的车道,但是两个方向不可同时使用(不能同时发送接收)
全双工:双向传送的车道,可同时发送接收。
2.串行通信的任务
串行接口就在这儿起作用了?
CPU处理并行数据的,让他处理串行数据的话就需要串行接口的帮忙了!CPU还要遵守串行通信的协议(通信双方都需要遵守的约定,约定有:数据格式、同步方式、传送步骤、检查/纠错的方式、控制符的定义。。。)
串行接口的任务:
- 数据的处理(不同的串行通信有不同的数据格式)
- 并行数据和串行数据的转换
- 数据的传输速度
- 传输的错误检测(奇偶校验位、校验码。。。)
串行接口的类型:
串行通信接口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 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
方式选择 | 多机通信控制 | 串行接收允许 | 欲发的第九位 | 欲收的第九位 | 发送中有无中断 | 接收中有无中断 | |
有四种方式0、1、2、3 | 方式2、3时候用 | 0禁止、1允许 | 方式2、3中 | 方式2、3中 | 软件清零 硬件置一 | 软件清零 硬件置一 |
(2)PCON 串行口控制寄存器(地址87h)
PCON (78H) | |||||||
SMOD | X | X | X | GF1 | GF0 | PD | IDL |
波特率加倍位 | X | X | X | 通用标志位 | 掉电方式位 | 待机方式位 | |
1加倍、0不加倍 | X | X | 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的溢出率)baudrate=2SMOD32∗(T1的溢出率)
baud rate = \dfrac{{2^{SMOD}}}{32}*(T1的溢出率) |
波特率 :
baudrate=2SMOD32∗fosc12∗(256−X)baudrate=2SMOD32∗fosc12∗(256−X)
baud rate = \dfrac{{2^{SMOD}}}{32}*\dfrac{{fosc}}{12*(256-X)} >> X为T1的计数初值 T1工作在方式2(这是计数器的工作方式哈) |
10位 数据为一帧,从最低位开始发送 起始位和停止位是自动插入的 |
使用了T1计数器 |
方式2:
方式2:波特率固定11位异步通信方式 |
TXD:串行数据发送端 |
RXD:串行数据接收端 |
波特率固定 :
baudrate=2SMOD∗fosc64baudrate=2SMOD∗fosc64
baud rate = \dfrac{{2^{SMOD}}*fosc}{64} |
11位 数据为一帧,从最低位开始发送 |
起始位和停止位是自动插入的 |
第九个数据是TB8、RB8(分别是发送和接收)位提供的 |
方式3:
方式3:波特率可变11位异步通信方式 (数据格式同方式2、波特率计算同方式1) |
TXD:串行数据发送端 |
RXD:串行数据接收端 |
波特率可变同方式1 :
baudrate=2SMOD32∗fosc12∗(256−X)baudrate=2SMOD32∗fosc12∗(256−X)
baud rate = \dfrac{{2^{SMOD}}}{32}*\dfrac{{fosc}}{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设置 串行方式1MOV R0,#20h ;发送的数据缓冲区起始地址MOV R7,#32 ;发送的数据个数SETB TR1 ;启动定时器,TRx = 1SETB 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 可接收RENMOV R0,#20h ;发送的数据缓冲区起始地址MOV R7,#32 ;发送的数据个数SETB TR1 ;启动定时器,TRx = 1SETB EA ;中断总开关SETB ET1 ;定时器0 允许中断LOOP:JNB RI,$ ;RI ==0 死循环 CLR RI ;软件清零MOV @R0,SBUF;发送的数据放到缓冲区INC R0 ;下一个数据DJNZ R7,LOOP;是否发完
HERE:AJMP HERE
END
如有错误!请多多包含,方便的话留个言!我好马上修改。
C51单片机————串行接口相关推荐
- 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】
C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...
- c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...
C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟 学 号: 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 流水灯实验 实验目的: 简单I/O引 ...
- C51单片机学习思维导图
C51单片机学习总结: 图片链接 由于原稿丢失,只有图片链接
- C51单片机————总线与系统扩展
C51单片机----总线与系统扩展 Created with Raphaël 2.1.2张三张三李四李四四哥,IO口不够用怎么办?你可以进行系统扩展!什么鬼?那是什么东西?...看书去 1.引文 前面 ...
- C51单片机————汇编与C语言
C51单片机-----汇编与C语言 如有错误,请留言指正!!!
- C51单片机——指令系统
C51单片机--指令系统 图片可点击放大观看 如有错误,请多多包含! 可以的话请留言,好及时修改!
- C51单片机数码管动态显示
数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示: C5 ...
- c51单片机烧录程序 控制台显示正在检测目标单片机
问题 c51单片机烧录程序 控制台显示正在检测目标单片机 详细问题 笔者使用单片机型号STC89C52, 进行程序烧录.控制台显示正在检测目标单片机 解决方案 将单片机型号由STC89C52更改为ST ...
- 基于C51单片机的万年历设计(LCD1602显示)
C51单片机万年历设计 注:该程序基于普中科技C51 V2.2开发板设计,库函数和硬件资料均来自普中科技,侵删.main.c大部分为原创,如有雷同,纯属巧合. 名称:C51万年历. 硬件:以C51芯片 ...
最新文章
- Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化
- cppcheck编译安装命令
- cisco pix防火墙命令使用
- Python可视化应用实战-三万字长文(建议收藏)matplotlib可视化实例,实操有效
- 9行代码满分 【C语言】 L1-062 幸运彩票 (15分)
- SUSE11 搭建iscsi target 配置
- 智慧城市产业图谱研究报告(2020年)
- BookKeeper总结
- 【函数计算月报】2018年10月刊
- access游戏库不显示 ea_全球游戏公司营收一览:腾讯连续第六年霸榜
- 整数实例hdu2041(超级楼梯)
- spring事务传播机制源码学习笔记
- 易优CMS:arcview的基础用法
- cada0图纸框_求标准CAD图纸(A0、A1、A2、A3、A4)图框(外框、内框)、标题栏及明细栏大小样式字体是多大?...
- ubuntu mysql卸载教程_ubuntu下安装mysql及卸载mysql详细教程/方法
- python爬取百思不得姐视频代码
- 锁屏显示Activity
- Application启动流程
- Qt加载百度地图和谷歌地图
- 局域网聊天软件源代码(包括语音聊天)
热门文章
- antd 下拉框怎么联动_Antd的Table组件嵌套Table以及选择框联动操作
- 为什么用c语言程序中的if语句实现从1加到100最后的结果是负数,用C语言程式计算从1加到100的程式是怎样的?...
- java实用类_Java—实用类
- Git 学习笔记(二)分支管理
- Linux从入门到精通——文件传输
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,能够为师矣!
- GitHub中watch star fork三个按钮干什么用的?
- 我学习设计模式的一些所想所得
- 如何解决Error: failed PB timebomb check
- 如何取得事件中鼠标坐标