定时器
使用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);
}
if(TF0==20)是什么意思,位变量只能等于1或0 TF0==20不可能等于20的,要自建变量来实现长定时。 每个定时周期到就会进入”zhongduan()“ 这个函数定时周期 * 次数 = 1秒 本帖最后由 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);
}
另外建议你核实一下你的定时器配置,最好用这个创建
{:4_167:} bkeuqoaq 发表于 2024-11-29 16:43
if(TF0==20)是什么意思,位变量只能等于1或0
有没有可能 TF0是单片机里面的一个寄存器? TF0是个 位标志
感谢 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