DHBT2023 发表于 2024-9-29 11:35:37

定时器延时函数求助 | 已解决

定时器中断输出P20=1可以.... 自己写了个定时器延时函数,不能过。哪位大佬,看一下,什么问题?


void main()
      {
          {                SYS_Ini();
                     Timer0_Init();
               T   imer1_Init();
                              P20 = 0; //可以到这里
                        delayt0_ms(300);// 这个不能过
                              P20 = 1;
                            delayt0_ms(500);
                   }      
   }      
后面发定时器1ms中断及延时函数,好像不成功      

DHBT2023 发表于 2024-9-29 11:38:41

定时器1ms这个是可以的,P20=1放他中断里,可以
void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;       
        AUXR|= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x40;    //TL0 = j;//;                                //设置定时初始值
        TH0 = 0xA2;    //TH0 = i;//                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
EA=1;
       
}
void Timer0_Isr(void) interrupt 1
{
t_a = 1;

DHBT2023 发表于 2024-9-29 11:43:32

问题来了。用1ms中断标志位,做的延时函数。反复做不好。看了很多结构。for   if    变量++,都做不好。参照别人做了个while。好像又不行。下面是延时函数,不知道哪里出了问题
void delayt0_ms(u16 n)
{   
t_a == 1;
        while(s_a<n)
        {s_a=0; s_a++;t_a = 0; }
}

DHBT2023 发表于 2024-9-29 11:47:28

用 if for 做过。也不行
void Timer1_Isr(void) interrupt 3
{
        t_t=1;
}
void delayt1_ms(u16 n)
{   
if(t_t==1 )
        {for (t_b=0;t_b< n; t_b++)
                     t_t = 0 ; }
}       

DHBT2023 发表于 2024-9-29 11:48:19

请哪位大佬帮忙矫正一下。

jwd 发表于 2024-9-29 12:48:49

DHBT2023 发表于 2024-9-29 11:47
用 if for 做过。也不行
void Timer1_Isr(void) interrupt 3
{


你这里中断和delay标志位干仗了吧

soma 发表于 2024-9-29 12:57:03

用定时器就不用再用void delayt1_ms(u16 n)了感觉有点重复了。

乘风飞扬 发表于 2024-9-29 14:00:50

DHBT2023 发表于 2024-9-29 11:43
问题来了。用1ms中断标志位,做的延时函数。反复做不好。看了很多结构。for   if    变量++,都做不好。参 ...
改一下延时函数:
void delayt0_ms(u16 n)
{   
    while(n)
    {
      if(t_a)
      {
            t_a = 0;
            n--;
      }
    }
}

wangxiangtan 发表于 2024-9-29 16:05:48

能不能这样,设置个变量m=0,定时器里面每次m+1,加到N就是Nms,
delay函数里面用while判断变量值m是否>=N,是那就延时到了,m归0,干点啥;
不是就继续死等

Shoteen 发表于 2024-9-29 17:17:56

程序问题:
1.main函数没有加while(1)循环,main函数里的语句会重复执行,也就是说你的初始化操作一直在跑。
2.其次delay延时,既然用了定时器,就没有必要再用软件延时的方法。
3.确定一下T0定时器的中断频率,24Mhz、1T模式下要设置1ms定时,如果是stc32g12k128,建议设置TM0PS定时器0分频为24,让定时器为1Mhz计数,然后把TH0和TL0改成FC18H,这样可以设置T0定时器为
1ms中断一次。
4.最后,这个延时逻辑我觉得完全不对,可能是我的思考逻辑不一样。
下面是示例代码:
void main(void)
{
    SYS_Ini();
    Timer0_Init();
    Timer1_Init();

    //请确保P20已经初始化为准双向口模式,默认情况下上电,芯片为高阻输入。
    while(1)
    {
      P20 = 0;
      delay_ms(300);
      P20 = 1;
      delay_ms(500);
    }
}

void Timer0_Init()
{
    TM0PS = 0x18;      
    AUXR|= 0x80;                           //定时器时钟1T模式
    TMOD &= 0xF0;                        //设置定时器模式16位自动重载
    TL0 = 0x18;                              //设置定时初始值
    TH0 = 0xFC;                           //设置定时初始值
    TF0 = 0;                                  //清除TF0标志
    ET0 = 1;                                  //使能定时器0中断
    TR0 = 1;                                  //定时器0开始计时
    EA=1;
}

unsigned char TimerFlag;               //定时器计时标志
unsigned long TimerCounter;          //定时器目标计数值

void delay_ms(unsigned long ms)
{
    TimeCounter = ms;   //设置延时时间
    TimerFlag = 1;         //开始计时
    while(TimerFlag!=0);//等待计时完毕,中断内部每经过1ms就会执行TimerCounter--操作,直到减为0,main的线程里面检测到则退出,执行下一步。
}

void Timer0_ISRHandler() interrupt 1
{
    if(TimerFlag == 1)
    {
      TimeCounter--;
      if(TimeCounter == 0)
      {
             TimerFlag = 0;
      }
    }
}


回答的不够全面,如有问题,欢迎指出,谢谢!

页: [1] 2
查看完整版本: 定时器延时函数求助 | 已解决