本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整。
以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅)
一些内容涉及前面的知识点,可能需要提前了解(可以翻看本人之前的文章或者去B站看UP主的视频)
目录
7-1、定时器
定时器介绍
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。
(区别于之前用I/O口控制的独立按键,数码管等,那些属于外设)
作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作。
(2)替代长时间的Delay,提高CPU的运行效率和处理速度。(避免单纯Delay导致的CPU占用)
(3)一条线执行多任务时,负责切换某个任务执行。
(…)
STC89C52定时器资源
定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。(新版本兼容老版本,因此有T0与T1)
注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。
因此,需要预先搜索一下对应的单片机手册(购买时附带资料),确定其相关资源。
原理:
其中“一秒”是指一个固定时间段,不是指一秒。
中断系统:相当于消息提醒机制,是51单片机内部资源。
定时器工作模式:
模式1连接方式:
可以将其分为三部分:
计数系统:
TL0:Timer Low 0,存储低字节的数(一个字节存储空间)
TH0:Timer High 0,存储高字节的数(一个字节存储空间)
二者合起来可以存储65535个数(从0到65535,0不储存,作为一种状态)
TF0:Timer Flag 0,标志位置。每当存储数超过65535时,会产生溢出,存储变为0,并置一个标志位,该标志位向中断系统申请中断。
定时器时钟:
①时钟部分:
这里的晶振以自己单片机的为准(本单片机与UP主的单片机晶振不同,为11.0595MHZ)。
内部应该是压电陶瓷,会发出固定频率的振动,根据这种信号产生固定的频率。

其中上面的T0 Pin位于单片机的一个I/O口连接部分
当连接外部时钟后,单片机内部的定时器变为计数器,当外部每次传入一个脉冲时加一,起计数器的功能。
②分屏部分:
当分屏部分与上面的+12相连时,那么就会把12MHZ的信号进行12分屏,于是输出频率变为1MHZ(1MHZ的一个周期为一微秒,在后面的计数系统记一次数)
③选择开关模式部分:
其中C/T(T上带一横杠)为寄存器的一位,当配置为1时,为C(counter,计算器)模式,向下连接;
当配置为0时,为T(Timer,定时器)模式,向上连接。(上面带一横杠,意味着低电平0)
中断系统
中断系统解释:
提取:
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的;
其中请求CPU中断的为中断源;
根据中断源的轻重缓急划分等级,先处理高等级,再到低等级;
中途出现的高等级中断源请求可以打断低等级的中断源。
中断程序流程图:
相当于同时执行两段程序(实际上是打断去执行其他内容,但是打断时间短,约等于同时执行)。
STC89C52中断资源:

①中断源个数:8个。
下面是来自手册的查询:

②中断源优先级个数:4个。
③中断号:在函数后面加入interrupt 数字;即可成为中断的入口。
定时器和中断系统
总连接内部结构
下面与定时器相连的是传统的51单片机中断系统图,上面是手册中的中断系统图。
如果定时器后面不连接中断系统也可以,但是主程序无法检测到定时器响应,但是仍然可以用查询的方式查询TF0这个标志位进行检测(可能不方便)。
最终连接效果:
定时器相关寄存器
操作模式——单片机通过配置寄存器来控制内部线路的连接,通过内部线路的不同连接方式来实现不同电路,不同电路完成不同功能。
通过配置这些寄存器,实现上面总连接结构图中的电路连接。(在特定的地址写入值进行配置)
定时器的相关寄存器的介绍:
①寄存器TCOM(Timer Control)
TR0:(这里暂时不用管这个计数的GATE控制先,后面有需要可以再了解)
TF0:不需要写,只需要读取该位查询中断。
②寄存器TMOD(Timer Mode)

通过控制GATE对应的TMOD位,可以实现外部时钟与内部时钟一同控制定时器开关(全部给1才接通,有0不接通)
下面画圈部分,利用与或非门,实现上面的控制开关功能。
③其他相关寄存器

中断寄存器:
结合需要的连接电路图,寻找对应的寄存器口进行配置。
①IE部分的寄存器

②IP部分的寄存器

7-2、按键控制LED流水灯模式
代码一:
实现效果:通过独立按键K1,实现按下按键时,转换LED流水灯的方向,同时没有间隔延迟,较为流畅的转换。
Ⅰ、新建工程与main.c文件

Ⅱ、编写配置寄存器的子函数
Ps:在头文件有声明的内容才能用。(这里的REGX52文件已经包含有,所以能使用)
①编写函数模板
②配置TMOD寄存器
对定时器1的内容配置:
利用上节提到的,先不管定时器1,设置为0000(因为这里只使用定时器0);
(这里根据手册来说,后两位应该设置为11,这样才使得定时器1无效)
对定时器0的内容配置:
GATE不使用,配置为0;
C/T(T上有横杠)设置为定时器模式(T模式),设置为低电平0;
M1与M0两位共同决定定时器/计数器的模式,这里设置为16位定时器,因此设置为01。
(下图为解释M1与M0配置对应的模式)

最终在代码写入配置:

补充:
不可位寻址的寄存器只能整体赋值,可位寻址的寄存器可以对其中的每一位单独赋值。
例如:上面的TMOD标有不可位寻址,因此只能整体赋值。
而之前使用的P0~P3寄存器都是可位寻址的,因此我们之前能用P2_1之类进行单独赋值。
③配置TCON寄存器
可见该寄存器是可位寻址的,因此下面我们采用单独赋值方法。
清除中断标志位:

将TF0赋值为0,将标志位清零。
原因:一旦标志位等于1时,就会产生中断。(当然不配置影响也不大,就是有随机性)
TF0位说明:

配置定时器0工作:
将TR0赋值为1,电机开始工作。
TR0位说明:

④配置TL0与TH0寄存器
为了使其每隔一毫秒产生一次中断,将计数器的初始值调整,由原来的从0开始到溢出(大于65535)调整为需要的初始值到溢出。
这样就能实现在需要的时间内产生一次中断,而不是走完65535×单位时间段(单位时间段由上节课的时钟晶振分屏后有关)
配置初始值:
这里将TH0=64535/256,是因为上节讲过,TH0是高位的一个字节,而64535是两个字节,通过C语言的运算符“/”,使得除以256(一个字节长对应的十进制数),可以将低位字节去掉,只保留高位字节(即相除取整,舍弃后面不能整除的低字节内容)。
同理将TL0=64535%256,利用C语言的运算符“%”,将高字节的内容舍弃。(即取余,舍弃能整除的高字节部分,保留不能整除的低字节内容)。
最终使得从64535到65535的距离为1000,根据上节分屏后每1us计数一次(这里是up主的单片机频率为12MHZ分屏得出的1us,本单片机频率为11.0592,不一定适用),1000us相当于1ms,于是就达成了1ms产生一次中断的目的。(产生中断后可以通过处理中断函数的内容,再将时间延长)
下面是截图自up主的说明内容:

最后一行就是利用十进制的处理,而赋初始值的这里则是对16进制的处理(相当于100被替换为256)。
Ps:
①一个字节长为0000 0000,即八位的二进制数。
②这里对TH0与TL0是采用十进制(__)给其赋值,也可用十六进制(0x__)或者八进制(0__)赋值,但最终都会转化为二进制进行处理。
⑤配置中断部分

本文深入解析51单片机定时器的工作原理及其应用,并详细阐述串口通信的基础知识与实践技巧。涵盖了定时器配置、中断处理、串口参数设置等内容。
最低0.47元/天 解锁文章
1689

被折叠的 条评论
为什么被折叠?



