AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

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

本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整。

以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅)

一些内容涉及前面的知识点,可能需要提前了解(可以翻看本人之前的文章或者去B站看UP主的视频)

目录

7-1、定时器

定时器介绍

作用:

STC89C52定时器资源

原理:

定时器工作模式:

中断系统

定时器和中断系统

总连接内部结构

定时器相关寄存器

 中断寄存器:

7-2、按键控制LED流水灯模式

代码一:

Ⅰ、新建工程与main.c文件

Ⅱ、编写配置寄存器的子函数

Ⅲ、编写中断时调用的函数

Ⅳ、将定时器函数进行模块化

Ⅴ、将需要的之前写过的模块化代码拷贝到工程文件中

Ⅵ、编辑主函数文件

Ⅶ、烧录程序

代码二:

Ⅰ、新建工程与main.c文件

Ⅱ、添加需要的模块化文件到工程目录下

Ⅲ、编译主函数文件

 Ps:

8-1、串口通信

串口介绍:

补充小知识:

串口连接

一些基本知识

电平标准

常见通信接口比较

相关术语

51单片机的UART

串口参数及时序图

 ①波特率:

②检验位

③停止位

串口模式图

串口内部线路

串口相关寄存器

8-2、串口向电脑发送数据&电脑通过串口控制LED

程序一

写入代码

Ⅰ、新建工程及main.c文件

Ⅱ、添加已有的模块化文件进工程目录。

Ⅲ、配置相关的寄存器

Ⅳ、配置主函数内容

模块化对应代码

Ⅰ、新建UART.c文件,将代码移植(剪切)过去。

Ⅱ、新建UART.h文件,将模板及声明编写。

Ⅲ、在程序一中验证效果。

程序二

写入代码

Ⅰ、获取工程文件。

Ⅱ、更改配置寄存器的模块化代码

Ⅲ、编写中断函数

Ⅳ、烧录程序

波特率的计算(以UP主的12MHZ晶振频率为例)

总结:如非必要,可以直接用STC烧录软件进行生成即可。

数据显示模式


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__)赋值,但最终都会转化为二进制进行处理。

⑤配置中断部分

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值