STC8增强型单片机开发【定时器Timer⭐】

目录

一、引言

二、定时器基础知识

三、STC8定时器配置

四、代码示例

五、总结


一、引言

在单片机开发中,定时器(Timer)是一个极其重要的组件,它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的微控制器,内置了高性能的定时器模块,为开发者提供了精确的时间控制功能。本文将详细介绍STC8增强型单片机定时器的基本原理、配置方法以及应用示例。

二、定时器基础知识

定时器是单片机内部的一个计数器,它以一定的频率(时钟源)进行计数,当计数值达到设定的阈值时,会产生一个中断或标志位的变化,从而触发相应的处理程序。STC8增强型单片机的定时器通常具有多种工作模式,如定时模式、计数模式、捕获模式等,以满足不同的应用需求。

三、STC8定时器配置

STC8增强型单片机的定时器配置主要包括以下几个方面:

  1. 时钟源选择:定时器可以选择不同的时钟源进行计数,如系统时钟、外部时钟等。时钟源的选择会影响定时器的计数速度和精度。

  2. 工作模式设置:根据应用需求,选择合适的定时器工作模式。例如,在需要精确计时的场合,可以选择定时模式;在需要测量外部事件频率的场合,可以选择计数模式。

  3. 计数初值和重装载值:设置定时器的计数初值和重装载值,以确定定时器的溢出时间和周期。计数初值是定时器开始计数时的初始值,重装载值是在定时器溢出后重新加载到定时器的值。

  4. 中断和标志位设置:根据需要,配置定时器的中断和标志位。当定时器溢出时,可以产生中断请求,并在中断服务程序中执行相应的处理逻辑。同时,定时器溢出时还会设置相应的标志位,方便程序查询定时器的状态。

四、代码示例

以下是一个基于STC8增强型单片机的定时器应用示例代码,用于实现一个简单的LED闪烁功能:

#include "STC8G_H_GPIO.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_Switch.h"
#include "STC8G_H_Timer.h"
#include "Config.h"
void GPIO_config(void) {
    GPIO_InitTypeDef	GPIO_InitStructure;				//结构定义
    GPIO_InitStructure.Pin  = GPIO_Pin_3;				//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;			//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);	//初始化
}


void UART_config(void) {
    // >>> 记得添加 NVIC.c, UART.c, UART_Isr.c <<<
    COMx_InitDefine		COMx_InitStructure;					//结构定义
    COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4

    NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    UART1_SW(UART1_SW_P30_P31);		// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

int count = 0;


void timer0_callback() {
    int i;
    // 当Timer0中断触发时,会回调这个函数

    count++;

    // 灯光闪烁
    if (count == 1000) {	// 1000ms进入if语句一次
        P53 = !P53;
        count = 0;
    }

    //  发送接收数据
    // if (count == 20) {	// 20ms进入if语句一次
    // 是否消息发送完毕
    //if (COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0) {
    // 数据长度是否大于0
    //if(COM1.RX_Cnt > 0) {
    // 收数据
    //for (i = 0; i < COM1.RX_Cnt; i++) {
    //TX1_write2buff(RX1_Buffer[i]);
    //}
    //COM1.RX_Cnt = 0;
    //}
    //}

    //count = 0;
    //}
}


void Timer_config() {
    TIM_InitTypeDef init;
    // 16位自动重载机制模式
    init.TIM_Mode = TIM_16BitAutoReload;		//工作模式,  	TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
    init.TIM_ClkSource = TIM_CLOCK_1T;			//时钟源		TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
    init.TIM_ClkOut = DISABLE;							//可编程时钟输出,	ENABLE,DISABLE

    /*
    装载初值TIM_Value,目标值:65536

    				目标值   装载初值
    * 差值: 65536 - 65530 = 6
    * 差值: 65536 - 64536 = 1000
    * 差值:	 65536 - 41536 = 24000

    装载初值41536 = 65536 - (MAIN_Fosc / 1000)

    24000000次/s ÷ 1000 = 24000次/ms

    根据系统主频,按照装载的初值开始逐渐向目标值递增;
    一旦到达目标值后,触发一次Timer的中断 -> 调用中断函数: interrupt TMR0_VECTOR;
    16位自动重载机制模式:达到目标值后,重新回到装载的初值,开始递增;


    */
    init.TIM_Value = 65536 -(MAIN_Fosc / 1000);		//装载初值  = 目标值减去差值
    // init.TIM_PS = 0;         //8位预分频器 (注意:并非所有系列都有此寄存器,详情请查看数据手册)
    init.TIM_Run = ENABLE;			//是否运行		ENABLE,DISABLE

    Timer_Inilize(Timer0, &init);
    // 中断配置
    NVIC_Timer0_Init(ENABLE, Priority_0);

}


int main() {
    // 开启全局中断
    EA = 1;

    // 1. 设置P53引脚的工作模式
    GPIO_config();
    UART_config();
    // 2. 配置Timer的参数
    Timer_config();

    P53 = 0;		// 熄灯
    while(1) {



    }

}

上列代码所需库函数文件:

 

上列代码中提到的MAIN_Fosc在Config.h文件中:

五、总结

本文详细介绍了STC8增强型单片机定时器的基本原理、配置方法以及应用示例。通过合理配置定时器的时钟源、工作模式、计数初值和重装载值等参数,可以实现精确的时间控制功能。在实际应用中,我们可以利用定时器来实现LED闪烁、按键扫描、延时等待等各种功能。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值