因为之前串口通信学的并不扎实,所以今天把串口通信的理论部分又从头到尾看了一遍。还是比较有收获的,起码概念清晰了。
串行口的作用我简单理解为(个人理解):
可以把编入单片机的程序留好与外部沟通的接口,以便于外部通过串口对单片机进行控制和调试、编程。
具体的方法为软件控制。实验时用的是串口助手。实际使用中可以自己编写一个能够实现功能的软件,根据使用环境,使用PC、手持设备等进行操作。
写串口程序的步骤:
1.确定T1的工作方式(编程TMOD寄存器)
2.计算T1的初值,装在TH1,TL1
3.启动T1(编程TCON中的TR1位)
4.确定串行口的控制(编程SCON寄存器)
5.串行口在中断方式工作时,需要进行中断设置
(编程IE\IP寄存器)
一些重要概念:
这里刚开始看有点乱,多看几遍其实不少东西都在中断内都有接触,而且和中断里的定时器紧密相连,毕竟串口通信也是中断的一种。
感觉理解的关键就是弄清单片机内各模块中寄存器的功能,为实现这些功能,需要用到一些”工具“,通过对这些”工具“取值的控制,来控制寄存器实现这些功能,从而实现我们要单片机实现的功能。
类比到编程上,就好比寄存器是"对象",这些工具是”方法“
SBUF:串行口内部的数据寄存器。
所有发送和接收到的数据都储存在里面,可由程序定义的变量来调用。有2个物理寄存器,一发一收,但地址是相同的(99H)。
SBUF=A; 将A的值赋给SBUF寄存器,即输入数据。
A=SBUF; 将SBUF的值赋给A,即读出数据。
SCON:串行口内部的控制寄存器。
它能实现:
a.串行口的工作模式选择(SM0,SM1。具体取值见表)
b.控制串行口是否能够接收数据【REN=1允许,REN=0拒绝】
c.控制TB8(第9位校验码发送)奇偶校验的方式。【TB8=0地址帧,TB8=1数据帧】<工作方式2、3中有效>
d.控制RB8奇偶校验的方式(类似C,RB8为接收第9位的校验码)
e.TI1,RI1.“发送中断标志位"和"接收中断标志位"
这两个寄存器工具平时无需管它,但在编写程序时,中断后需要对它们清零。(软件可查询其工作状态)
f.控制多机通讯(SM2,主要用于工作方式2、3,略)
PCON:串口内部的控制寄存器
这个控制寄存器的作用只有1个,就是通过设置SOMD、TH1和TL1的值,来确定单片机串口通信所使用的波特率。(方式1适用)
实际应用中是我们知道要设置的波特率,然后根据公式求TH1的值。
(在51中,一般记得结论就好也不必去算。晶振频率为11.0592MHZ,SMOD的取值=0时,TH1和TL1的值为253,即0xfd)
知识点联系:
TH1,TL1是定时器的工具,之所以说是通过设置SOMD和这两个值来确定波特率,是因为计算公式为:
波特率=(2^SMOD)/32 *定时器T1的溢出率
T1的溢出率计算公式为:
T1的溢出率=fosc/[12*(256-TH1)]
fosc是晶振频率(注意:公式内单位为HZ,而不是MHZ)
合并起来就是:
波特率=2^SMOD*fosc/384*(256-TH1)
之所以说还要确定TL的取值,是因为编程写初始化时TH1和TL1都是成对出现的且相等的。
串行口的作用我简单理解为(个人理解):
可以把编入单片机的程序留好与外部沟通的接口,以便于外部通过串口对单片机进行控制和调试、编程。
具体的方法为软件控制。实验时用的是串口助手。实际使用中可以自己编写一个能够实现功能的软件,根据使用环境,使用PC、手持设备等进行操作。
写串口程序的步骤:
1.确定T1的工作方式(编程TMOD寄存器)
2.计算T1的初值,装在TH1,TL1
3.启动T1(编程TCON中的TR1位)
4.确定串行口的控制(编程SCON寄存器)
5.串行口在中断方式工作时,需要进行中断设置
(编程IE\IP寄存器)
一些重要概念:
这里刚开始看有点乱,多看几遍其实不少东西都在中断内都有接触,而且和中断里的定时器紧密相连,毕竟串口通信也是中断的一种。
感觉理解的关键就是弄清单片机内各模块中寄存器的功能,为实现这些功能,需要用到一些”工具“,通过对这些”工具“取值的控制,来控制寄存器实现这些功能,从而实现我们要单片机实现的功能。
类比到编程上,就好比寄存器是"对象",这些工具是”方法“
SBUF:串行口内部的数据寄存器。
所有发送和接收到的数据都储存在里面,可由程序定义的变量来调用。有2个物理寄存器,一发一收,但地址是相同的(99H)。
SBUF=A; 将A的值赋给SBUF寄存器,即输入数据。
A=SBUF; 将SBUF的值赋给A,即读出数据。
SCON:串行口内部的控制寄存器。
它能实现:
a.串行口的工作模式选择(SM0,SM1。具体取值见表)
b.控制串行口是否能够接收数据【REN=1允许,REN=0拒绝】
c.控制TB8(第9位校验码发送)奇偶校验的方式。【TB8=0地址帧,TB8=1数据帧】<工作方式2、3中有效>
d.控制RB8奇偶校验的方式(类似C,RB8为接收第9位的校验码)
e.TI1,RI1.“发送中断标志位"和"接收中断标志位"
这两个寄存器工具平时无需管它,但在编写程序时,中断后需要对它们清零。(软件可查询其工作状态)
f.控制多机通讯(SM2,主要用于工作方式2、3,略)
PCON:串口内部的控制寄存器
这个控制寄存器的作用只有1个,就是通过设置SOMD、TH1和TL1的值,来确定单片机串口通信所使用的波特率。(方式1适用)
实际应用中是我们知道要设置的波特率,然后根据公式求TH1的值。
(在51中,一般记得结论就好也不必去算。晶振频率为11.0592MHZ,SMOD的取值=0时,TH1和TL1的值为253,即0xfd)
知识点联系:
TH1,TL1是定时器的工具,之所以说是通过设置SOMD和这两个值来确定波特率,是因为计算公式为:
波特率=(2^SMOD)/32 *定时器T1的溢出率
T1的溢出率计算公式为:
T1的溢出率=fosc/[12*(256-TH1)]
fosc是晶振频率(注意:公式内单位为HZ,而不是MHZ)
合并起来就是:
波特率=2^SMOD*fosc/384*(256-TH1)
之所以说还要确定TL的取值,是因为编程写初始化时TH1和TL1都是成对出现的且相等的。
发现刚才的分享又被百度吞了。貌似是有侵权软件,去掉几个再分享一下看http://pan.baidu.com/s/1jGwr8ea
早上写程序时发现一个问题没搞清楚,之前糊里糊涂就放过去了。
关于TMOD的取值。
回顾视频里串行口的例子中,TMOD=0X20,一直没明白它的意义。
这个是怎么得出来的?之前学定时中断时对于TMOD的取值就有些迷惑,只是简单记住了定时器T0工作在方式1时TMOD的取值为0x10.
要知道这个值的由来,首先得看这个表:
这个表的含义是:
T1使用TMOD的高4位,T0使用TMOD的低4位。
M1和M0:它们的取值决定了TMOD0和TMOD1的工作方式。这样的话就可以通过设置TMO D的取值,随意控制T0和T1的工作状态。
GATE: 它的值通常都取0,控制起来比较简单,通过TR0或TR1是否等于0就可以打开和关闭T0和T1.取1还得去考虑INT的高电平。
C/T: 这个是选择T0和T1是定时器还是计数器。定时器为0,计数器为1.
我 之所以之前没搞清楚TOMD,是因为其他遇到的给寄存器赋值都是在程序里对寄存器中的某一字段赋值,比如对IE进行定义的时候,是单独对IE的 EA,ES,ET1,EX1,ET0,EX0字段进行定义。而TMOD的定义不同,是单独对它包含的字段定义后,得出一个完整的值赋给TMOD。类比8位 流水灯(假设接在P0口),就好比直接给P0口一个值,就可以控制流水灯中某个或某几个灯的亮灭。就不要对P0口的每个引脚单独定义了。
TMOD之所以使用的这种定义方式,大概是因为要运行定时器/计数器,TMOD里的所有参数都必须进行定义,否则定时器不知道怎么工作。单独定义每个字段估计也是可以的(我没试),但太费事了。
那么回到TMOD=0x20,它的意义就是:
T1
GATE=0(只使用TR0\1控制开关)
C/T=0(使用的是定时器)
M1=1
M0=0(通过设置M1和M0的取值使用工作方式2)
T0
GATE=0
C/T=0
M1=0
M0=0 (M1=0,M0=0.工作方式0.其实这里相当于没定义,因为用不到)
那么用2进制表示:TMOD=00100000,换算成16进制TMOD=0x20
至于这里为何TMOD要设置成T1定时器且运行在工作方式2,视频里没说,我查了一下书,使用T1定时器的原因是:
1.首先明确设置TMOD是为了设定波特率。
2.串行口以方式1或方式3工作时,波特率和定时器T1的溢出率有关。
为何T1要运行在工作方式2,这个连书里都查不到了。但书里提供了一张表:
从表里可以看出,当晶振为11.0592MHZ时,T1定时器都运行在工作方式2.
就当成定理好了,暂时还不知道是什么原因,希望知道的朋友能解释一下。
关于TMOD的取值。
回顾视频里串行口的例子中,TMOD=0X20,一直没明白它的意义。
这个是怎么得出来的?之前学定时中断时对于TMOD的取值就有些迷惑,只是简单记住了定时器T0工作在方式1时TMOD的取值为0x10.
要知道这个值的由来,首先得看这个表:
这个表的含义是:
T1使用TMOD的高4位,T0使用TMOD的低4位。
M1和M0:它们的取值决定了TMOD0和TMOD1的工作方式。这样的话就可以通过设置TMO D的取值,随意控制T0和T1的工作状态。
GATE: 它的值通常都取0,控制起来比较简单,通过TR0或TR1是否等于0就可以打开和关闭T0和T1.取1还得去考虑INT的高电平。
C/T: 这个是选择T0和T1是定时器还是计数器。定时器为0,计数器为1.
我 之所以之前没搞清楚TOMD,是因为其他遇到的给寄存器赋值都是在程序里对寄存器中的某一字段赋值,比如对IE进行定义的时候,是单独对IE的 EA,ES,ET1,EX1,ET0,EX0字段进行定义。而TMOD的定义不同,是单独对它包含的字段定义后,得出一个完整的值赋给TMOD。类比8位 流水灯(假设接在P0口),就好比直接给P0口一个值,就可以控制流水灯中某个或某几个灯的亮灭。就不要对P0口的每个引脚单独定义了。
TMOD之所以使用的这种定义方式,大概是因为要运行定时器/计数器,TMOD里的所有参数都必须进行定义,否则定时器不知道怎么工作。单独定义每个字段估计也是可以的(我没试),但太费事了。
那么回到TMOD=0x20,它的意义就是:
T1
GATE=0(只使用TR0\1控制开关)
C/T=0(使用的是定时器)
M1=1
M0=0(通过设置M1和M0的取值使用工作方式2)
T0
GATE=0
C/T=0
M1=0
M0=0 (M1=0,M0=0.工作方式0.其实这里相当于没定义,因为用不到)
那么用2进制表示:TMOD=00100000,换算成16进制TMOD=0x20
至于这里为何TMOD要设置成T1定时器且运行在工作方式2,视频里没说,我查了一下书,使用T1定时器的原因是:
1.首先明确设置TMOD是为了设定波特率。
2.串行口以方式1或方式3工作时,波特率和定时器T1的溢出率有关。
为何T1要运行在工作方式2,这个连书里都查不到了。但书里提供了一张表:
从表里可以看出,当晶振为11.0592MHZ时,T1定时器都运行在工作方式2.
就当成定理好了,暂时还不知道是什么原因,希望知道的朋友能解释一下。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |