找回密码
 立即注册
查看: 227|回复: 0

【AI8051U 超简单使用库】2:定时器操作

[复制链接]

3

主题

1

回帖

13

积分

新手上路

积分
13
发表于 2026-5-29 14:42:33 | 显示全部楼层 |阅读模式
这是我封装的第2个库。用于操作stc单片机的定时器:有TIMER_0  TIMER_1  TIMER_2  TIMER_3   TIMER_4  TIMER_11
可以直接设置u8 Timer_Config(Timer_ID timer_id, u16 times, u8 clk_mode)//u16 times是定时时间单位:ms

函数的输入参数进行配置。
参数1:Timer_ID timer_id指定所选择的定时器有:TIMER_0 TIMER_1 TIMER_2
TIMER_3   TIMER_4   TIMER_11 。
参数2:u16 times是定时时间单位:ms 用于设置定时器定时时间 例如传入1就是定时1ms
参数3:u8 clk_mode选择定时器的计时模式TIM_CLOCK_12T:选择将系统时钟进行12分频
           TIM_CLOCK_1T:选择将系统时钟不分频直接输入到指定的定时器外设
           当选择TIM_CLOCK_12T:则times的最大值就是5033
           当选择TIM_CLOCK_1T:则times的最大值就是5033 / 12 = 419


u8  Timer_Int_Config(Timer_ID timer_id, u8 priority,u8 State)

是设置定时器中断的优先级和定时器中断使能与否的
参数1:Timer_ID timer_id有TIMER_0 TIMER_1 TIMER_2 TIMER_3   TIMER_4   TIMER_11  
参数2:u8 priority 设置定时器中断优先级(TIMER_2 TIMER_3   TIMER_4   TIMER_11没有优先级)直接传入NULL即可
           TIMER_0 TIMER_1 有优先级:Priority_0,Priority_1,Priority_2,Priority_3


#include "config.h"
#include "ai8051u.h"0
#include "OLED.h"
#include "GPIO.h"
#include "tim.h"

void main(void)
{
//        TIM_InitTypeDef        TIM_InitStructure;               //结构定义
    WTST = 0;   //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXSFR();   //扩展SFR(XFR)访问使能
    CKCON = 0;  //提高访问XRAM速度

//定时器配置函数 Timer_Config是timer的16位自动重装模式通用初始化函数
   Timer_Config(TIMER_0, 100, TIM_CLOCK_12T);//定时100ms
//定时器中断配置函数
   Timer_Int_Config(TIMER_0, 0,ENABLE);
//定时器配置函数
   Timer_Config(TIMER_1, 2000, TIM_CLOCK_12T);//定时2000ms
//定时器中断配置函数
   Timer_Int_Config(TIMER_1, 0,ENABLE);   
        
   GPIO_Init(GPIO0, GPIO_Pin_7, GPIO_Mode_Out_PP); //设置为推挽输出
   GPIO_Init(GPIO3, GPIO_Pin_4, GPIO_Mode_Out_PP);
       //开启全局中断(51单片机必备,否则所有中断都不生效)
    EA = 1;
   GPIO_SetBits(GPIO0, GPIO_Pin_7);
   GPIO_ResetBits(GPIO3, GPIO_Pin_4);
    while (1)
    {

        }
}
在文件AI8051U_Timer_Isr.c里面
#include "AI8051U_Timer.h"
#include "TIM.H"
#include "GPIO.H"
bit T0_Flag;
//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{
        // TODO: 在此处添加用户代码
        //C51 编译器分析所有函数的调用关系把不会同时执行的函数的寄存器空间(R0~R7)重叠使用
        //但如果一个函数被多个中断服务函数同时调用编译器无法确定这两个中断会不会嵌套执行
        //(比如 Timer0 中断正在执行GPIO_Toggle_Bits时,Timer1 中断触发了)。
        //一旦发生嵌套,两个中断会同时使用同一块寄存器空间,导致寄存器值被互相覆盖,
        //程序会出现莫名其妙的崩溃、数据错乱。
         //GPIO_Toggle_Bits(GPIO0, GPIO_Pin_7);
        
        //所以直接操作寄存器
        P07 = !P07; // 直接操作sbit,不调用任何函数
}

//========================================================================
// 函数: Timer1_ISR_Handler
// 描述: Timer1中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR                //进中断时已经清除标志
{
    P34 = !P34; // 直接操作sbit
}

实验效果1:P34每隔2s翻转一次
截图202605291256065155.jpg
实验效果2:P07 每隔100ms翻转一次
截图202605291158226829.jpg

2 定时器操作.zip (572.37 KB, 下载次数: 47)

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 14:42 , Processed in 0.068408 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表