单片机学习笔记---按键控制LED流水灯模式定时器时钟

news2024/11/27 1:34:55

目录

代码讲解

初始化函数

1.定时器部分的配置步骤

第一步,对TMOD的赋值

第二步,给TF0赋值

第三步,给TR0赋值开启定时器

第四步,给TL0和TH0赋初值

2.中断系统部分的配置步骤

第一步,给ET0赋值

第二步,给EA赋值

第三步,给PT0赋值

中断函数

定时器计算器生成代码工具

按键控制流水灯代码演示

时钟代码演示


看这一节之前一定要先依次看完这前三节:

单片机学习笔记---中断系统(含外部中断)-CSDN博客

单片机学习笔记---定时器/计数器(简述版!)-CSDN博客

单片机学习笔记---定时器和中断系统如何连起来工作-CSDN博客

代码讲解

这一节开始代码演示。

本节代码主要演示的是这个工作路线:

新创建一个工程,写上框架:

一,初始化函数

现在来写一个配置定时器和中断系统的函数

1.定时器部分的配置步骤

第一步,对TMOD的赋值

首先是对TMOD的赋值,TMOD的寄存器,我们前面已经说了,它是用来确定我们定时器的工作方式,像里面包含了T0和T1这两个定时器的工作方式,那你使用的是T0或者是T1,那就对这个TMOD的高4位或者是低4位进行赋值。

我们给TMOD赋值0x01,高四位它是0,说明我们现在使用的是低4位,它低四位是用于定时器0的管控,定时机1是高四位来控制的。

我们先不管定时器1,先看定时器0,所以高四位赋值0,低四位赋值1,也就是T1=0,T0=1的意思

那定时器0低4位是0001,对应的寄存器的值是0001

最后八位赋值成0000 0001

以上GATE设置为0,说明定时器的启动是通过TR0来控制的;

然后这个C/T设置为0,说明它的工作与T模式,也就是定时器模式;

然后,M1和M0=01,01的话是工作方式1,也就是16位定时计数器。

于是写TMOD=0x01

所以,我们通过这种设置可以知道我们定时器它处于定时器0,并且是16位,方式1,而且GATE是0可以直接通过TCON中的TR0来进行启动。

                

这样我们就完成了工作流程图中的这一部分的配置:

第二步,给TF0赋值

根据流程图,我们现在需要给TF0赋值:

先补充一个概念知识:

不可位寻址VS可位寻址:

不可位寻址的寄存器只能整体赋值;

可位寻址的寄存器可以对它其中的每一位单独赋值。

由于TCON是可位寻址的,所以我们可以单独赋值。

上图中TF1和TR1是定时器1的,我们不管。

我们可以单独看定时器0中的TF0和TR0。

TF0是定时器T0溢出中断标志,我们给它赋值0,因为一旦等于1之后,它就产生中断。我们先给TF0清零是为了防止还没有配置好就产生中断。这一步没有的话也不会产生特别大的影响。

第三步,给TR0赋值开启定时器

根据流程图,我们要配置TR0

由于GATE位等于0了,所以开启定时器主要取决于TR0,所以就写TR0=1;如果不知道为什么TR0=1的话请看上一节解释。

第四步,给TL0和TH0赋初值

之前第一步的时候我们只是选择了方式1,即选择16个位的寄存器存放初值,现在我们要来给这16个位的寄存器赋初值。

我们怎么让它每隔1毫秒产生中断呢?怎么定时呢?

我们前几节提到过,这个计数器的计数范围是0~65535,每隔一微秒(前面定时器那节已经说过12Mhz的晶振机器周期是1微秒),计数加1,总共定时时间是65535微秒,那我们怎样让它计1秒呢?

每隔1毫秒,让它产生中断每一次中断之后,我们再来计数,中断1000次的时候,就是1s。

时间换算:

       1s【秒】 = 1000ms【毫秒】
  1ms【毫秒】 = 1000μs【微秒】
   1μs【微秒】 = 1000ns【纳秒】
  1ns 【纳秒】= 1000ps【皮秒】

首先我们先给它定一毫秒产生中断。

如果一开始给它赋值64535,那64535离计数器溢出差值1000(微秒),所以计时时间为1ms。

那么我们想要64535这个初值给T0定时器,首先将64535换算成二进制给到T0的高八位TH0和低八位TL0(TH0和TL0都是八个位的寄存器,只能存放256

所以我们可以这样赋值:

为什么这样写就可以把64535的高八位和低八位取出来呢?

因为64535在寄存器当中的数据是十六位的,

我们可以类比一下十进制,十进制的取值范围是0~99,正好100个数,比如说123这个数,我们想要取出它的最高位和它的余数,那么我们就可以123/100=1,123%100=23。

同理,八个位的寄存器的存放数值是256,想要取出64535十六进制的高八位和低八位和就可以写成64535/256=高八位,64535%256=低八位。

现在整个定时器部分就配置好了。

2.中断系统部分的配置步骤

第一步,给ET0赋值

ET0=1就打开开关

第二步,给EA赋值

把总中断打开EA=1

第三步,给PT0赋值

PT0默认等于0,但我们要写上

以上这样就配置完了,

这个子函数也就完成了,我们来调用一下。

到这里这个定时器就可以工作了,那定时器溢出之后,也就是闹钟响了之后,我们要干嘛呢?

二,中断函数

我们还要写一个子函数,让闹钟响了之后,要跳转到这个子函数来,执行中断任务。

为什么要写一个中断函数呢?

也就是定时器初始化之后,

过了一个毫秒while(1){},中断一过来,程序就会从while(1){}跳转到中断函数里面来,等中断函数执行完之后,程序再回到while(1)里面去。

其实我们是根据这个程序流程图的逻辑来写程序的:

主程序在执行的过程中来了一个中断,主程序就跳转到中断函数,等执行完中断再跳转会主函数中。

这个中断函数的形式是这样的:

前面定时器那一节讲过这个子函数的书写规则了,不懂的话可以去看看。

这里我们需要记住对应的中断号,芯片手册上也列出了中断号:

现在我们把这整个程序下载到单片机里面来验证一下。

现在看还是什么现象都没有的

怎么证明它的确是在执行这个函数了呢?

可以在中断函数里点亮一个灯看看

可以发现,到目前为止我们的主程序中还没有调用这个函数的。

如果中断真的过来了,那P2_0=0;这句代码肯定执行,它一执行,开发板上的这个灯就会点亮,所以我们先这样验证主程序是不是过来了,稍后再验证时间。

我们看到D1的确亮了。

这个中断函数根本没有执行,只是跟了一个尾巴(interrupt 1)定时器过来之后,它就点亮了,就说明程序真的跳转到这个地方来执行了。

定时器计算器生成代码工具

这里我们的代码还没有结束,先介绍一个非常好的方法可以省去我们的敲代码的时间!

在STC上找到定时器计算器。

可以看到这里有已经写的框架,我们只需要选择参数即可

根据我们选择的工作模式和开发板的资源设置正确的参数:

为什么选择定时器时钟是12T呢?

这里就是我们前面几节说的这里,我们这节主要选择的工作流程是12T。

怎么让它拨到6T呢?

只要在这里打勾就是6T模式,没有打勾就是12T模式,但是我们一般是用12T模式。

最后把设置好的代码复制下来

改造一下:

因为89系列没有AUXR这个寄存器,所以删掉这一行

然后这两句代码是因为TMOD=0x01这种写法只适合用TMOD的高四位或者低四位时。

当高四位和低四位同时应用的时候,因为TMOD是不可位寻址,最好是优化成:

TMOD&=0xF0;//表示把TMOD的低四位清零,高四位保持不变,TMOD&1111 0000

TMOD|=0x01;//表示把TMOD最低位置1,其他位保持不变

然后这两句写的和我们自己写的这两句不一样

我们自己写是这样:

其实我们写成的这样会有一微秒的差别。

可以验证一下它生成的这种写法是不是跟我们写的结果一样,

用计算机算一下

取整是252,转换成16进制就是FC

说明我们的写的和它生成的结果是一样的

再验证一下低四位:

余23

23换成16进制是17

说明我们配置的低四位比它生成的低四位少了1微秒

所以我们可以把自己写的这句代码改成+1这样:

可以直接用它生成的形式也可以!

然后他还缺少这三句,我们把自己写的加上

最后我们把代码优化成这样(分模块化来写),每一行代码几乎都有注释了,这里就不再赘述:

main.c文件:

Timer0.c文件:

Timer0.h文件:

下载后的效果:

D1在以1秒为间隔在闪烁

说明我们的定时器程序已经没有错误了。

按键控制流水灯代码演示

接下来开始演示按键控制流水灯的程序:

同样分文件来写,创建Key.c和Key.h文件

然后把之前矩阵键盘那一节写好的Delay.c和Delay.h文件复制到本节的程序文件中

然后再添加进来

然后main.c文件改成:

Timer0.h文件没变:

Timer0.c文件也没变:

Key.h文件

Key.c文件

运行后的效果:

LED正在以500ms位间隔向右移动,随便按下一个独立按键后,移动方向变为向左移动。

时钟代码演示

最后开始演示时钟的程序:

新创建一个工程

写上框架

然后把LCD1602调试工具那一节的Delay.c,Delay.h,LCD1602.c,LCD1602.h文件复制到刚刚新创建的工程文件里面来,然后点击添加。

添加进来

同样操作,再把本节前面按键控制流水灯的Timer.c和Timer.h文件添加进来

编译后无错误,但是有9个警告

嫌警告碍眼可以点击这里忽略警告

再次编译,无错误,无警告

然后怎么调用这些函数的话都在之前相关章节讲过了,不懂的伙伴去翻我的单片机专栏里的文章看看。这里就不再赘述。

添加进来的文件不用修改什么,直接看本节主程序main.c调用写好的代码,每一行代码基本都有注释。这里就不再赘述。

看看效果:

观察23:59:59再计一秒后开始进位,全部变成00:00:00

然后从1开始计:

以上就是本节全部的代码演示。

本节全部的源码都放在评论区了,自取!

有问题的欢迎评论区留言或者私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker下,容器无法启动,要删除里面的文件

第一步:进入docker cd /var/lib/docker 第二步:查找,我这里是拼音分词器 find ./ -name py 第三步:得到路径 第四步:删除或复制或移动,我这里是删除py文件夹 rm -rf ./over那一串 第五步:想干…

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一:删除缓存文件 > 方案二:更新最新版本,可以直接修改密码(推荐) 方案一:删除缓存文件 Stage 1:设置显示隐藏文件 Stage 2:打开…

minitouch王者荣耀按键百分比

minitouch王者荣耀按键百分比 3 技能英雄 原图 2376 x 1104 xy说明x百分比y百分比23761104总分辨率160444金币0.0673400673400670.402173913043478296440物品10.1245791245791250.398550724637681296566物品20.1245791245791250.51268115942029470864摇杆0.1978114478114480…

【Docker进阶】镜像制作-用快照制作Docker镜像

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作1. 镜像制作及原因2. Docker镜像制作的方式3. 快照制作镜像 1. 镜像制作及原因 镜像制作是因为某种需求,官方的镜像无法满足需求,需要我们通过一定手段来自定义镜像来满足要求。 制作镜像往往有…

Stable Diffusion 模型下载:国风4 GuoFeng4 XL

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 欢迎使用GuoFeng4模型 - 这是一个微调后的全能的SDXL模型,也可以说是对国人喜欢的画风微调过的模型,具有2.5D,CG,游戏,建模质感。基于SDXL1.0训练。因为SDXL的升…

2024最新版鸿蒙HarmonyOS开发工具安装使用指南

2024最新版鸿蒙HarmonyOS开发工具安装使用指南 By JacksonML 0. 什么是鸿蒙Harmony OS? 华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为开发者大会(HDC.2019)上正式发布的分…

CAN通信----(创芯科技)CAN分析仪----转CANTest使用

点击进入官方链接进行下载创芯科技 CAN分析仪资料包: 创芯科技的官网:https://m.zhcxgd.com/ 我使用的是至尊版红色带OBD转接头的: 所有下图是我选择…

antv/x6 边添加鼠标悬浮高亮和删除功能

antv/x6 边添加鼠标悬浮高亮和删除功能 效果添加悬浮效果和删除工具取消悬浮效果边删除后的回调函数 效果 添加悬浮效果和删除工具 this.graph.on(edge:mouseenter, ({ cell }) > {let cellId cell.store.data.source.celllet sourceCell _this.graph.getCellById(cellId…

【高质量精品】2024美赛A题22页word版成品论文+数据+多版本前三问代码及代码讲解+前四问思路模型等(后续会更新)

一定要点击文末的卡片,进入后,即可获取完整资料后续参考论文!! 整体分析:这个题目是一个典型的生态系统建模问题,涉及到动物种群的性比例变化、资源可用性、环境因素、生态系统相互作用等多个方面。这个题目的难点在于如何建立一个合理的数学…

P4071 [SDOI2016] 排列计数 错排,递归公式

错排公式理解: //f(x)表示1~x的错排数目 // //1选择(x-1种) //乘以剩下的总数目就是答案。//(1选了2就接着排2了,这样所有的都可以算到,是递归所以难想)// 选2时 // 2可选 1 和 3~x//2选1,对2开始来说此次总数就是1*f(…

Ansible自动化工具(1)

目录 ansible的特性:. 二.部署ansible 管理端安装 ansible: ansible 目录结构: 管理主机上配置主机清单: ​编辑 配置密钥对验证: ansible 命令行模块 : 1.command 模块 指定 ip 执行…

【HTML 基础】元数据 meta 标签

文章目录 1. 设置字符集2. 描述网页内容3. 设置关键词4. 网页重定向5. 移动端优化注意事项结语 在网页开发中&#xff0c;<meta> 标签是一种十分重要的 HTML 元数据标签。通过巧妙使用 <meta> 标签&#xff0c;我们能够设置各种元数据&#xff0c;从而影响网页在浏…

STM32WLE5JC

多协议LPWAN 32位 ARM Cortex-M4 MCUs&#xff0c;LoRa&#xff0c;FSK&#xff0c;MSK&#xff0c;BPSK&#xff0c;最大256KB FLASH&#xff0c;64KB SRAM。 LPWAN代表低功耗广域网&#xff08;Low-Power Wide-Area Network&#xff09;&#xff0c;是一种无线网络技术&…

idea修改项目git地址

大家好&#xff0c;今天给大家分享的知识是如何在idea中修改项目的git地址。 一、修改地址 首先我们先找到菜单栏中Git选项&#xff0c;然后点击管理远程&#xff08;Manage Remote&#xff09; 之后双击origin之后就可以定义名称或者URL了。

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(五)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十二章&#xff1a;使用 TensorFlow 进行自定义模型和训练 到目前为止&#xff0c;我们只使用了 TensorFlow 的高级 API&#…

优秀学习网站推荐-第一辑

原文地址&#xff1a;https://jaune162.blog/2024/02/15/study-website-recommend Developer Roadmaps&#xff08;开发者路线图&#xff09; 官网地址&#xff1a;https://roadmap.sh/ 该网站包含了各个方向、各个语言的开发人员从零开始学习的路线图。 下图为Java方向的学…

基于单片机控制的智能门锁设计

摘要&#xff1a;阐述基于STC15F2K60S2单片机控制的智能门锁设计&#xff0c;包括CPU控制单元模块、液晶显示LCD、 Wi-Fi模块&#xff0c;实现远程控制开门&#xff0c;密码开门的智能化功能。 关键词&#xff1a;控制技术&#xff0c;单片机&#xff0c;智能门锁&#xff0c;…

django区县网络安全执法模式研究flask python

作为一款区县网络安全执法模式研究&#xff0c;面向的是大多数学者&#xff0c;软件的界面设计简洁清晰&#xff0c;用户可轻松掌握使用技巧。在调查之后&#xff0c;获得用户以下需求&#xff1a; &#xff08;1&#xff09;用户注册登录后&#xff0c;可进入系统解锁更多功能…

unordered_map和unordered_set

目录 一、unordered_map 1.1、unordered_map的特点 1.2、unordered_map和map的区别 二、unordered_set 2.1、unordered_set的特点 2.2、unordered_set和set的区别 三、哈系桶的改造 3.1 结构设置 3.2 构造函数和析构函数 3.3 数据插入 3.4 数据查找 3.5 数据删除 …

MQ面试题整理(持续更新)

1. MQ的优缺点 优点&#xff1a;解耦&#xff0c;异步&#xff0c;削峰 缺点&#xff1a; 系统可用性降低 系统引入的外部依赖越多&#xff0c;越容易挂掉。万一 MQ 挂了&#xff0c;MQ 一挂&#xff0c;整套系统崩 溃&#xff0c;你不就完了&#xff1f;系统复杂度提高 硬生…