找回密码
 立即注册
查看: 854|回复: 15

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:146
  • 最近打卡:2025-04-21 14:46:57

16

主题

55

回帖

557

积分

高级会员

积分
557
发表于 2024-9-28 23:00:48 | 显示全部楼层 |阅读模式
22.jpg

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

代码是不是有问题?

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;
        }
}


大神指导一下


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-9-28 23:22:57 | 显示全部楼层
已经自动重装载,就不需要在中断内,重新加载值了吧!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:146
  • 最近打卡:2025-04-21 14:46:57

16

主题

55

回帖

557

积分

高级会员

积分
557
发表于 2024-9-28 23:36:15 | 显示全部楼层
so*** 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!

中断里面不是要再重新装下初值么
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-9-29 00:03:59 | 显示全部楼层
模式0是 16位自动重装载,看下数据手册为好
还可以结合 8位预分频,做24位定时器

截图202409290006173688.jpg


截图202409290007023254.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:146
  • 最近打卡:2025-04-21 14:46:57

16

主题

55

回帖

557

积分

高级会员

积分
557
发表于 2024-9-29 00:25:46 | 显示全部楼层
我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂

点评

要不你试一下stcisp软件的定时器计算器小工具。 这种定时器使用我从来都没自己算过,小工具生成代码又快又好用 对比生成代码来看,你这个好像没有初始化清空tf0  详情 回复 发表于 2024-9-29 06:09
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-9-29 06:09:51 | 显示全部楼层
前*** 发表于 2024-9-29 00:25
我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2025-05-01 13:11:43

22

主题

283

回帖

901

积分

高级会员

积分
901
发表于 2024-9-29 07:54:22 来自手机 | 显示全部楼层
a 使用全局变量
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:342
  • 最近打卡:2025-04-30 08:26:34
已绑定手机

6

主题

202

回帖

810

积分

高级会员

积分
810
发表于 2024-9-29 08:35:32 | 显示全部楼层
直接用官方例程里的定时器初始化函数
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-9-29 09:00:32 | 显示全部楼层
本帖最后由 乘风飞扬 于 2024-9-29 09:10 编辑

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-9-29 09:23:47 | 显示全部楼层
so*** 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!

好好看看文档,有的计时器不支持重载。必须在中断中重新写数据。

点评

所有定时器均支持16位自动重装  详情 回复 发表于 2024-9-29 10:09
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 00:22 , Processed in 0.139463 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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