IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【蓝桥杯】定时器的定时与计数功能使用 -> 正文阅读

[嵌入式]【蓝桥杯】定时器的定时与计数功能使用


我们先来了解一下定时器中断是干什么的,这里举个例子

1、打个比喻

上课铃响,老师上课,下课铃响,老师下课,当然老师不听铃声上下课的也可以
这里的老师就是CPU,闹铃就是定时器,当闹铃计数到四十分钟后,闹铃就发出铃声提醒老师下课,这个铃声就是中断请求。老师执行下课操作。ET0/ET1这个寄存器就是闹铃的开关,打开了闹铃才会开始计时发出中断请求,而EA这个就是老师是否听得见请求,EA关了,等于说老师耳朵堵了,听不见下课铃同样就不会下课了,EA打开就会响应。可以看出老师和闹铃是两个独立的,闹铃不会占用老师的资源,老师也不会去干扰闹铃

图片来自普中科技教学PPT

2、了解定时器

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。脉冲来源是内部晶振则为定时模式,为外部脉冲则为计数,二者都可产生中断请求

3、配置定时器定时

先会用再了解
讲完这个,我们来看看如何配置这个闹铃(定时器)
IPA15F2K61S2芯片提供了3个16位的定时/计数器器,分别是定时器0、1、2;通常只用定时器0、1,定时器2一般用作串口2的波特率发生器。这里不单独讨论定时器2。
说到这个配置定时器定时不得不提到一个非常强大的烧录工具STC-ISP,
链接:https://pan.baidu.com/s/13wIZ1oKiay-zFDrMXt1kfg
提取码:kmph
在这里插入图片描述
这样可以得到定时器的一个初始化函数非常好用,并且比赛也可以使用。得到这段代码,还不能产生定时中断,从最上方例子可以直到还需配置EA,ET0/ET1,
下面是进一步处理的例程,通过定时器中断实现1s定时翻转LED灯

#include "stc15f2k60s2.h"
unsigned char led=0x00;
void close(); //关闭蜂鸣器、继电器.
unsigned char key;
void LED(unsigned char led)
{
    P0 = led;
	P2 = (0X1F&P2)|0X80;
	P2 &= 0X1F;
}
void close() //关闭蜂鸣器、继电器.
{
    P0 = 0X00;
	P2 = (0X1F&P2)|0XA0;
	P2 &= 0X1F;
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初值
	TH0 = 0xD1;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;//允许CPU被中断
	ET0 = 1//允许定时器0发出中断请求,T1当然就是定时器1了
}
void main()
{
  close();Timer0Init();//一定要运行初始化函数!!!
  //一定要运行初始化函数!!!
  while(1)
  {  
    	LED(led);			 
  }
}
void Timer0() interrupt 1  //定时器0中断服务函数,1ms中断执行一次
{
     static unsigned int num;
	 num++;	//每1ms,num值加一,
	 if(num==1000){num=0;led=~led;}//num=1000,取反led状态
}

从代码中我们可以看到还需要写中断服务函数,
void 函数名() interrupt 中断号 //定时器0中断服务函数
{
函数体;
}
定时器0中断号是1,定时器1中断号是3
值得注意的是,中断查询顺序
在这里插入图片描述
图片来源,普中科技教学PPT
具体定时器的学习,这里有普中老师的PPT,非常nice,值得推荐
链接:https://pan.baidu.com/s/1w6WUz9WgKmSqbr6BzdxMqA?pwd=hkth
提取码:hkth

3、配置定时器计数

这个算是这篇文章的主打菜吧。毕竟上面软件不能帮我们配置了,哈哈
这个在有一届的省赛题考到过,NE555频率读取,就要用到定时器0的计数功能,下面直接开整
下面有该省赛题的完整代码第十届电压频率采集

1. 如何启动计数功能?

工作方式寄存器TMOD
在这里插入图片描述
高四位控制定时器1,低四位控制定时器0;
GATE=0;软启动,TR0/TR1=1就可以启动定时器(常用)
GATE=1;硬启动,TR0/TR1=1同时需要外部中断引脚INT0/1=1,才可以启动定时器
C/T=0,定时模式,此时脉冲来自系统内部,
C/T=1,计数模式,定时器0脉冲来自P3^4;定时器1脉冲来自P35
MIM0;这两位控制工作方式,常用01,方式1
在这里插入图片描述
启用1定时器0计时模式TMOD=TMOD&0XF5;
启用1定时器0计时模式TMOD=TMOD&0X5F;这里的&操作可以保留另外一个定时器的配置不发生改变

2.计数

定时器0方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器
同理定时器1方式1的计数位数是16位,由TL1作为低8位,TH1作为高8位,组成了16位加1计数器
每来一个脉冲。TL0加一,溢出后,TH0加一,直至全满后,清零,同时向CPU发送中断请求,
这里两种办法计数
第一种,中断计数法
将TL0、TH0初始值设为0xff;来一个脉冲,就全满溢出,然后产生中断,中断服务函数运行num++;num的值就是计数值
第二种,定时取值
将TL0、TH0初始值设为0x00;可以存储65536个脉冲数,每隔一定时间将值取出来
具体操作:
num=num+TH0*256+TL0;//num为计数值
TH0=0;TL0=0;//清零,方便下一次计数
个人推荐第二种,中断没那么频繁

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:05:27  更:2022-01-30 19:07:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:25:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码