找回密码
 立即注册
查看: 596|回复: 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
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

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

使用道具 举报 送花

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

19

主题

3190

回帖

4870

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-04-30 08:40:57
已绑定手机

15

主题

630

回帖

730

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 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
  • 打卡总天数:108
  • 最近打卡:2025-04-28 08:34:00
已绑定手机

5

主题

118

回帖

674

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-04-30 08:09:24

1

主题

30

回帖

1519

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 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 | 显示全部楼层
感谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 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-5-2 13:17 , Processed in 0.141955 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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