定时器延时函数求助 | 已解决
定时器中断输出P20=1可以.... 自己写了个定时器延时函数,不能过。哪位大佬,看一下,什么问题?void main()
{
{ SYS_Ini();
Timer0_Init();
T imer1_Init();
P20 = 0; //可以到这里
delayt0_ms(300);// 这个不能过
P20 = 1;
delayt0_ms(500);
}
}
后面发定时器1ms中断及延时函数,好像不成功
定时器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;
} 问题来了。用1ms中断标志位,做的延时函数。反复做不好。看了很多结构。for if 变量++,都做不好。参照别人做了个while。好像又不行。下面是延时函数,不知道哪里出了问题
void delayt0_ms(u16 n)
{
t_a == 1;
while(s_a<n)
{s_a=0; s_a++;t_a = 0; }
} 用 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:47
用 if for 做过。也不行
void Timer1_Isr(void) interrupt 3
{
你这里中断和delay标志位干仗了吧 用定时器就不用再用void delayt1_ms(u16 n)了感觉有点重复了。 DHBT2023 发表于 2024-9-29 11:43
问题来了。用1ms中断标志位,做的延时函数。反复做不好。看了很多结构。for if 变量++,都做不好。参 ...
改一下延时函数:
void delayt0_ms(u16 n)
{
while(n)
{
if(t_a)
{
t_a = 0;
n--;
}
}
}
能不能这样,设置个变量m=0,定时器里面每次m+1,加到N就是Nms,
delay函数里面用while判断变量值m是否>=N,是那就延时到了,m归0,干点啥;
不是就继续死等 程序问题:
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