STC15单片机-LED闪烁(定时器)

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
********************************************************/
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值