找回密码
 立即注册
查看: 1519|回复: 16

定时器

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-01-05 14:16:57

30

主题

132

回帖

214

积分

中级会员

积分
214
发表于 2024-11-29 16:22:09 | 显示全部楼层 |阅读模式
使用STC32G12K128试验箱,用T0定时器,周期是1秒,P60亮灭,但下载程序后一直没反应


#include <STC32G.H>
#include <INTRINS.H>
unsigned int i,j;
void sys_init()
{
        P4M0=0X00;P4M1=0X00;P6M0=0X00;P6M1=0X00;P40=0;WTST=0X00;EAXFR=1;
}
void time()
{
        TM0PS=0;TMOD=0X00;TH0=0X3C;TL0=0XB0;TF0=0;TR0=1;
}
void zhongduan() interrupt 1
{
        if(TF0==20){P60=!P60;TF0=0;}
}
void main()
{
                ET0=1;
        EA=1;
        sys_init();
        time();
        while(1);
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:149
  • 最近打卡:2025-10-17 08:32:11
已绑定手机

18

主题

502

回帖

1734

积分

金牌会员

积分
1734
发表于 2024-11-29 16:43:06 | 显示全部楼层
if(TF0==20)是什么意思,位变量只能等于1或0
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:590
  • 最近打卡:2025-10-17 00:00:27
已绑定手机

19

主题

3269

回帖

6044

积分

论坛元老

积分
6044
发表于 2024-11-29 16:59:13 | 显示全部楼层
TF0==20不可能等于20的,要自建变量来实现长定时。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:188
  • 最近打卡:2025-10-11 08:46:41
已绑定手机

15

主题

624

回帖

856

积分

高级会员

积分
856
发表于 2024-11-29 17:24:36 | 显示全部楼层
每个定时周期到就会进入”zhongduan()“ 这个函数  定时周期 * 次数 = 1秒
STC 666 888
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-09-03 12:23:58
已绑定手机

60

主题

776

回帖

4025

积分

论坛元老

自定义头衔

积分
4025
发表于 2024-11-29 17:41:22 | 显示全部楼层
本帖最后由 VCC 于 2024-11-29 17:53 编辑

根据你的思路,这样可以做到让你的灯每50ms切换一次。


  1. void zhongduan() interrupt 1
  2. {
  3.     if(TF0){ // 检查TF0是否为1
  4.         P60 = !P60; // 切换P60引脚状态
  5.         TF0 = 0; // 清除溢出标志
  6.     }
  7. }
复制代码

表现为灯急速闪烁,几乎无法观察

如果你想每20次,灯切换一次的话,代码要复杂一点点


  1. #include <STC32G.H>
  2. unsigned char counter = 0; // 定义一个计数器变量
  3. void sys_init()
  4. {
  5.     P4M0=0X00; P4M1=0X00; P6M0=0X00; P6M1=0X00; P40=0; WTST=0X00; EAXFR=1;
  6. }
  7. void time()
  8. {
  9.     TM0PS=0; TMOD=0X00; TH0=0X3C; TL0=0XB0; TF0=0; TR0=1;
  10. }
  11. void zhongduan() interrupt 1
  12. {
  13.     if(TF0){ // 检查TF0是否为1
  14.         counter++; // 每次中断增加计数器
  15.         if(counter >= 20){ // 检查计数器是否达到20
  16.             P60 = !P60; // 切换P60引脚状态
  17.             counter = 0; // 重置计数器
  18.         }
  19.         TF0 = 0; // 清除溢出标志
  20.     }
  21. }
  22. void main()
  23. {
  24.     ET0=1; // 使能定时器0中断
  25.     EA=1; // 使能全局中断
  26.     sys_init(); // 系统初始化
  27.     time(); // 初始化定时器
  28.     while(1);
  29. }
复制代码

另外建议你核实一下你的定时器配置,最好用这个创建

截图202411291753107567.jpg


联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:118
  • 最近打卡:2025-10-15 13:08:19
已绑定手机

5

主题

117

回帖

724

积分

高级会员

积分
724
发表于 2024-11-29 19:32:26 | 显示全部楼层
高级软件工程师-唐工
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-10-17 08:18:17

2

主题

40

回帖

1670

积分

金牌会员

积分
1670
发表于 2024-12-1 15:19:00 | 显示全部楼层
bkeu*** 发表于 2024-11-29 16:43
if(TF0==20)是什么意思,位变量只能等于1或0

有没有可能 TF0是单片机里面的一个寄存器?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:210
  • 最近打卡:2025-10-17 09:12:44

787

主题

1万

回帖

1万

积分

管理员

积分
19792
发表于 2024-12-1 15:50:35 | 显示全部楼层
TF0是个 位标志
截图202412011552121739.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-01-05 14:16:57

30

主题

132

回帖

214

积分

中级会员

积分
214
发表于 2024-12-3 21:41:58 | 显示全部楼层
感谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:517
  • 最近打卡:2025-10-17 00:00:02
已绑定手机

154

主题

1889

回帖

2625

积分

金牌会员

积分
2625
发表于 2024-12-14 21:06:58 | 显示全部楼层
VC*** 发表于 2024-11-29 17:41
根据你的思路,这样可以做到让你的灯每50ms切换一次。

TF0不是自动清零吗?
我搜定时器搜到了这个
void Timer0_Isr(void) interrupt 1
{
TF0=1;
TF0=0;
}
然后在主函数里面判断 if (TF0==1) 执行命令,然后TF0=0;
这样应该也可以把.
省掉一个bit flag
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-17 10:26 , Processed in 0.162560 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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