前行者 发表于 2024-9-28 23:00:48

8051U的定时器竟然用不好了 | 加了静态变量static可以了



试验箱收到了,点灯能成功,想着用定时器点个灯把,竟然定时器用不好了{:4_184:}

代码是不是有问题?

P40=0;
void Time0_init()                //定时器初始化
{
      TMOD &= 0xf0;                // 0000 0000 ;定时器0工作在模式0;16位自动重装模式
      AUXR |= 0x80;                //1T模式
      
      TH0 = (65536-(MAIN_Fosc/1000))/256;                //把定时初值装入定时器寄存器中
      TL0 = (65536-(MAIN_Fosc/1000))%256;

      EA= 1;                        //打开总中断
      ET0 = 1;                //打开定时器0中断
      TR0 = 1;                //打开定时器0开关,开始运行
}

void Time0() interrupt 1
{
      u16 a;
      TH0 = (65536-(MAIN_Fosc/1000))/256;                //把定时初值放入定时器寄存器中
      TL0 = (65536-(MAIN_Fosc/1000))%256;
      
      a++;
      if(a>=50000)
      {
                a=0;                //清0
                P0 = ~P0;
      }
}


大神指导一下{:4_196:}


soma 发表于 2024-9-28 23:22:57

已经自动重装载,就不需要在中断内,重新加载值了吧!

前行者 发表于 2024-9-28 23:36:15

soma 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!

中断里面不是要再重新装下初值么

神农鼎 发表于 2024-9-29 00:03:59

模式0是 16位自动重装载,看下数据手册为好
还可以结合 8位预分频,做24位定时器






前行者 发表于 2024-9-29 00:25:46

我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂

王昱顺 发表于 2024-9-29 06:09:51

前行者 发表于 2024-9-29 00:25
我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂 ...

要不你试一下stcisp软件的定时器计算器小工具。
这种定时器使用我从来都没自己算过,小工具生成代码又快又好用
对比生成代码来看,你这个好像没有初始化清空tf0

邮箱 发表于 2024-9-29 07:54:22

a 使用全局变量

springvirus 发表于 2024-9-29 08:35:32

直接用官方例程里的定时器初始化函数

乘风飞扬 发表于 2024-9-29 09:00:32

本帖最后由 乘风飞扬 于 2024-9-29 09:10 编辑

你是如何判断定时器中断是否产生的?
如果是靠观察P0口是否取反的话,那就是变量 a 的定义问题。
你的 a 是局部变量,是不会持续累加的。
要么定义 a 为全局变量,要么定义为静态变量(前面加 static)。

liuzonggong 发表于 2024-9-29 09:23:47

soma 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!

好好看看文档,有的计时器不支持重载。必须在中断中重新写数据。
页: [1] 2
查看完整版本: 8051U的定时器竟然用不好了 | 加了静态变量static可以了