Timer串口常用库函数(STC8系列)

发布于:2025-08-08 ⋅ 阅读:(15) ⋅ 点赞:(0)

STC8系列定时器(Timer)串口库函数使用指南

STC8系列单片机内置多个定时器和串口模块,官方库函数简化了配置流程。以下为关键函数及使用方法:

定时器头文件和依赖

1. Timer.c Timer.h Timer_Isr.c
2. NVIC.c NVIC.h

#include "Timer.h"
#include "NVIC.h"

实现初始化定时器和中断函数

需在中断控制寄存器中开启相应中断:

void	Timer_config(void)
{
	TIM_InitTypeDef		TIM_InitStructure;						//结构定义
	//定时器0做16位自动重装, 中断频率为1000HZ
	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;		//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = DISABLE;				//是否输出高速脉冲, ENABLE或DISABLE
	TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);		//初值,
	TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4
	NVIC_Timer0_Init(ENABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

中断使能配置

需在中断控制寄存器中开启相应中断:

EA = 1;                 //全局中断开关
ET0 = 1;                //定时器0中断允许
ES = 1;                 //串口中断允许

波特率计算方法

STC8系列波特率计算公式:
在这里插入图片描述
在这里插入图片描述

数据收发示例

发送数据使用:

if(COM1.RX_TimeOut > 0) {
    //超时计数
    if(--COM1.RX_TimeOut == 0) {
        if(COM1.RX_Cnt > 0) {
            // 这里处理收到的数据,做具体的逻辑,可以调用自己的on_uart1_recv
            for(i=0; i<COM1.RX_Cnt; i++)	{
                // RX1_Buffer[i]存的是接收的每个字节,写出用 TX1_write2buff
            }
        }
        COM1.RX_Cnt = 0;
    }
}

// 不要处理的太快
delay_ms(10);

方法1
接收数据通过中断处理:修改Timer_Isr.c实现中断函数的调用,并在main.c中声明实现timer0_call函数

extern void timer0_call();//声明

//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{
	// TODO: 在此处添加用户代码
	timer0_call();
}

然后在main.c中实现timer0_call:

void timer0_call(){
	// TODO: 在此处添加用户代码
}

方法2
直接在main.c中实现interrupt函数(记得删掉或注释掉Timer_Isr.c中对应的中断函数)

void Timer0_ISR (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{
	// TODO: 在此处添加用户代码
}

注意事项

  • 使用1T模式时需设置AUXR寄存器对应位
  • 12时钟模式下定时器初值计算与1T模式不同
  • 多串口系统需注意中断优先级配置

以上为STC8系列定时器与串口库函数的核心使用方法,具体参数需根据实际时钟频率和通信需求调整。


网站公告

今日签到

点亮在社区的每一天
去签到