• 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 
    
    /* 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
    ********************************************************/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    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
    ********************************************************/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    Sys_Init.c:

    系统初始化函数Sys_Init中分别调用GPIO、上电指示、定时器0和中断初始化函数,其中上电延时是从产品角度上为了让硬件系统稳定,不要一上电就立马开始处理数据,上电指示是为了在调试过程中如果单片机重启了,会有个提示,有利于我们知道哪一步造成重启,进行排错

    /* Includes ------------------------------------------------------------------*/
    #include 
    
    /* 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
    ********************************************************/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    main.c:

    主函数里调用系统初始化函数,开启定时器定时

    /******************************************************************************
      * @file    main.c 
      * @author  
      * @version V1.0
      * @date    2022-xx-xx
      * @Conpany 
      * @project STC15实战项目
    *******************************************************************************/
    
    /* Includes ------------------------------------------------------------------*/
    #include 
    
    /* 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
    ********************************************************/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    二进制部署MySQL8.0
    Tomcat安装
    stm32 HSUSB
    Word中的图片保存后变模糊怎么解决
    Java:如何去优雅地优化接口
    EasyConnect
    IT廉连看——C语言——操作符
    SaaSBase:什么是SAP(思爱普) ERP?
    【故障公告】k8s 开船记:增加控制舱(control-plane)造成的翻船
    ajax笔记
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126680211