找回密码
 立即注册
查看: 789|回复: 17

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

521

积分

高级会员

积分
521
发表于 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中断及延时函数,好像不成功        

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

521

积分

高级会员

积分
521
发表于 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;  
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

521

积分

高级会员

积分
521
发表于 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; }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

521

积分

高级会员

积分
521
发表于 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 ; }
}       
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

521

积分

高级会员

积分
521
发表于 2024-9-29 11:48:19 | 显示全部楼层
请哪位大佬帮忙矫正一下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-02 07:55:51
已绑定手机

46

主题

1694

回帖

2544

积分

金牌会员

积分
2544
发表于 2024-9-29 12:48:49 | 显示全部楼层
DHBT*** 发表于 2024-9-29 11:47
用 if for 做过。也不行
void Timer1_Isr(void) interrupt 3
{

你这里中断和delay标志位干仗了吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-9-29 12:57:03 来自手机 | 显示全部楼层
用定时器就不用再用void delayt1_ms(u16 n)了感觉有点重复了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-9-29 14:00:50 | 显示全部楼层
DHBT*** 发表于 2024-9-29 11:43
问题来了。用1ms中断标志位,做的延时函数。反复做不好。看了很多结构。for   if    变量++,都做不好。参 ...

改一下延时函数:
  1. void delayt0_ms(u16 n)
  2. {   
  3.     while(n)
  4.     {
  5.         if(t_a)
  6.         {
  7.             t_a = 0;
  8.             n--;
  9.         }
  10.     }
  11. }
复制代码
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
  • +10

    混四城呢,最重要就是够义气。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2024-9-29 16:05:48 | 显示全部楼层
能不能这样,设置个变量m=0,定时器里面每次m+1,加到N就是Nms,
delay函数里面用while判断变量值m是否>=N,是那就延时到了,m归0,干点啥;
不是就继续死等
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:28
  • 最近打卡:2025-01-08 16:11:02

12

主题

26

回帖

224

积分

中级会员

积分
224
发表于 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;
        }
    }
}


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

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:48 , Processed in 0.204889 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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