LED闪烁(定时器)
定时器
STC15L2K32S2有3个定时器/计数器
定时器/计数器0、定时器/计数器1、定时器/计数器2
寄存器配置方法跟89C52的差不多,具体可看手册
工作流程:通过寄存器配置定时器的工作模式。设定定时值。定时器启动后,定时器在时钟源的驱动下开始做加1计算,当计数到 65536时,中断标志位 TF0 置位,触发定时器中断,此时可以重新设定时值或自动重装定时值,重新计数,周而复始。 如果定时器中断开启了,CPU 会停下手头的工作,转而去运行定时器中断函数,中断函数运行完之后,CPU 继续干手头的工作。
中断存在的意义:为了提高 CPU 快速处理紧急事件的能力,比如按键中断、 定时任务、故障报警、接口通信等。
程序
在LED闪烁(面向对象编程结构)的工程上添加Timer0.c和Timer0.h文件
Timer0.c:
定时器每隔5ms进入一次中断处理函数,Timer0.usMCU_Run_Timer变量++,加100次时,说明经过了500ms,就让指示灯翻转
定时器在满足要求的情况下,定时时间越长越好,中断过于频繁的话,会影响 CPU 的效率。
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
static void Timer0_Init();
/* Public variables-----------------------------------------------------------*/
Timer0_t Timer0 =
{
0,
Timer0_Init
};
/* Private function prototypes------------------------------------------------*/
/*
* @name Timer0_Init
* @brief 定时器0初始化
* @param None
* @retval None
*/
static void Timer0_Init() //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xEE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/*
* @name Timer0_isr
* @brief 定时器0中断处理函数(5ms中断一次)
* @param None
* @retval None
*/
void Timer0_isr() interrupt 1
{
Timer0.usMCU_Run_Timer++;
if(Timer0.usMCU_Run_Timer >= Timer0_500ms)
{
Timer0.usMCU_Run_Timer = 0;
Run_LED.Run_LED_Flip();
}
}
/********************************************************
End Of File
********************************************************/
Timer0.h:
头文件里定义枚举类型,提供不同的定时时间选择,也可以用#define来宏定义;结构体里的变量记得在Timer0.c文件中初始化
#ifndef __TIMER0_H_
#define __TIMER0_H_
//定义枚举类型,提供不同的定时时间
typedef enum
{
Timer0_50ms = (uint16_t)10,
Timer0_100ms = (uint16_t)20,
Timer0_500ms = (uint16_t)100,
Timer0_1s = (uint16_t)200
}Timer0_Value_t;
//定义结构体类型
typedef struct
{
uint16_t volatile usMCU_Run_Timer;
void (*Timer0_Init)();
}Timer0_t;
/* extern variables-----------------------------------------------------------*/
extern Timer0_t Timer0;
/* extern function prototypes-------------------------------------------------*/
#endif
/********************************************************
End Of File
********************************************************/
Sys_Init.c:
系统初始化函数Sys_Init中分别调用GPIO、上电指示、定时器0和中断初始化函数,其中上电延时是从产品角度上为了让硬件系统稳定,不要一上电就立马开始处理数据,上电指示是为了在调试过程中如果单片机重启了,会有个提示,有利于我们知道哪一步造成重启,进行排错
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
static void GPIO_Init();
static void Power_ON_Indication();
static void Sys_Init();
static void IE_Init();
/* Public variables-----------------------------------------------------------*/
Hardware_Init_t Hardware_Init =
{
GPIO_Init,
Power_ON_Indication,
Sys_Init,
IE_Init
};
/* Private function prototypes------------------------------------------------*/
/*
* @name GPIO_Init
* @brief GPIO初始化
* @param None
* @retval None
*/
static void GPIO_Init()
{
//M1 M0
//0 0 准双向口
//0 1 推挽输出
//1 0 高阻输入
//1 1 开漏
//P34、P35设置为推挽输出
P3M1 = 0x00; //0000 0000
P3M0 = 0x30; //0011 0000
P34 = 0; //关闭运行指示灯
P35 = 0; //关闭PWM灯
//P5
P5M1 = 0x00; //0000 0000
P5M0 = 0xFF; //1111 1111
//M2415为高电平,打开PMOS开关,为外设供电
P54 = 1;
}
/*
* @name Power_ON_Indication
* @brief 上电指示
* @param None
* @retval None
*/
static void Power_ON_Indication()
{
uint8_t i = 5;
while(i--)
{
//LED灯亮
Run_LED.Run_LED_ON();
//延时100毫秒
Public.Delay_ms(100);
//LED灯灭
Run_LED.Run_LED_OFF();
//延时100毫秒
Public.Delay_ms(100);
}
}
/*
* @name IE_Init
* @brief 初始化中断
* @param None
* @retval None
*/
static void IE_Init()
{
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
}
/*
* @name Sys_Init
* @brief 系统初始化
* @param None
* @retval None
*/
static void Sys_Init()
{
Public.Delay_ms(10); //上电后先等待硬件稳定
Hardware_Init.GPIO_Init(); //GPIO口初始化
Hardware_Init.Power_ON_Indication(); //上电指示
Timer0.Timer0_Init(); //定时器0初始化
Hardware_Init.IE_Init(); //中断初始化
}
/********************************************************
End Of File
********************************************************/
main.c:
主函数里调用系统初始化函数,开启定时器定时
/******************************************************************************
* @file main.c
* @author
* @version V1.0
* @date 2022-xx-xx
* @Conpany
* @project STC15实战项目
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
/* Public variables-----------------------------------------------------------*/
/* Private function prototypes------------------------------------------------*/
/*
* @name main
* @brief 主函数
* @param void
* @retval int
*/
int main(void)
{
//系统初始化
Hardware_Init.Sys_Init();
//系统主循环
while(1)
{
}
}
/********************************************************
End Of File
********************************************************/