8051U的定时器竟然用不好了 | 加了静态变量static可以了
试验箱收到了,点灯能成功,想着用定时器点个灯把,竟然定时器用不好了{:4_184:}
代码是不是有问题?
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;
}
}
大神指导一下{:4_196:}
已经自动重装载,就不需要在中断内,重新加载值了吧! soma 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!
中断里面不是要再重新装下初值么 模式0是 16位自动重装载,看下数据手册为好
还可以结合 8位预分频,做24位定时器
我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂 前行者 发表于 2024-9-29 00:25
我按例程又试了一下,定时器中断只能进去一次就不再产生中断了,头大,搞不懂 ...
要不你试一下stcisp软件的定时器计算器小工具。
这种定时器使用我从来都没自己算过,小工具生成代码又快又好用
对比生成代码来看,你这个好像没有初始化清空tf0 a 使用全局变量 直接用官方例程里的定时器初始化函数 本帖最后由 乘风飞扬 于 2024-9-29 09:10 编辑
你是如何判断定时器中断是否产生的?
如果是靠观察P0口是否取反的话,那就是变量 a 的定义问题。
你的 a 是局部变量,是不会持续累加的。
要么定义 a 为全局变量,要么定义为静态变量(前面加 static)。 soma 发表于 2024-9-28 23:22
已经自动重装载,就不需要在中断内,重新加载值了吧!
好好看看文档,有的计时器不支持重载。必须在中断中重新写数据。
页:
[1]
2