独闷闷网

 找回密码
 立即注册
搜索
查看: 2456|回复: 0
收起左侧

[原创] 如何在一个定时中断里衍生出多个软件定时器?已解答。

[复制链接]
发表于 2014-11-14 21:38:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2014-11-14 23:17 编辑

苏畅 -江苏:
嗯……红外信号检测和超声波信号检测……定时器中断定时用了好几个?  

鸿哥-深圳:
不要用那么多定时器中断。用一个就好了。一个定时器中断就可以当N多定时器来用。

华菲-山东:
那是怎么做的,求解,鸿哥。

苏畅 -江苏:
……发射超声波要定时,另外还要定时计算反射信号到达时间……查询中断也要定时……查询之前消除干扰改得定时1.5ms  

Inc-东莞:
鸿哥,上课时间到了。


鸿哥-深圳:
比如:
  1. void T0_time() interrupt 1
  2. {
  3.   TF0=0;  //清除中断标志
  4.   TR0=0; //关中断
  5.   ++uiTimeCnt1; //定时1
  6.   ++uiTimeCnt2; //定时2
  7.   ++uiTimeCnt3; //定时3
  8.   ++uiTimeCntN; //定时N

  9.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
  10.   TL0=0x2f;
  11.   TR0=1;  //开中断
  12. }
复制代码

在一个系统里,最好只用一个定时器中断,如果你开的定时器中断越多越是兵家大忌,就像在主函数循环不能轻易用delay延时一样。如果非要用很多定时器中断,那么宁愿多加几个单片机进行多机通讯,这样相当于几个核CPU。所以说,虽然stm32很多定时器中断,但是你不要都打开呀,用一个就好了。

苏畅 -江苏:
你意思用一个定时器初值一样的,溢出次数不同……可以定时1、2、3……N  

鸿哥-深圳:
对。

Inc-东莞:
软件定时器。
苏畅 -江苏:
定时器启动时间相同,延时不一样,关中断的时间也不一样……怎么办?而且接收到检测信号时怎么重新启动定时器呢……   

鸿哥-深圳:
再添加一个开关变量来控制定时器的是否计时,
  1. void T0_time() interrupt 1
  2. {
  3.   TF0=0;  //清除中断标志
  4.   TR0=0; //关中断
  5.   if(ucStart1==1)  //开关变量
  6.   {
  7.      ++uiTimeCnt1; //定时1
  8.   }
  9.   if(ucStart2==1)  //开关变量
  10.   {
  11.      ++uiTimeCnt2; //定时2
  12.   }


  13.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
  14.   TL0=0x2f;
  15.   TR0=1;  //开中断
  16. }
复制代码


苏畅 -江苏:
不好意思!辛苦你!原来每个溢出次数可以通过开关分开管理……我下次专门去把帖上的讲解存下来,以后多理解你讲的内涵 。太精彩了!   





乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-9-29 09:09 , Processed in 0.148749 second(s), 18 queries .

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