目录
一、引言
二、定时器基础知识
三、STC8定时器配置
四、代码示例
五、总结
一、引言
在单片机开发中,定时器(Timer)是一个极其重要的组件,它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的微控制器,内置了高性能的定时器模块,为开发者提供了精确的时间控制功能。本文将详细介绍STC8增强型单片机定时器的基本原理、配置方法以及应用示例。
二、定时器基础知识
定时器是单片机内部的一个计数器,它以一定的频率(时钟源)进行计数,当计数值达到设定的阈值时,会产生一个中断或标志位的变化,从而触发相应的处理程序。STC8增强型单片机的定时器通常具有多种工作模式,如定时模式、计数模式、捕获模式等,以满足不同的应用需求。
三、STC8定时器配置
STC8增强型单片机的定时器配置主要包括以下几个方面:
-
时钟源选择:定时器可以选择不同的时钟源进行计数,如系统时钟、外部时钟等。时钟源的选择会影响定时器的计数速度和精度。
-
工作模式设置:根据应用需求,选择合适的定时器工作模式。例如,在需要精确计时的场合,可以选择定时模式;在需要测量外部事件频率的场合,可以选择计数模式。
-
计数初值和重装载值:设置定时器的计数初值和重装载值,以确定定时器的溢出时间和周期。计数初值是定时器开始计数时的初始值,重装载值是在定时器溢出后重新加载到定时器的值。
-
中断和标志位设置:根据需要,配置定时器的中断和标志位。当定时器溢出时,可以产生中断请求,并在中断服务程序中执行相应的处理逻辑。同时,定时器溢出时还会设置相应的标志位,方便程序查询定时器的状态。
四、代码示例
以下是一个基于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闪烁、按键扫描、延时等待等各种功能。