lgwd 发表于 2024-2-20 01:24:11

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

使用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中断

王昱顺 发表于 2024-2-20 05:31:58

运行应该是没问题的。但是请注意,程序中使用的auxintif在某些单片机系列中是只写寄存器,
你如读他,可能不是你预测的值,如逻辑判断不合理,你程序写的不好可能就会自己在那永远循环等待。

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

电子DIY小家 发表于 2024-2-20 08:07:58

个人建议可以考虑一个定时器作为基准时间计时,或者直接荣rtc来长时间计时,这样用显得有点浪费定时器了

21cnsound 发表于 2024-2-20 08:49:47

如,楼上所说,建议楼主优化定时器的使用技巧。

lgwd 发表于 2024-2-20 14:16:40

谢谢楼上行家的回复!正在使用STC8H8K64U,定时器3/4都没有使用。长时间定时使用的不多,尝试用定时器3。

lgwd 发表于 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的延时。

神农鼎 发表于 2024-2-20 22:55:28








页: [1]
查看完整版本: 请帮忙检查使用定时器3制作的定时器程序对不对?