No7 蓝桥杯单片机实践之定时器的应用

1 回顾:

程序编写结构还是中断函数结构的写法,只是由于定时器涉及的寄存器较多,中断初始条件函数中条件也就随之增多。

void  函数名()

{

主要写一些初始化变量。(基本的就是3.1~3.5所涉及的寄存器的初值条件设定)

}

void  函数名() interrupt  中断号

{

就是写时间到后执行什么。(但是为了中断的实时性,有时只写只写中断状态的标志,紧急事件用另一个函数来写,后续实践篇代码有讲)

}

别忘了还要查看对应的中断号

涉及的寄存器要查看手册,通常会涉及到:

高低位寄存器

TMOD寄存器

中断寄存器

TCON寄存器

2 实践

2.1 任务

2.2 思路

涉及的模块:

这里涉及到了LED操作,故HC138接到4通道,才能是控制LED灯的,只有L1和L8两个灯,可以用sbit标出来,可读性比较强。

用到了定时,故定时的结构需要写出来。

在定时结构中,题目要求是Time0,查询资料手册,涉及的寄存器有如下,并写入代码: 

L1灯单位是0.5秒,L8单位是5秒,两者成一个倍数关系,故只需要一个初值即可,以0.5秒为初值,但一个定时器运行完依次最多为65535us,即65.532ms,

                                              需要0.5s即500ms即500000us,

故可以每次计时50000us,定时器运行10次,就到达了0.5s, 定时器运行100次,就到达了5秒。

按照之前所提的公式: TH0 = (65535 - 50000) / 256;
                                     TL0 =  (65535 - 50000) % 256;

void Init_Time0()
{
  TMOD = 0x01;
  TH0 = (65535 - 50000) / 256;
  TL0 = (65535 - 50000) % 256;
  TR0 = 1;
  EA = 1;
  ET0 = 1;

}

然后在中断服务函数上判断是否到达0.5s,到达了进行L1操作

在进一步判断是否到达5s,到达了进行L8操作。

2.3 完整代码:

这里解释以下:

(1)判断定时器运行10次和100次可以用一个变量累加来判断。然后取余操作判断是否达到了每一个10次,当达到100次时,变量清零重计数

(2)在中断中L1和L8的闪烁操作用的是取反:

为什么可以这样呢?中断程序是这样的,刚刚提到定时器运行10次才到达0.5s,默认L1初始为1,即不点亮,当定时器运行了10次才能到达0.5s,注意在这十次中,每一次,都进入了中断服务函数,但是执行到了count++后就不再执行下去,因为没满足if条件,故这段时间L1一直是熄灭的,熄灭时间为(0~9次),刚好10次,0.5秒。当执行第十次时,满足第一个if条件,到达0.5s,那么L1取反为0,点亮。在第11到第19次中,同样,每一次,都进入了中断服务函数,但是执行到了count++后就不再执行下去,因为没满足if条件,故在这段时间内L1一直=0,即L1一直是点亮状态,这段点亮持续了多久呢?(第10次到第19次),刚好10次,故点亮了0.5s。直到第20次,又满足了第一个if条件,L1取反为1,熄灭。

这就是在中断中可以用取反来表示LED闪烁的原因。

#include "stc15f2k60s2.h"

sbit L1 = P0^0;
sbit L8 = P0^7;

void selectHC138(unsigned int n)
{
  switch(n)
  {
    case 0:
      P2 = (P2 & 0x1f) | 0x00;  break;
   	case 1: 
			P2 = (P2 & 0x1f) | 0x20;  break; 
		case 2:
			P2 = (P2 & 0x1f) | 0x40;  break; 
		case 3: 
			P2 = (P2 & 0x1f) | 0x60;  break; 
		case 4:
			P2 = (P2 & 0x1f) | 0x80;  break; 
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;  break; 
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;  break; 
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;  break;
  }
}

void Init_Time0()
{
  TMOD = 0x01;
  TH0 = (65535 - 50000) / 256;
  TL0 = (65535 - 50000) % 256;
  TR0 = 1;
  EA = 1;
  ET0 = 1;
}

unsigned char count = 0;
void Time0() interrupt 1
{

  TH0 = (65535 - 50000) / 256;
  TL0 = (65535 - 50000) % 256;
  count ++;
  if (count % 10 == 0)
  {
    L1 = ~L1;

  }
  if (count %100 == 0)
  {
    L8 = ~L8;
    count = 0;
  }
  
}



void close()   //关闭外设
{
  selectHC138(5);
  P0 = 0x00;
  selectHC138(4);
  P0 = 0xff;  
}

void main()
{
  close();
  Init_Time0();
  selectHC138(4);
  while(1)
  {
    
  }
}

3 进阶版实践

3.1 任务

3.2 思路

这里涉及到多种模块:

定时器 :故定时器结构得写下来

数码管计时: 故要数码管得动态变化:数码管内容表(0~F,-) 数码管函数(包括内容和位置),数码管显示函数(显示什么内容),延时函数,HC138选择通道。

独立按键的使用:跳帽接到对应位置。由于只用了两个独立按键,可用sbit表示出来,要写个独立按键函数,判断是否按下。

这里主要的核心是定时器怎么设置:

题目要求设计秒表,分—秒—毫秒。

最小单位为50ms,即数码管最后两位每加1代表每加50ms,即01=50ms,02=100ms。

又1s= 1000ms  ,最小单位为50ms,故数码管最后两位加到20就为1s,秒的两个位置(s位)+1,且数码管最后两位(ms位)清零。

同理,1min=60s,当秒位加到60,清零,min位+1。

数码管显示动态显示对应的位置,由于分—秒—毫秒都是各占两位,如用除和区域可得到各自的十位和个位。

3.3完整代码

注意:     

TR0 = ~TR0;     //表停止计时

#include "stc15f2k60s2.h"
sbit S4 = P3^3;
sbit S5 = P3^2;

void selectHC138(unsigned int n)
{
  switch(n)
  {
    case 0:
      P2 = (P2 & 0x1f) | 0x00;  break;
    case 1: 
			P2 = (P2 & 0x1f) | 0x20;  break; 
		case 2:
			P2 = (P2 & 0x1f) | 0x40;  break; 
		case 3: 
			P2 = (P2 & 0x1f) | 0x60;  break; 
		case 4:
			P2 = (P2 & 0x1f) | 0x80;  break; 
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;  break; 
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;  break; 
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;  break;
  }
}

void Delay(unsigned char t)
{
  while(t--);
}

code unsigned char SMG_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e,  //F
0xbf  //-
};

unsigned char t_min = 0;
unsigned char t_s = 0;
unsigned char t_ms = 0;
//==============================Timer============
void InitTime0()
{
  TMOD = 0x01;
  TH0 = (65535-50000) / 256;
  TL0 = (65535-50000) % 256;
  TR0 = 1;
  ET0 = 1;
  EA = 1;
}

void Time0() interrupt 1
{
  TH0 = (65535-50000) / 256;
  TL0 = (65535-50000) % 256;
  t_ms++;
  if (t_ms == 20)
  {
    t_s++;
    t_ms = 0;
    if (t_s == 60)
    {
      t_min++;
      t_s = 0;
    }
  }
  if (t_min == 99)
  {
    t_ms = 0;
    t_s = 0;
    t_min = 0;
  }
}
//==============================================

void showSMG(unsigned char position, unsigned char number)
{
  selectHC138(6);
  P0 = 0x01 << position;
  selectHC138(7); 
  P0 = SMG_Table[number];
}

void SMGDisplay()
{
  showSMG(0,t_min/10);
  Delay(500);
  showSMG(1,t_min%10);
  Delay(500);
  showSMG(2,16);
  Delay(500);
  showSMG(3,t_s/10);
  Delay(500);
  showSMG(4,t_s%10);
  Delay(500);
  showSMG(5,16);
  Delay(500);
  showSMG(6,t_ms/10);
  Delay(500);
  showSMG(7,t_ms%10);
  Delay(500);
}

//void SMGDelay(unsigned char t)
//{
//  while(t--)
//  {
//    
//  }
//}

void Key()
{
  if(S4 == 0)  //stop
  {
    Delay(50);
    if(S4 == 0)
    {
      TR0 = ~TR0;     //停止计时
      while(S4 == 0)
      {
        SMGDisplay();       
      }
    }
  }
  if(S5 == 0)  // clear to 0
  {
    Delay(50);
    if(S5 == 0)
    {
      t_ms = 0;
      t_s = 0;
      t_min = 0;
      while(S5 == 0)
      {
        SMGDisplay();       
      }
    }
  }
}

void close()
{
  selectHC138(5);
  P0 = 0x00;
  selectHC138(4);
  P0 = 0xff; 
}

void main()
{
  close();
  InitTime0();
  while(1)
  {
    SMGDisplay();
    Key();
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之装饰器

一&#xff1a;作用 在函数名以及函数体不改变的前提下&#xff0c;给一个函数附加一些额外代码 二、语法 三、举例子 两个功能函数 test1&#xff0c; test2 遵循 “开放封闭原则”&#xff0c; 已经写好的代码&#xff0c;尽可能不要修改。 如果想要新增功能&#xff0c;…

数据结构知识点总结00-知识点目录

专栏主页&#xff1a; 数据结构算法程序设计基础C语言知识点总结https://blog.csdn.net/seeker1994/category_12585732.html C语言知识点总结00-C语言知识点目录 最优算法100例00-最优算法100例目录 ...... 数据结构知识点目录 要求&#xff1a; &#xff08;1&#xff…

Consul 配置持久化

当我们在consul的key-value中配置了几个字段 访问后的结果: 但是当我们在控制台输入命令重启consul服务后: consul agent -dev 刚刚设置的key-value值便消失不见了 此时就要进行 consul 持久化配置. 第一步:在consul文件夹下创建 1.空文件夹mydata 2.新建文件consul_star…

如何将.txtpb在IDE中彩色高亮显示

1. 问题描述 文件内容片段如下&#xff0c;它采用了一种键值对的格式&#xff0c;其中还包括了注释。我们可以采用一种近似的语言色彩识别方案处理它&#xff0c;比如YAML或者Python的语法高亮规则&#xff0c;因为这两种语言在处理键值对和注释的表示上与内容片段相似。当然也…

【SecureCRT】使用串口工具创建自动化脚本

【SecureCRT】使用串口工具创建自动化脚本 1、首先打开SecureCRT工具 选择Script 2、选择录制一个脚本 3、在窗口输入需要测试的指令&#xff0c;如 ls -l 4、停止录制脚本 5、把脚本保存到本地&#xff0c;这里保存的是Python写的脚本 6、打开这个文件查看&#xff0c;可以…

DevOps-Jenkins-CD持续交付操作

基于Git参数构建 之前是默认拉取最新提交代码构建&#xff0c;实际中不适用&#xff0c;需要通过打标签选择发布相应版本 打开Jenkins任务设置&#xff0c;勾选参数化构建过程 > 选择Git参数&#xff08;这里是Git Parameter插件的作用&#xff09; 设置标识名称&#xff…

22、设计模式之状态模式(State)

一、什么是状态模式 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为&#xff0c;简单地讲就是&#xff0c;一个拥有状态的context对象&#xff0c;在不同状态下&#xff0c;其行为会发生改变。 二、角色组成 上下文&#xff08;Context&#xff0…

阿里云函数计算服务推出的AgentCraft智能体应用开发平台助力你轻松搭建企业的微信知识库-安装部署介绍

需要开通的资源&#xff1a;函数计算服务、PostgreSQL、NAS AgentCraft 是一个面向开发者与企业用户的开源智能体应用开发平台&#xff0c;它致力于加速并简化智能体应用的构建过程。您能够便捷地将AgentCraft部署至阿里云的公共或专属环境&#xff0c;并确保从基本模型、应用…

【Ubuntu 20.04】ROS——话题、服务与动作编程

【Ubuntu 20.04】ROS——话题、服务与动作编程 工作空间1.创建工作空间2.编译工作空间3.设置环境变量4.检查环境变量 功能包1.创建功能包2.编译功能包 一、话题&#xff08;一&#xff09;创建发布者&#xff08;二&#xff09;创建订阅者&#xff08;三&#xff09;编译代码&a…

android MMKV数据持久化缓存集合

前言 最近在使用mmkv缓存的时候 发现没有集合缓存 非常不方便 自己写一个方法 MMKV public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u cant instantiate me...");}public static void init() {MMKV.initialize(LeoUtils…

详解Postman使用

简介&#xff1a; 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求的历史记录 可以使用测试集Collections有效管理组织接口 可以在团队之间同步接口数据 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求…

分享一下 iOS 发布/测试证书 申请过程

1.使用 已开通iOS开发者 的账号登陆 Apple Developer Apple Developer 2.点击下图右上角的 Account&#xff08;账户&#xff09; 点击下图中的 certificates&#xff08;证书&#xff09; 然后会挑战至下图所示页面 3.然后先要注册一个 App id 点击 register 就完成了 4.…

如何从无法开机的手机中恢复数据?4个解决方案解决了

Android 手机保存着大量有价值的数据&#xff0c;包括珍贵的照片、重要文档&#xff0c;对于许多人来说还包括整个音乐库。但是&#xff0c;您的 Android 手机可能会因电池电量耗尽、软件问题、硬件故障或意外损坏而拒绝开机或屏幕损坏。 无论原因如何&#xff0c;我们都将指导…

回收小程序系统后台管理功能

会员管理&#xff1a;管理员可以查看和管理会员的基本信息&#xff0c;如姓名、联系方式、寄送地址和订单记录等。 产品管理&#xff1a;对回收物品进行管理&#xff0c;包括分类、规格设定、数据统计等。 订单管理&#xff1a;对所有订单进行追踪和管理&#xff0c;确保订单处…

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…

Vue组件中引入jQuery

两种在vue中引入jQuery的方式 1、普通html中使用jQuery 将jQuer的文件导入到项目中&#xff0c;然后直接使用<script src"jQuery.js"></script>即可。 <script src"jQuery.js"></script> 2、vue组件中使用jQuery 安装依赖 c…

【ARM】MDK在programming algorithm界面添加FLM

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决在programming algorithm界面中无法添加想要的Flash编程算法的问题 2、 问题场景 在对于Debug进行Flash Download进行配置的时候&#xff0c;在programming algorithm界面中有对应的Flash编程算法。可以通过…

SQLite—免费开源数据库系列文章目录

SQLite系列相关文章较多特开本文为了便于读者阅读特写了本索引和目录之用本文将不断更新中有需要的读者可以收藏本文便于导航到各个专题( 持续更新中......)。收藏一篇等于收藏一个系列文章 简介类&#xff1a; SQLite——世界上部署最广泛的免费开源数据库&#xff08;简介&…

openssl3.2 - exp - export ecc pubkey from ecc priv key

文章目录 openssl3.2 - exp - export ecc pubkey from ecc priv key概述笔记END openssl3.2 - exp - export ecc pubkey from ecc priv key 概述 前面实验已经生成了ECC私钥, 现在做从ECC私钥(内容为公私钥对, 里面既有私钥信息, 也有公钥信息)导出ECC公钥. 实验对应的命令行…

单链表——增删查改

本节复习链表的增删查改 首先&#xff0c; 链表不是连续的&#xff0c; 而是通过指针联系起来的。 如图&#xff1a; 这四个节点不是连续的内存空间&#xff0c; 但是彼此之间使用了一个指针来连接。 这就是链表。 现在我们来实现链表的增删查改。 目录 单链表的全部接口…