HT66F018定时器0定时/计数器功能使用教程

  • 一、定时器介绍
    • 1、标准型 TM – STM
    • 2、寄存器介绍
      • ①、TM0C0寄存器
      • ②、TM0C1寄存器
      • ③、TM0DL和TM0DH寄存器
      • ④、TM0AL和TM0AH寄存器
      • ⑤、TM0RP寄存器
    • 3、寄存器工作模式
      • ①、定时/计数器模式
      • ②、比较匹配输出模式
      • ③、比较匹配输出模式(A匹配注意事项)
    • 4、中断介绍
      • ①、中断寄存器
      • ②、中断操作
      • ③、中断向量表
      • ④、多功能中断和TM中断
      • ⑤、INTC0 寄存器
      • ⑥、MFI0 寄存器
    • 5、系统时钟
  • 二、程序编写
    • 1、系统初始化
    • 2、TM0初始化
    • 3、TM0中断服务程序
    • 4、主函数
    • 5、完整代码

一、定时器介绍

1、标准型 TM – STM

合泰单片机HT66F018有三个定时器,定时器0即标准型TM-STM是一个16位的定时器。本篇博客主要讲的是TM0的定时器/计数器功能,深度剖析技术文档,从寄存器到中断一路详细介绍,再到完成程序编写。


2、寄存器介绍

标准型 TM 的所有工作模式由一系列寄存器控制。一对只读寄存器用来存放 16位计数器的值,一对读 / 写寄存器存放 16 位 CCRA 的值。一个读 / 写寄存器存放 8 位 CCRP 的值,剩下两个控制寄存器设置工作模式。

①、TM0C0寄存器

TM0C0寄存器我们需要用到它的6、5、4、3位。

②、TM0C1寄存器

由于我们着重介绍的定时器/计数器功能,所以TM0C1寄存器我们只需要看7、6、0位。


③、TM0DL和TM0DH寄存器

④、TM0AL和TM0AH寄存器


⑤、TM0RP寄存器

由于我们这里没用到P匹配,不展开介绍。

3、寄存器工作模式

①、定时/计数器模式

定时 / 计数器模式与比较输出模式操作方式相同,并产生同样的中断请求标志。不同的是,在定时 / 计数器模式下 TM 输出脚未使用。因此,比较匹配输出模式中的描述和时序图可以适用于此功能。该模式中未使用的 TM 输出脚用作普通 I/O 脚或其它功能。

②、比较匹配输出模式

③、比较匹配输出模式(A匹配注意事项)

4、中断介绍

①、中断寄存器

②、中断操作

③、中断向量表

从中断向量表中可以看出来,TM0中断属于多功能中断。

④、多功能中断和TM中断

当多功能中断中任何一种中断请求标志 MF0F~MF2F 被置位,多功能中断请求产生。当中断使能,堆栈未满,包括在多功能中断中的任意一个中断发生时,将调用多功能中断向量中的一个子程序。当响应中断服务子程序时,相关的多功能请求标志位会自动复位且 EMI 位会自动清零以除能其它中断。

在中断响应时,虽然多功能中断标志会自动复位,但多功能中断源的请求标志位,即 TM 中断,LVD 中断和 EEPROM 中断的请求标志位不会自动复位,必须由应用程序清零


⑤、INTC0 寄存器

⑥、MFI0 寄存器

5、系统时钟

SMOD寄存器

二、程序编写

有了以上的基础知识后,就可以开始我们的程序编写了。

1、系统初始化

新建main.c,必须导入HT66F018.h

#include "HT66F018.h"

配置选项中,Vdd选择的是5V,OSC我选择的是internal RC + IO1/IO2(内部RC振荡器),HIRC选择的是8MHz @Vdd=5V,fsub选择的是LIRC
进行系统初始化,如选择系统时钟源。

//fH = 8MHz
//fLIRC = 32kHz
_wdtc = 0xA8;  //关闭看门狗
_hlclk = 1;        //系统时钟8MHz@Vdd=5V,系统时钟不分频,查看SMOD寄存器
_acerl = 0x00; //禁止所有AD_pbc0 = 0;     //pb0配置为输出,用于演示输出效果

2、TM0初始化

定时器0初值计算方法:
1、需要定时 time = 1ms = 1000us
2、系统时钟不分频,所以 fsys = 8MHz
3、TM0 计数时钟位为 fsys / 4,所以 Tfreq = 8 / 4 = 2MHz
4、定时器初值TM0A = Tfreq * time(us) = 2 * 1000 = 2000
5、_tm0al = 2000 & 0x00FF;         _tm0ah = 2000 >> 8;

由此同理可得:
1、需要定时 time = 0.3ms = 300us
2、fH = 12MHz,系统时钟4分频,所以 fsys = 12 / 4 = 3MHz
3、TM0 计数时钟位为 fsys,所以 Tfreq = fsys = 3MHz
4、定时器初值TM0A = Tfreq * time(us) = 3 * 300 = 900
5、_tm0al = 900 & 0x00FF;         _tm0ah = 900 >> 8;

//定时器0初始化函数
void tm0_init(void)
{_t0ck2 = 0; _t0ck1 = 0; _t0ck0 = 0; //选择TM0计数时钟位为fsys/4_t0m0 = 1;//定时/计数器模式_t0m1 = 1;_t0cclr = 1;//A匹配//fH=8MHz@Vdd=5V, fsys=不分频, TM 时钟源 = fsys/4, 定时器初值 = ((fsys=不分频) / 4 * (1000us))//此处例程定时时间为1ms_tm0al = 2000 & 0x00FF; //设置定时器0的A匹配低八位值 _tm0ah = 2000 >> 8;  //高八位值_t0af = 0;//中断请求标志位_t0on = 1;//定时器开始计时_mf0e = 1;//多功能中断请求标志_t0ae = 1;//中断使能
}

3、TM0中断服务程序

//定时器0中断
void __attribute((interrupt(0x0C))) Timer0_ISR(void)
{if(1 == _t0af){  //TM0的A匹配中断_t0af = 0;  //手动清除T0中断标志位count++;if(count == 500){count = 0;_pb0 = ~_pb0;}}//一旦中断子程序被响应,系统将自动清除EMI位,所有其它的中断将被屏蔽_emi = 1;   //手动打开总中断}

4、主函数

//主函数
void main()
{//fH = 8MHz//fLIRC = 32kHz_wdtc = 0xA8; //关闭看门狗_hlclk = 1; //系统时钟8MHz@Vdd=5V_acerl = 0x00;  //禁止所有AD_pbc0 = 0;     //pb0作为演示效果IO,可以外接一个LED查看效果tm0_init();//开启总中断_emi = 1;//用户代码while(1);}

5、完整代码

#include "HT66F018.h"volatile unsigned int count = 0; //中断计数器//定时器0初始化函数
void tm0_init(void)
{_t0ck2 = 0; _t0ck1 = 0; _t0ck0 = 0; //选择TM0计数时钟位为fsys/4_t0m0 = 1;//定时/计数器模式_t0m1 = 1;_t0cclr = 1;//A匹配//fH=8MHz@Vdd=5V, fsys=不分频, TM 时钟源 = fsys/4, 定时器初值 = ((fsys=不分频) / 4 * (1000us))//此处例程定时时间为1ms_tm0al = 2000 & 0x00FF; //设置定时器0的A匹配低八位值 _tm0ah = 2000 >> 8;  //高八位值_t0af = 0;//中断请求标志位_t0on = 1;//定时器开始计时_mf0e = 1;//多功能中断请求标志_t0ae = 1;//中断使能
}//主函数
void main()
{//fH = 8MHz//fLIRC = 32kHz_wdtc = 0xA8; //关闭看门狗_hlclk = 1; //系统时钟8MHz@Vdd=5V_acerl = 0x00;  //禁止所有AD_pbc0 = 0;tm0_init();//开启总中断_emi = 1;//用户代码while(1);}//定时器0中断
void __attribute((interrupt(0x0C))) Timer0_ISR(void)
{if( 1 == _t0af){ //T0的A匹配中断_t0af = 0;       //手动清除T0中断标志位count++;if(count == 500){  //500ms反转一次pb0的电平count = 0;_pb0 = ~_pb0;}}//一旦中断子程序被响应,系统将自动清除EMI位,所有其它的中断将被屏蔽_emi = 1;   //手动打开总中断}

HT66F018定时器0(STM)定时器/计数器功能使用教程相关推荐

  1. LPC2103学习之定时器0和定时器1

    2019独角兽企业重金招聘Python工程师标准>>> 这两天学习LPC2103的定时器.开始看前面的寄存器介绍看的有点头晕,一会儿就搞混了.不过当我看到后面用图片描述定时器相关寄存 ...

  2. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> ...

  3. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> #defin ...

  4. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。

    编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器. 程序: #include<reg51.h> sbit fm=P2^3; unsigned char cnt; int ...

  5. 利用定时器0工作方式1——独立按键控制流水灯模式

    目录 1.前言 1.1 项目资源 1.2 实验现象 2.定时器/计数器 2.1定时器/计数器0&1的相关寄存器 2.2定时器的工作方式(总结) 3.中断系统 3.1中断概念 3.2中断流程: ...

  6. 51单片机用定时器0实现流水灯

    51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值.原先写的都是用查表来移位的,个人感觉不怎么 ...

  7. PLC实验:定时器/计数器功能实验

    实验项目名称:定时器/计数器功能实验 一.实验控制要求 1.延时启动程序 按下按钮 I0.0,指示灯 Q0.0 延时 6 秒后启动,按下停止按钮 I0.1,指示灯立即熄灭. 2.闪烁程序 按下启动按钮 ...

  8. 基本指令的编程练习-PLC认识实验-定时器/计数器功能实验

    微信公众号:创享日记 发送关键词:plc1 免费获取完整无水印实验报告 [PLC认识实验] 一.实验目的 1.了解PLC软硬件结构及系统组成; 2.掌握PLC外围直流控制及负载线路的接法及上位计算机与 ...

  9. 单片机定时器_单片机定时器/计数器基本原理

    目前常用的单片机中往往都配备了定时器/计数器.在AT89S52芯片内包含有三个16位的定时器/计数器:T0.T1和T2,其核心是加1计数器.我们主要要求掌握T0和T1的结构和功能.学习中要注意从电路结 ...

  10. 定时器0 定时器2波特率发生器 AD转换

    /***定时器0 定时器2波特率发生器 AD转换***/ /***程序测试 2021 3 19*******************/               #include     " ...

最新文章

  1. Asp.Net Core写个共享磁盘文件Web查看器
  2. 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
  3. c语言stdio中null的值,C/C++编程笔记:C语言NULL值和数字 0 值区别及NULL详解
  4. SQL查询数据库完整表结构(mysql)
  5. Node.js 开发者 2020 年度报告
  6. python_day7 绑定方法与非绑定方法
  7. 在Python中使用Twitter Rest API批量搜索和下载推文
  8. centos6.5配置Hadoop环境,运行wordcount例子
  9. CV Code|计算机视觉开源周报20200502期
  10. matplotlib绘图相关
  11. python查找指定文件夹_python实现在目录中查找指定文件的方法
  12. html table 转置,jQuery+CSS实现的table表格行列转置功能示例
  13. 作业2-Python基础练习
  14. 删除了项目下的\WEB-INF\classes文件夹,在eclipse的tomcat部署启动时报错。
  15. 2021五一杯数学建模A题 疫苗生产问题
  16. 红蜘蛛多媒体网络教室v7.2版一款网络教学的软件
  17. 软件测试-APP专项测试
  18. Discuz门户模板乱码解决方案
  19. LQ0116 方格计数【数学计算】
  20. 计算机报刊杂志推荐,计算机优秀期刊推荐 | Journal of Cloud Computing

热门文章

  1. iPhone全部设备分辨率速查
  2. IOS 调用微信扫码二维码
  3. [转]Apache Ignite——新一代数据库缓存系统
  4. 高中数学竞赛与自主招生内部练习试题
  5. 在寂静的夜中、独自沉沦_悲伤QQ个人签名
  6. keil更改黑色背景颜色
  7. ubuntu18.04安装搜狗输入法之后无法使用的问题
  8. MYS-6ULX-IOT 开发板测评——Yocto 创建嵌入式 Linux 发行版
  9. 单模光纤和多模光纤的区别,以及作用
  10. iOS项目开发中的知识点与问题收集整理