当前位置: 首页 > news >正文

51单片机定时器中断配置

测试环境

单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试;
IDE:Keil C51;

定时器配置及主要代码

以定时器T0为例,查看手册,有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可自动重装载模式),模式2(8位自动重装载模式),模式3(不可屏蔽中断的16位自动重装载模式);
与定时器T0相关的寄存器如下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
我们使用定时器T0的模式0,因此要将TMOD寄存器的低4位全部设置为0,另外,还需要配置辅助寄存器AUXR,如下图:
在这里插入图片描述
使用1T模式,将AUXR的最高位T0x12位设置为1;

在这里插入图片描述上图中红框中的公式为模式0定时器重载值的计算方法,
假设时钟频率为fOSC,重载值[TH0,TL0]为Reload,定时器T0为16位,1T模式,向上计数,到溢出的时候,共计数65536-Reload次,每次耗时1/fOSC,单位为秒,如果我们需要中断的时间为1ms,即定时器周期为1/1000ms,则:
65536 − R e l o a d f O S C = 1 1000 \frac{65536-Reload}{f_{OSC}}=\frac{1}{1000} fOSC65536Reload=10001
即:
R e l o a d = 65536 − f O S C 1000 Reload = 65536 -\frac{ f_{OSC}}{1000} Reload=655361000fOSC
综上,T0定时器的初始化,代码如下,其中系统时钟频率为宏定义方式,可按实际情况修改:

#define FOSC     				22118400L//时钟主频22.1184Mhz
/******************************************************************************** 函数名:T0_Init* 功  能:定时器T0初始化* 参  数:无* 返回值:无* 说  明:模式0,16位自动重载模式,1ms中断
*******************************************************************************/
void T0_Init(void)
{uint16_t u16Reload = 0;AUXR |= 0x80;//T0为1T模式TMOD &= 0xF0;//T0为16位自动重载u16Reload = (uint16_t)((uint32_t)65536 - ((uint32_t)FOSC / 1000));TL0 = (uint8_t)(u16Reload >> 0);		//设置定时初始值TH0 = (uint8_t)(u16Reload >> 8);		//设置定时初始值//中断优先级1,较低级IP |= 0x02;//PT0=1IPH &= 0xFD;//PT0H=0TF0 = 0;//清除T0溢出中断标志TR0 = 1;//定时器T0开始计时ET0 = 1;//使能定时器中断
}

在定时器中断中,可以根据需要添加代码或函数:

/******************************************************************************** 函数名:T0_ISR* 功  能:定时器T0中断* 参  数:无* 返回值:无* 说  明:定时器T0,1ms中断
*******************************************************************************/
void T0_ISR(void) interrupt 1
{TF0 = 0;//清除中断标志位//do something(添加需要的代码)
}

另外,还要开启总中断,即EA = 1,可以放到main函数初始化时执行;

相关文章:

  • QT day4
  • 开源一套Trados Sdlxliff 对比工具
  • 以太坊==使用IDE remix.ethereum搭配metamask发布合约到测试网
  • 【C++】优先队列的使用及模拟实现
  • MetaGPT: Merging Large Language Models Using Model Exclusive Task Arithmetic
  • Linux rm命令由于要删的文件太多报-bash: /usr/bin/rm:参数列表过长,无法删除的解决办法
  • AI:音乐创作的未来还是毁灭的序曲?
  • 在自托管基础设施上使用 GitOps 部署 MinIO
  • 数据通信与网络(五)
  • Oracle day10
  • 【Linux系统】多线程
  • go的context总结
  • 开源项目壮大和创新
  • 颍川文明的传承
  • 微信小程序毕业设计-餐厅点餐系统项目开发实战(附源码+论文)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android组件 - 收藏集 - 掘金
  • Git的一些常用操作
  • JavaScript 一些 DOM 的知识点
  • js面向对象
  • js数组之filter
  • Laravel核心解读--Facades
  • ReactNativeweexDeviceOne对比
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SpriteKit 技巧之添加背景图片
  • vue 个人积累(使用工具,组件)
  • vue--为什么data属性必须是一个函数
  • vue自定义指令实现v-tap插件
  • 坑!为什么View.startAnimation不起作用?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 浅谈Golang中select的用法
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​如何防止网络攻击?
  • ​什么是bug?bug的源头在哪里?
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #{} 和 ${}区别
  • #565. 查找之大编号
  • #数学建模# 线性规划问题的Matlab求解
  • (1)(1.13) SiK无线电高级配置(五)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (笔试题)分解质因式
  • (二)Linux——Linux常用指令
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Scala的“=”符号简介
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core中的时区转换问题
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET开源、简单、实用的数据库文档生成工具