江上酒酒 发表于 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);
}

bkeuqoaq 发表于 2024-11-29 16:43:06

if(TF0==20)是什么意思,位变量只能等于1或0

soma 发表于 2024-11-29 16:59:13

TF0==20不可能等于20的,要自建变量来实现长定时。

wlhet 发表于 2024-11-29 17:24:36

每个定时周期到就会进入”zhongduan()“ 这个函数定时周期 * 次数 = 1秒

VCC 发表于 2024-11-29 17:41:22

本帖最后由 VCC 于 2024-11-29 17:53 编辑

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


void zhongduan() interrupt 1
{
    if(TF0){ // 检查TF0是否为1
      P60 = !P60; // 切换P60引脚状态
      TF0 = 0; // 清除溢出标志
    }
}
表现为灯急速闪烁,几乎无法观察

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


#include <STC32G.H>

unsigned char counter = 0; // 定义一个计数器变量

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){ // 检查TF0是否为1
      counter++; // 每次中断增加计数器
      if(counter >= 20){ // 检查计数器是否达到20
            P60 = !P60; // 切换P60引脚状态
            counter = 0; // 重置计数器
      }
      TF0 = 0; // 清除溢出标志
    }
}

void main()
{
    ET0=1; // 使能定时器0中断
    EA=1; // 使能全局中断
    sys_init(); // 系统初始化
    time(); // 初始化定时器
    while(1);
}
另外建议你核实一下你的定时器配置,最好用这个创建




496649247 发表于 2024-11-29 19:32:26

{:4_167:}

tianxu0829 发表于 2024-12-1 15:19:00

bkeuqoaq 发表于 2024-11-29 16:43
if(TF0==20)是什么意思,位变量只能等于1或0

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

神农鼎 发表于 2024-12-1 15:50:35

TF0是个 位标志

江上酒酒 发表于 2024-12-3 21:41:58

感谢

vb2002 发表于 2024-12-14 21:06:58

VCC 发表于 2024-11-29 17:41
根据你的思路,这样可以做到让你的灯每50ms切换一次。




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