
串行口的作用我简单理解为(个人理解):
可以把编入单片机的程序留好与外部沟通的接口,以便于外部通过串口对单片机进行控制和调试、编程。
具体的方法为软件控制。实验时用的是串口助手。实际使用中可以自己编写一个能够实现功能的软件,根据使用环境,使用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都是成对出现的且相等的。


关于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.
就当成定理好了,暂时还不知道是什么原因,希望知道的朋友能解释一下。


写程序需要用到的控制引脚:
RS:数据/命令选择端 (RS=0 指令 , RS=1 数据)
R/W:读 /写选择端(R/W=0 写, R/W=1 读)
E:使能信号端(打开/关闭液晶显示) E=0关闭,E=1打开
步骤:
一.初始化
初始化的过程要根据液晶生产商或芯片商提供的时序图逐步来进行。尤其要注意延时。
1.写指令:
RS=0;选择为指令操作。
R/W=0;选择为写操作。
延时
D0-D7送指令操作信号。
(指令操作信号为控制液晶显示的状态,包括显示模式及光标开关。)
延时
E=1; 送使能端高电平,打开液晶显示
RS=1; 选择为数据操作
R/W=0;选择为写操作
延时
D0-D7送数据信号
延时
E=1; 送使能信号高电平,打开液晶显示。
二.液晶内容显示
这个比较简单没什么新东西,基本思路参考LED数码管动态显示,唯一要注意的就是初始指针位置。
1.定义数组
2.从数组中取数据循环显示
如果要从右到左移动显示
需要用到写指令0x18,同时定义初始的指针位置为0x80+0x10(第一行。范围从10-27) 0x80+0x50(第二行,范围从50-67)
有一点要注意就是,如果用其他板子跟着郭的视频做这个实验,TX1C的R/W端是直接接地的,就是默认为0,所以视频里他没定义。如果其他板子是把R/W接入单片机IO口,那么写程序时初始化时得定义R/W=0




IIC学了好几天了,总算都明白了!
写了个断电保存时间的电子钟,碰到的问题不少,好在基本都解决了。
之所以花了这么久反复去折腾,是因为确实还是很重要的。IIC设备有很多种,EEPROM只是其中之一,会了这个,以后需要用到IIC设备应该都不会太难了。总结下来这章里概念虽然比较多,但不管怎样,具体些程序时都要去依据芯片手册的时序图去操作。首先就是根据IIC总线的时序写好起始、终止、应答子程序。
如 果是EEPROM 24C02,那么接下来要根据IIC时序写“写入一个字节”和“读出一个字节”的子程序。然后再根据24C02的写入字节时序图和选择位置读字节时序图, 利用已经写好的”起始“ “终止” “应答” “写入一个字节” “读出一个字节”子程序, 分别写往芯片内实际写入和读出的‘字节写“和”字节读“子程序。写好后,就可以在主函数中需要写入和读出的位置方便调用了。
个人感觉有2个问题比较重要。一个是器件地址,一个是字节地址。
1.器件地址:
器件地址表示的是IIC器件的物理地址,寻址时要用。器件地址用一个8位字节表示。高4位是芯片厂商规定的。查芯片手册会有。比如24C02是1010,即a 。低四位的前三位分别代表A0,A1,A2三个引脚,这3个引脚的接法决定了第四位前3位的值。比如实验板一般都接地,就都是0。最后一位是读/写选择位,是0表示主机通知器件下一帧要写了,是1则为读。
2.字节地址
字节地址是芯片内部储存数据的地址。我之前这里纠结了好久,听课时被地址+1给误导了。实际上,只要是同一个变量,不管数怎么变,都是在你给定的某个地址写数,新的出来把旧的覆盖掉。
概念很多,不算太难,但复杂,于是拿软件画了个图,方便理清这些概念的关系:
回复
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 |