【STC8H】定时器+中断

一)STC8H定时器简介

  STC8H8K64U有5个定时器:定时器0,定时器1,定时器2,定时器3,定时器4。

想了解更详细的请查阅STC8H官方手册。

1.定时器0/1控制寄存器(TCON)

img

TF1:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件将TF1位置“1”,并向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。

TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就允许T1开始计数,TR1-0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1输入高电平时,才允许T1计数。

TF0:TO溢出中断标志。TO被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TFO,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软件清0)。

TR0:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)-0,TRO=1时就允许T0开始计数,TR0-0时禁止T0计数。当GATE(TMOD.3)=1,TRO=1且INT0输入高电平时,才允许TO计数,TRO-0时禁止T0计数。

IE1:外部中断1请求源(DNT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1。

IT1:外部中断源1触发控制位。IT1=0,上升沿或下降沿均可触发外部中断1。IT1=1,外部中断1程控为下降沿触发方式。
IE0:外部中断0请求源(INTO/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。

IT0:外部中断源0触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。ITO=1,外部中断0程控为下降沿触发方式。

2.定时器0/1模式寄存器(TMOD)

在这里插入图片描述

T1_GATE:控制定时器1,置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1。

T0_GATE:控制定时器0,置1时只有在INT0脚为高及TR0控制位置1时才可打开定时器/计数器0。

T1_C/T:控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T1/P3.5外部脉冲进行计数)

T0_C/T:控制定时器0用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T0/P3.4外部脉冲进行计数)。

T1_MI/T1_M0:定时器定时器/计数器1模式选择

3.定时器/计数器0模式选择

注意:自动重载模式在计数器值溢出后,系统会将内部重载寄存器的值装进去;不自动重载会从0开始计数

4.定时器0模式1(16位不可重装载模式)

此模式下定时器/计数器 0 工作在 16 位不可重装载模式,如下图所示:

此模式下,定时器/计数器 0配置为16位不可重装载模式,由TLO的8位和THO的8位所构成。TLO的8位溢出向THO进位,THO计数溢出置位TCON中的溢出标志位TFO。

当GATE=O(TMOD.3)时,如 TRO=1,则定时器计数。GATE=1 时,允许由外部输入INTO 控制定时器0,这样可实现脉宽测量。TR0为TCON 寄存器内的控制位,TCON 寄在器各位的具体功能描述见上文TCON寄存器的介绍。

当 C/T=0 时,多路开关连接到系统时钟的分频输出,TO 对内部系统时钟计数,T0 工作在定时方式。当C/T=1 时,多路开关连接到外部脉冲输入 P3.4/T0,即 TO 工作在计数方式。

STC 单片机的定时器0有两种计数速率:一种是 12T 模式,每 12 个时钟加 1,与传统 8051 单片机相同:另外一种是 1T 模式,每个时钟加 1,速度是传统 8051 单片机的 12 倍。TO 的速率由特殊功能寄存器 AUXR中的 TOx12 决定,如果 TOx12=0,TO 则工作在 12T 模式,如果 TOx12=1,TO 则工作在1T 模式

5.定时器0计数寄存器(TL0,TH0)

当定时器/计数器0工作在16位模式时,TL0和TH0组合成一个16位寄存器,TL0为低字节,TH0为高字节。

6. 辅助寄存器1(AUXR)

T0x12(地址B7,即最高位):定时器0速度控制位
  0:12T模式,即CPU时钟12分频
  1:1T模式,即CPU时钟不分频

7.中断与时钟输出控制寄存器(INTCLKO)

T0CLKO:定时器0时钟输出控制
  0:关闭时钟输出
  1:使能P3.5口的是定时器0时钟输出功能。当定时器0计数发生溢出时,P3.5口的电平自动发生翻转

8.定时器0计算公式

9.定时器中断系统
(1) 中断向量表
void TM0_Rountine(void) interrupt 1;
(2) 中断使能寄存器

EA:总中断允许控制位。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制:其次还受各中断源自己的中断允许控制位控制。
  0:CPU屏蔽所有的中断申请
  1:CPU开放中断
ELVD:低压检测中断允许位。
  0:禁止低压检测中断
  1:允许低压检测中断
EADC:AD转换中断允许位。
  0:禁止AD转换中断
  1:允许AD转换中断
ES:串行口1中断允许位。
  0:禁止串行口1中断
  1:允许串行口1中断
ET1:定时/计数器T1的溢出中断允许位。
  0:禁止T1中断
  1:允许T1中断
EX1:外部中断1中断允许位。
  0:禁止NT1中断
  1:允许NT1中断
ET0:定时/计数器T0的溢出中断允许位。
  0:禁止T0中断
  1:允许T0中断
EX0:外部中断0中断允许位。
  0:禁止NT0中断
  1:允许NT0中断

(3)中断标志辅助寄存器

INT4IF:外部中断4中断请求标志。中断服务程序中硬件自动清零INT3IF:外部中断3中断请求标志。中断服务程序中硬件自动清零INT2IF:外部中断2中断请求标志。中断服务程序中硬件自动清零
T4F:定时器4溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)。
T3IF:定时器3溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)
T2IF:定时器2溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)。

(二)定时器的配置

1.配置定时器0的模式1

步骤1:SYSclK:表示微控制器或嵌入式系统中的系统主时钟频率。为了方便计算,这里选择48MHZ。

步骤2:选择计数速率。有12T/1T模式的选择。对应寄存器AUXR中的T0x12,如果你想选择12T,那么T0x12置0,否则置1。

步骤3:置1连接。需要给这个部分置为1,开关才能连接。

  1. 为了目标输出为1,根据与门运算得:TR0=1,或门结果=1;

     2.为了或门结果为1,根据或门运算得:非门结果=1;

     3.为了非门结果为1,根据非门运算得:GATE=0;

        

最后打开相应的寄存器。

步骤4:配置计数器

根据定时器的计算公式,比如定时器0的模式1的12T模式

比如我想创建1ms的定时器周期,将1ms转换为0.001s,48MHZ转换为48000000HZ

配置相对应的寄存器就好了。

步骤5:计数位溢出时,TF0会自动置为1,下一步进入到中断。然后打开中断相对应的寄存器就好了!!!

2.示范代码
void vCore_Timer0_Init()//对定时器0进行初始化
{
	AUXR &= 0x7F;	 //定时器时钟设置12T模式
	TMOD &= 0xF0;  	//清空要配置的4位
	TMOD |= 0x01;  	//设置GATE CT M1 M0  1111 0 0 01 
	TL0   = 0x60;	//设置定时初始值(低位)
	TH0   = 0xF0;	//设置定时初始值(高位)
	TF0 = 0;		//TCON -TF0 清除TF0标志
	TR0 = 1;		 //TCON -TR0定时器0开始计时
	IE   |= 0x82;  //打开EA总中断 与定时器0中断 ET0

}
//定时器中断法
void TM0_Isr() interrupt 1
{
		//进入中断会自动重置标志位,不用手动重置TF0
		TL0   = 0x60;	 //设置定时初始值(由于设置的是不自动重置,因此要手动设置定时时间)
		TH0   = 0xF0;	 //设置定时初始值
		i++;           //计数
		if(i==1000)//由于定时器设置周期为1ms,当i==1000时,时间为1s。
		{
			P10 = !P10; //翻转LED
			i=0;
		}	
}
void main()
{

	STC8H_IOinit();			//STC15W单片机引脚初始化函数
	vCore_Timer0_Init();//初始化T0定时器
	
	while(1)
	{
		

	}
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于STC8H1K08芯片的定时器例程,可以参考以下代码: ```c #include "STC8H1K08.h" #include "intrins.h" #define FOSC 11059200UL #define TIMER0_INTERRUPT_VECTOR 1 void timer0Init() { TMOD &= 0xF0; // 设置定时器0为模式0 TL0 = 0x00; // 定时器0计数器初值低字节 TH0 = 0x00; // 定时器0计数器初值高字节 ET0 = 1; // 允许定时器0中断 TR0 = 1; // 启动定时器0 } void timer0InterruptService() interrupt TIMER0_INTERRUPT_VECTOR { // 定时器0中断服务程序 // 在这里编写需要执行的代码 } void main() { timer0Init(); // 初始化定时器0 while(1) { // 主循环 // 在这里编写需要执行的代码 } } ``` 在这个例程中,使用了STC8H1K08芯片的定时器0,并设置为模式0,即16位自动重载模式。在定时器0的中断服务程序中,可以编写需要执行的代码。在主循环中,可以编写其他需要执行的代码。请注意,具体的定时器设置和中断向量可能会有所不同,需要根据具体芯片的文档进行调整。123 #### 引用[.reference_title] - *1* *3* [STC8H1K08 - Timer 0 - Mode 0 - 16-Bit Auto Reload](https://blog.csdn.net/qq_29761395/article/details/120381918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [STC8H1K28学习笔记(二)](https://blog.csdn.net/xinghe030/article/details/129728979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值