找回密码
 立即注册
查看: 1253|回复: 22

我也来分享一个我使用的软定时器

[复制链接]

该用户从未签到

1

主题

1

回帖

15

积分

新手上路

积分
15
发表于 2023-5-7 11:40:52 | 显示全部楼层 |阅读模式
因为在实际应用中可能需要大量的定时器,需要不同的定时时间,
但硬件定时器数量较少,不能满足需求,
所以我写了一个的定时器的子程序,供参考一下,
也请各位大侠多多指教!废话不多说,上代码
定时器h和C文件,此部分参考了STC官网程序

time.h文件


  1. #ifndef TIME
  2. #define TIME
  3. #include "../comm/STC32G.h"
  4. #define MAIN_Fosc       24000000UL  //定义主时钟
  5. #define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒
  6. #define Timer1_Reload   (MAIN_Fosc / 2000)      //Timer 1 中断频率, 2000次/秒
  7. #define Timer2_Reload   (MAIN_Fosc / 3000)      //Timer 2 中断频率, 3000次/秒
  8. #define Timer3_Reload   (MAIN_Fosc / 4000)      //Timer 3 中断频率, 4000次/秒
  9. #define Timer4_Reload   (MAIN_Fosc / 5000)      //Timer 4 中断频率, 5000次/秒
  10. //-------------------------------引脚定义----------------------------------
  11. //-------------------------------变量声明----------------------------------
  12. extern unsigned int Flag_1ms;                                                                                                //1ms时基
  13. extern unsigned int Flag_10ms;                                                                                        //10ms时基
  14. extern unsigned int Flag_100ms;                                                                                        //100ms时基
  15. extern bit flag1ms  ;                                                                                                                //1ms时基位变量
  16. extern bit flag10ms ;                                                                                                                //10ms时基位变量
  17. extern bit flag100ms;                                                                                                                //100ms时基位变量
  18. //-------------------------------函数声明----------------------------------
  19. void Timer0_init(void);                                                                                                        //定时器0初始化
  20. void Timer1_init(void);                                                                                                        //定时器1初始化
  21. void Timer2_init(void);                                                                                                        //定时器2初始化
  22. void Timer3_init(void);                                                                                                        //定时器3初始化
  23. void Timer4_init(void);                                                                                                        //定时器4初始化
  24.                                                                                                                               
  25. #endif
复制代码
time.c文件


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
  9. /* --- QQ:  800003751 -------------------------------------------------*/
  10. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
  11. /*---------------------------------------------------------------------*/
  12. /*************  功能说明    **************
  13. 本例程基于STC32G为主控芯片的实验箱进行编写测试。
  14. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
  15. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
  16. 本程序演示5个定时器的使用, 本例程均使用16位自动重装.
  17. 定时器0做16位自动重装, 中断频率为1000HZ,中断函数从P6.7取反输出500HZ方波信号.
  18. 定时器1做16位自动重装, 中断频率为2000HZ,中断函数从P6.6取反输出1000HZ方波信号.
  19. 定时器2做16位自动重装, 中断频率为3000HZ,中断函数从P6.5取反输出1500HZ方波信号.
  20. 定时器3做16位自动重装, 中断频率为4000HZ,中断函数从P6.4取反输出2000HZ方波信号.
  21. 定时器4做16位自动重装, 中断频率为5000HZ,中断函数从P6.3取反输出2500HZ方波信号.
  22. 下载时, 选择时钟 24MHZ (用户可自行修改频率).
  23. ******************************************/
  24. //下面程序修改自STC官网例程,主要修改了定时器0的中断函数,使用了定时器0的时基作为软定时器的基准
  25. #include "time.h"     
  26. //========================================================================
  27. // 函数: void Timer0_init(void)
  28. // 描述: timer0初始化函数.
  29. // 参数: none.
  30. // 返回: none.
  31. // 版本: V1.0, 2015-1-12
  32. //========================================================================
  33. void Timer0_init(void)
  34. {
  35.         TR0 = 0;    //停止计数
  36.     #if (Timer0_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  37.         #error "Timer0设置的中断过快!"
  38.     #elif ((Timer0_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  39.         ET0 = 1;    //允许中断
  40.     //  PT0 = 1;    //高优先级中断
  41.         TMOD &= ~0x03;
  42.         TMOD |= 0;  //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
  43.     //  T0_CT = 1;  //计数
  44.         T0_CT = 0;  //定时
  45.     //  T0CLKO = 1; //输出时钟
  46.         T0CLKO = 0; //不输出时钟
  47.         #if (Timer0_Reload < 65536UL)
  48.             T0x12 = 1;  //1T mode
  49.             TH0 = (unsigned char)((65536UL - Timer0_Reload) / 256);
  50.             TL0 = (unsigned char)((65536UL - Timer0_Reload) % 256);
  51.         #else
  52.             T0x12 = 0;  //12T mode
  53.             TH0 = (unsigned char)((65536UL - Timer0_Reload/12) / 256);
  54.             TL0 = (unsigned char)((65536UL - Timer0_Reload/12) % 256);
  55.         #endif
  56.         TR0 = 1;    //开始运行
  57.     #else
  58.         #error "Timer0设置的中断过慢!"
  59.     #endif
  60. }
  61. //========================================================================
  62. // 函数: void Timer1_init(void)
  63. // 描述: timer1初始化函数.
  64. // 参数: none.
  65. // 返回: none.
  66. // 版本: V1.0, 2015-1-12
  67. //========================================================================
  68. void Timer1_init(void)
  69. {
  70.         TR1 = 0;    //停止计数
  71.     #if (Timer1_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  72.         #error "Timer1设置的中断过快!"
  73.     #elif ((Timer1_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  74.         ET1 = 1;    //允许中断
  75.     //  PT1 = 1;    //高优先级中断
  76.         TMOD &= ~0x30;
  77.         TMOD |= (0 << 4);   //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
  78.     //  T1_CT = 1;  //计数
  79.         T1_CT = 0;  //定时
  80.     //  T1CLKO = 1; //输出时钟
  81.         T1CLKO = 0; //不输出时钟
  82.         #if (Timer1_Reload < 65536UL)
  83.             T1x12 = 1;  //1T mode
  84.             TH1 = (unsigned char)((65536UL - Timer1_Reload) / 256);
  85.             TL1 = (unsigned char)((65536UL - Timer1_Reload) % 256);
  86.         #else
  87.             T1x12 = 0;  //12T mode
  88.             TH1 = (unsigned char)((65536UL - Timer1_Reload/12) / 256);
  89.             TL1 = (unsigned char)((65536UL - Timer1_Reload/12) % 256);
  90.         #endif
  91.         TR1 = 1;    //开始运行
  92.     #else
  93.         #error "Timer1设置的中断过慢!"
  94.     #endif
  95. }
  96. //========================================================================
  97. // 函数: void Timer2_init(void)
  98. // 描述: timer2初始化函数.
  99. // 参数: none.
  100. // 返回: none.
  101. // 版本: V1.0, 2015-1-12
  102. //========================================================================
  103. void Timer2_init(void)
  104. {
  105.         T2R = 0;    //停止计数
  106.     #if (Timer2_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  107.         #error "Timer2设置的中断过快!"
  108.     #elif ((Timer2_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  109.         ET2 = 1;    //允许中断
  110.     //  T2_CT = 1;  //计数
  111.         T2_CT = 0;  //定时
  112.     //  T2CLKO = 1; //输出时钟
  113.         T2CLKO = 0; //不输出时钟
  114.         #if (Timer2_Reload < 65536UL)
  115.             T2x12 = 1;    //1T mode
  116.             T2H = (unsigned char)((65536UL - Timer2_Reload) / 256);
  117.             T2L = (unsigned char)((65536UL - Timer2_Reload) % 256);
  118.         #else
  119.             T2x12 = 0;    //12T mode
  120.             T2H = (unsigned char)((65536UL - Timer2_Reload/12) / 256);
  121.             T2L = (unsigned char)((65536UL - Timer2_Reload/12) % 256);
  122.         #endif
  123.         T2R = 1;    //开始运行
  124.     #else
  125.         #error "Timer2设置的中断过慢!"
  126.     #endif
  127. }
  128. //========================================================================
  129. // 函数: void Timer3_init(void)
  130. // 描述: timer3初始化函数.
  131. // 参数: none.
  132. // 返回: none.
  133. // 版本: V1.0, 2015-1-12
  134. //========================================================================
  135. void Timer3_init(void)
  136. {
  137.         T3R = 0;    //停止计数
  138.     #if (Timer3_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  139.         #error "Timer3设置的中断过快!"
  140.     #elif ((Timer3_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  141.         ET3 = 1;    //允许中断
  142.     //  T3_CT = 1;  //计数
  143.         T3_CT = 0;  //定时
  144.     //  T3CLKO = 1; //输出时钟
  145.         T3CLKO = 0; //不输出时钟
  146.         #if (Timer3_Reload < 65536UL)
  147.             T3x12 = 1;    //1T mode
  148.             T3H = (unsigned char)((65536UL - Timer3_Reload) / 256);
  149.             T3L = (unsigned char)((65536UL - Timer3_Reload) % 256);
  150.         #else
  151.             T3x12 = 0;    //12T mode
  152.             T3H = (unsigned char)((65536UL - Timer3_Reload/12) / 256);
  153.             T3L = (unsigned char)((65536UL - Timer3_Reload/12) % 256);
  154.         #endif
  155.         T3R = 1;    //开始运行
  156.     #else
  157.         #error "Timer3设置的中断过慢!"
  158.     #endif
  159. }
  160. //========================================================================
  161. // 函数: void Timer4_init(void)
  162. // 描述: timer4初始化函数.
  163. // 参数: none.
  164. // 返回: none.
  165. // 版本: V1.0, 2015-1-12
  166. //========================================================================
  167. void Timer4_init(void)
  168. {
  169.         T4R = 0;    //停止计数
  170.     #if (Timer4_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  171.         #error "Timer4设置的中断过快!"
  172.     #elif ((Timer4_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  173.         ET4 = 1;    //允许中断
  174.     //  T4_CT = 1;  //计数
  175.         T4_CT = 0;  //定时
  176.     //  T4CLKO = 1; //输出时钟
  177.         T4CLKO = 0; //不输出时钟
  178.         #if (Timer4_Reload < 65536UL)
  179.             T4x12 = 1;    //1T mode
  180.             T4H = (unsigned char)((65536UL - Timer4_Reload) / 256);
  181.             T4L = (unsigned char)((65536UL - Timer4_Reload) % 256);
  182.         #else
  183.             T4x12 = 0;    //12T mode
  184.             T4H = (unsigned char)((65536UL - Timer4_Reload/12) / 256);
  185.             T4L = (unsigned char)((65536UL - Timer4_Reload/12) % 256);
  186.         #endif
  187.         T4R = 1;    //开始运行
  188.     #else
  189.         #error "Timer4设置的中断过慢!"
  190.     #endif
  191. }
  192. //========================================================================
  193. // 函数: void timer0_int (void) interrupt TIMER0_VECTOR
  194. // 描述:  timer0中断函数.
  195. // 参数: none.
  196. // 返回: none.
  197. // 版本: V1.0, 2015-1-12
  198. //========================================================================
  199. bit flag1ms=0;//1ms时基位变量
  200. bit flag10ms=0;//10ms时基位变量
  201. bit flag100ms=1;//100ms时基位变量
  202. unsigned int Flag_1ms=0;//1ms时基
  203. unsigned int Flag_10ms=0;//10ms时基
  204. unsigned int Flag_100ms=0;//100ms时基
  205. void timer0_int (void) interrupt 1
  206. {   
  207.         static unsigned char count10=0;//软定时器10ms计数值
  208.         static unsigned char count100=0;//软定时器100ms计数值                  
  209.     Flag_1ms=0xffff;        
  210.         flag1ms=1;
  211.     count10++;
  212.     count100++;
  213.     if (count10>=10)
  214.     {
  215.             Flag_10ms=0xffff;
  216.             count10=0;
  217.                 flag10ms=1;               
  218.     }        
  219.     if (count100>=100)
  220.     {
  221.             Flag_100ms=0xffff;
  222.             count100=0;
  223.                 flag100ms=1;                        
  224.     }
  225. }
  226. //========================================================================
  227. // 函数: void timer1_int (void) interrupt TIMER1_VECTOR
  228. // 描述:  timer1中断函数.
  229. // 参数: none.
  230. // 返回: none.
  231. // 版本: V1.0, 2015-1-12
  232. //========================================================================
  233. void timer1_int (void) interrupt 3
  234. {
  235.     P76 = ~P76;
  236. }
  237. //========================================================================
  238. // 函数: void timer2_int (void) interrupt TIMER2_VECTOR
  239. // 描述:  timer2中断函数.
  240. // 参数: none.
  241. // 返回: none.
  242. // 版本: V1.0, 2015-1-12
  243. //========================================================================
  244. void timer2_int (void) interrupt 12
  245. {
  246.     P77 = ~P77;
  247. }
  248. //========================================================================
  249. // 函数: void timer3_int (void) interrupt TIMER3_VECTOR
  250. // 描述:  timer3中断函数.
  251. // 参数: none.
  252. // 返回: none.
  253. // 版本: V1.0, 2015-1-12
  254. //========================================================================
  255. void timer3_int(void) interrupt 19
  256. {
  257.     P45 = ~P45;
  258. }
  259. //========================================================================
  260. // 函数: void timer4_int (void) interrupt TIMER4_VECTOR
  261. // 描述:  timer4中断函数.
  262. // 参数: none.
  263. // 返回: none.
  264. // 版本: V1.0, 2015-1-12
  265. //========================================================================
  266. void timer4_int(void) interrupt 20
  267. {
  268.     P46 = ~P46;
  269. }
复制代码
下面是软定时器函数
delay.h
  1. #ifndef DELAY
  2. #define DELAY
  3. #include "time.h"
  4. /*******************************************************************
  5. *                                                                   *
  6. * 软定时器的实现                                                                                                                                                    *
  7. *                                                                   *
  8. * 1、定义了48个定时器                                              *
  9. * 2、定时器定义如下                                                               *
  10. //1、定义的定时器0~15为1ms定时器 ,定时范围为0~32768ms
  11. //2、定义的定时器16~31为10ms定时器, 定时范围为0~327680ms
  12. //3、定义的定时器32~47为100ms定时器,定时范围为0~3276800ms
  13. //4、定时器设定时间最大32768,不要用靠近的 定时器,
  14. //比如定时100ms使用1ms定时器而不要使用100ms定时器,不然有定时误差
  15. * 3、使用的是stc32的定时器0,基础时基为1ms                                                                                *
  16. *                                                                   *
  17. *********************************************************************/
  18. //-------------------------------引脚定义----------------------------------
  19. //-------------------------------变量声明----------------------------------
  20. //-------------------------------函数声明----------------------------------
  21. void TMR(unsigned char _id,unsigned int Presets);//设定定时器id和此定时器需要的定时时间
  22. unsigned int TD(unsigned char _id); //返回定时器当前计数值
  23. void Init_T(unsigned char _id);//定时器初始化
  24. bit Tim(unsigned char _id); //定时器状态值
  25. #endif
复制代码
delay.c

  1. #include "delay.h"
  2. /*******************************************************************
  3. *                                                                   *
  4. * 软定时器的实现                                                                                                                                                    *
  5. *                                                                   *
  6. * 1、定义了48个定时器                                              *
  7. * 2、定时器定义如下                                                               *
  8. //1、定义的定时器0~15为1ms定时器 ,定时范围为0~32768ms
  9. //2、定义的定时器16~31为10ms定时器, 定时范围为0~327680ms
  10. //3、定义的定时器32~47为100ms定时器,定时范围为0~3276800ms
  11. //4、定时器设定时间最大32768,不要用靠近的 定时器,
  12. //比如定时100ms使用1ms定时器而不要使用100ms定时器,不然有定时误差
  13. * 3、使用的是stc32的定时器0,基础时基为1ms                                                                                *
  14. *                                                                   *
  15. *********************************************************************/
  16. //使用位段功能,大大减少内存占用,使用结构体改变定义不影响后面程序
  17. typedef  struct
  18. {
  19.                  unsigned int current:15;//低15位作为计数值
  20.                  unsigned int state:1;//最高位作为标志位
  21.          
  22. } Timer_TypeDef;
  23.   Timer_TypeDef  T[48];
  24. //1、定义的定时器0~15为1ms定时器 ,定时范围为0~32768ms
  25. //2、定义的定时器16~31为10ms定时器, 定时范围为0~327680ms
  26. //3、定义的定时器32~47为100ms定时器,定时范围为0~3276800ms
  27. //4、定时器设定时间最大32768,不要用靠近的 定时器,
  28. //比如定时100ms使用1ms定时器而不要使用100ms定时器,不然有定时误差
  29. /**********************************************************************
  30. //函数名称:TMR(unsigned char _id,uint16_t Presets)
  31. //函数功能:设定定时器id和此定时器需要的定时时间
  32. //入口参数:定时器id,需要定时时间
  33. //返回参数:无
  34. //当前版本:V1.0
  35. //修改日期:
  36. //当前作者:
  37. //其它备注:
  38. **********************************************************************/
  39. void TMR(unsigned char _id,unsigned int Presets)//设定定时器id和此定时器需要的定时时间
  40. {
  41.         if(_id<16)        //时基是1ms
  42.         {
  43.         if((Flag_1ms & (1<<_id)) && T[_id].state==0)//相比下面语句精简一点,下同
  44.         {
  45.             Flag_1ms &=~(1<<_id);//对应标志位清零
  46.                                            T[_id].current++;//软定时器计数值+1
  47.                        if(T[_id].current<Presets) return;
  48.                                T[_id].state=1; //软定时器定时时间到
  49.         }        
  50.         }
  51.         if(_id<32 && _id>=16)        //时基是10ms
  52.         {
  53.         if((Flag_10ms & (1<<(_id-16))) && T[_id].state==0)        
  54.         {
  55.                 Flag_10ms &=~(1<<(_id-16));//对应标志位清零
  56.           T[_id].current++;//软定时器计数值+1
  57.                        if(T[_id].current>=Presets)
  58.                   T[_id].state=1;//软定时器定时时间到
  59.         }        
  60.         }        
  61.                 if(_id<48 && _id>=32)        //时基是100ms
  62.         {
  63.         if((Flag_100ms & (1<<(_id-32))) && T[_id].state==0)
  64.         {
  65.             Flag_100ms &=~(1<<(_id-32));//对应标志位清零
  66.                                           T[_id].current++;//软定时器计数值+1
  67.                                    if(T[_id].current<Presets) return;
  68.                                          T[_id].state=1;//软定时器定时时间到
  69.         }        
  70.         }               
  71. }
  72. /**********************************************************************
  73. //函数名称: unsigned int TD(unsigned char _id)
  74. //函数功能: 返回定时器当前值
  75. //入口参数: 定时器的ID值
  76. //返回参数: 定时器已过计数值
  77. //当前版本: V1.0
  78. //修改日期:
  79. //当前作者:
  80. //其它备注:
  81. **********************************************************************/
  82. unsigned int TD(unsigned char _id)
  83. {
  84.          return T[_id].current;
  85. }
  86. /**********************************************************************
  87. //函数名称: void Init_T(unsigned char _id)
  88. //函数功能:初始化定时器
  89. //入口参数:定时器id
  90. //返回参数:无
  91. //当前版本:V1.0
  92. //修改日期:
  93. //当前作者:
  94. //其它备注:
  95. **********************************************************************/
  96. void Init_T(unsigned char _id)
  97. {
  98.          T[_id].current=0;
  99.          T[_id].state=0;
  100. }
  101. /**********************************************************************
  102. //函数名称:bit Tim(unsigned char _id)
  103. //函数功能:定时器状态值
  104. //入口参数:定时器id
  105. //返回参数:定时器结果,1为定时器时间到,0为时间未到
  106. //当前版本:V1.0
  107. //修改日期:
  108. //当前作者:
  109. //其它备注:
  110. **********************************************************************/
  111. bit Tim(unsigned char _id)
  112. {
  113.     if(T[_id].state==1)
  114.             return 1;
  115.     else
  116.             return 0;
  117. }
复制代码
至于使用就简单了:
  1. if(A)  TMR(0,1234);//如果A条件满足,执行软定时器0
  2. if(Tim(0))//软定时器设定时间到
  3. {
  4.    巴拉巴拉;
  5.   Init(0);//初始化软定时器0,下次可以接着用
  6. }
复制代码



回复 送花

使用道具 举报

该用户从未签到

1

主题

1

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-5-11 09:55:56 | 显示全部楼层
看来需要用这个的不多啊
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 157 天

    [LV.7]常住居民III

    25

    主题

    723

    回帖

    1805

    积分

    金牌会员

    积分
    1805
    发表于 2023-5-11 10:13:48 | 显示全部楼层
    这有点类似PLC的定时器
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6611

    积分

    超级版主

    积分
    6611
    发表于 2023-5-11 15:37:43 | 显示全部楼层
    软件定时器,我就用一个timer0,1ms中断,就可以做N多定时器,我一般用倒计时,为0则定时到。
    有人对结构体感冒,我就用普通数组吧,大约如下:
    #define SoftTimerNum   32;   //软件定时器个数
    u8  xdata TimerFlag[SoftTimerNum];   //软件定时器标志, 0: 无事件发生,  1:定时到
    u16  xdata SoftTimer[SoftTimerNum]; //软件定时器倒计时

    使用时,比如用SoftTimer[0];
    SoftTimer[0] = 1000;    //定时1000ms
    查询完成:
    if(TimerFlag[0] == 1)  //定时到
    {
       //处理代码
    }

    Timer0 1ms中断里处理:

    for(i=0;i<SoftTimerNum; i++)
    {
       if(SoftTimer != 0)    //软件定时器计时
       {
           if(--SoftTimer == 0)    TimerFlag = 1;   //定时完成
       }
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-4-11 16:24
  • 签到天数: 52 天

    [LV.5]常住居民I

    13

    主题

    42

    回帖

    331

    积分

    中级会员

    积分
    331
    发表于 2024-2-4 12:55:25 | 显示全部楼层
    梁工 发表于 2023-5-11 15:37
    软件定时器,我就用一个timer0,1ms中断,就可以做N多定时器,我一般用倒计时,为0则定时到。
    有人对结构体 ...

    查询完成:
    if(TimerFlag[0] == 1)  //定时到
    {
       //处理代码
    }

    这段怎么用呢,那不是32个标志位都会执行这个代码,
    还有个问题,我要定时不同的时间,if(SoftTimer != 0)    //软件定时器倒计时
       {
           if(--SoftTimer == 0)    TimerFlag = 1;   //定时完成
       }
    那这段不同的时间都要写一次吗

    点评

    每一个定时都是独立的,你要启用哪个定时,就装一个定时值。 比如用SoftTimer[0],启用时装载定时值: SoftTimer[0] = 1000; //定时1000ms 在定时到时要处理的任务,在任务重查询: if(TimerFlag[0] == 1) /  详情 回复 发表于 2024-2-4 13:03
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6611

    积分

    超级版主

    积分
    6611
    发表于 2024-2-4 13:03:38 | 显示全部楼层
    天源电子 发表于 2024-2-4 12:55
    查询完成:
    if(TimerFlag[0] == 1)  //定时到
    {

    每一个定时都是独立的,你要启用哪个定时,就装一个定时值。
    比如用SoftTimer[0],启用时装载定时值:
        SoftTimer[0] = 1000;    //定时1000ms

    在定时到时要处理的任务,在任务重查询:
    if(TimerFlag[0] == 1)  //定时到
    {
        TimerFlag[0] = 0;
       //处理代码
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 157 天

    [LV.7]常住居民III

    25

    主题

    723

    回帖

    1805

    积分

    金牌会员

    积分
    1805
    发表于 2024-2-4 13:16:44 | 显示全部楼层
    梁工 发表于 2023-5-11 15:37
    软件定时器,我就用一个timer0,1ms中断,就可以做N多定时器,我一般用倒计时,为0则定时到。
    有人对结构体 ...

    梁工,这种的话木有定时器计数值的清零和定时时间的获取吧

    点评

    要清零就直接写0(就是提前主动结束定时器),定时时间的获取是指什么?  详情 回复 发表于 2024-2-4 15:56
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

    积分
    2459
    发表于 2024-2-4 13:19:05 | 显示全部楼层
    jwd 发表于 2024-2-4 13:16
    梁工,这种的话木有定时器计数值的清零和定时时间的获取吧

    源码都给了 想实现什么自己往上加呗
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6611

    积分

    超级版主

    积分
    6611
    发表于 2024-2-4 15:56:45 | 显示全部楼层
    jwd 发表于 2024-2-4 13:16
    梁工,这种的话木有定时器计数值的清零和定时时间的获取吧

    要清零就直接写0(就是提前主动结束定时器),定时时间的获取是指什么?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 157 天

    [LV.7]常住居民III

    25

    主题

    723

    回帖

    1805

    积分

    金牌会员

    积分
    1805
    发表于 2024-2-4 16:02:19 | 显示全部楼层
    梁工 发表于 2024-2-4 15:56
    要清零就直接写0(就是提前主动结束定时器),定时时间的获取是指什么? ...

    类似plc里面的定时器,当某个条件满足时才开始启动软定时器,当条件断开后软定时器需要复位,计数值需要清零;定时时间是当启动某个软定时器后,我可能需要在定时到一定时间后开始某些动作,但是此时此软件定时器还没有到达设定的时间,所以此时标志位不会置位

    点评

    自己的地盘自己说了算,源码在手上,你想怎么玩都可以。 “某个条件满足”,那就加条件判断,满足条件再启动,条件消逝就写0.到某个定时器值就再用另一个定时器配合。MCU编程远比PLC灵活得多。 甚至,你可以使用PLC  详情 回复 发表于 2024-2-4 16:20
    回复 支持 1 反对 0 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-3 14:00 , Processed in 0.085809 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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