找回密码
 立即注册
查看: 1085|回复: 6

请帮忙检查使用定时器3制作的定时器程序对不对?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-06-26 21:14:10

49

主题

129

回帖

1125

积分

金牌会员

积分
1125
发表于 2024-2-20 01:24:11 | 显示全部楼层 |阅读模式
使用STC8H8K64U的定时器3写了一段定时器程序。恳请请行家指点对不对。程序如下:
void delayS(u8 delaysvalue)       //delaysvalue参数为输入的整数秒值,例如1秒、2秒、5秒、6秒等。
{
      u8 i ;
       
        TM3PS = 14 ;                                     //这是根据晶振11059200,通过预分频,使得定时器一个周期为1秒。
  
//          T3_VALUE = 65536-XTAL/(TM3PS+1)/12 ;           //1秒定时参数计算公式
        T3H = 0x10 ;                                     //计算的定时1秒值
          T3L = 0x00 ;                                     //计算的定时1秒值
        T4T3M = 0x08 ;                                   //启动T3定时器
    for (i=0;i<delaysvalue;i++)                         //根据需要延时的秒数循环
    {         
        while( ~(0x02 & AUXINTIF) );                 //等待定时器3中断。检测T3IF中断请求。
    }
    T4T3M &= ~0x08 ;                                   //停止T3运行
}

void TM3_Isr() interrupt 19                          //定时器3中断服务子程序,同时硬件清除T3的中断标志
{
                                                     //其它什么都没有做
}

编译没有问题和警告。但上述程序能否正确运行不太踏实?在循环等待检测T3IF中断请求语句,会不会死循环?
主程序中已经设定:
    IE2 |=0x02 ;                                     //允许定时器3中断,没有中断优先级设定。
    EA = 1     ;                                     //开CPU中断
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-06-28 10:05:05
已绑定手机
已实名认证

113

主题

2423

回帖

6147

积分

版主

积分
6147
发表于 2024-2-20 05:31:58 | 显示全部楼层
运行应该是没问题的。但是请注意,程序中使用的auxintif在某些单片机系列中是只写寄存器,
你如读他,可能不是你预测的值,如逻辑判断不合理,你程序写的不好可能就会自己在那永远循环等待。

比如stc8h1k08和28系列。具体请参考技术手册的中断请求寄存器的注意事项部分
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-06-19 15:40:05

47

主题

1350

回帖

8056

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8056
QQ
发表于 2024-2-20 08:07:58 | 显示全部楼层
个人建议可以考虑一个定时器作为基准时间计时,或者直接荣rtc来长时间计时,这样用显得有点浪费定时器了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-29 06:25:44
已绑定手机

14

主题

1322

回帖

3420

积分

论坛元老

积分
3420
发表于 2024-2-20 08:49:47 | 显示全部楼层
如,楼上所说,建议楼主优化定时器的使用技巧。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-06-26 21:14:10

49

主题

129

回帖

1125

积分

金牌会员

积分
1125
发表于 2024-2-20 14:16:40 | 显示全部楼层
谢谢楼上行家的回复!正在使用STC8H8K64U,定时器3/4都没有使用。长时间定时使用的不多,尝试用定时器3。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-06-26 21:14:10

49

主题

129

回帖

1125

积分

金牌会员

积分
1125
发表于 2024-2-20 21:57:15 | 显示全部楼层
    定时器3延时程序实际测试结果表明,语句“while( ~(0x02 & AUXINTIF) );”会导致死循环!
        延时程序中的for循环部分改为如下:
        for (i=0;i<delaysvalue;i++)
    {         
    //        while( ~(0x02 & AUXINTIF) );                       //等待定时器3中断。检测T3IF中断请求
                    while( ~tm3intflag );              //设置了一个全局位变量:t3mintflag。初始化为0,在中断服务程序中修改
                    tm3intflag = 0 ;                    //自定的TM3中断标志清零
                   View( i );                              //编制的CDC串口输出子程序,调用以显示中断是否正常。
    }
       
        设置了一个全局位变量:t3mintflag。初始化为0,在“void TM3_Isr() interrupt 19”中断服务程序中置1:
        void TM3_Isr() interrupt 19                                //定时器3中断服务子程序,同时硬件清除T3的中断标志
      {
            tm3intflag = 1 ;                                       //TM3中断标志置位
     }
  
      程序按上述修改后才可以正常运行。推测应该是TM3中断程序在前清零了中断标志,导致“while( ~(0x02 & AUXINTIF) );”始终检测不到中断发生。
     自己设定的中断标志,才能实现定时器3的延时。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-29 00:35:48

740

主题

1万

回帖

1万

积分

管理员

积分
17153
发表于 2024-2-20 22:55:28 | 显示全部楼层
截图202402202254545389.jpg

截图202402202255236634.jpg


截图202402202256107736.jpg

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 06:35 , Processed in 0.964379 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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