89c52的定时器0在开启后无法手工赋初值吗?

桐桐 2011-12-17 12:38:00
问题描述:
因为需要用定时器来计数(非计数器),流程就是:对定时器赋初值→开启定时器→读取TH0和TL0的值→再次对定时器赋初值→再次开启定时器→再次读取TH0和TL0的值。
而现在的问题是,在第二次对定时器赋初值打开定时器(TR0=1)后,读取的定时器值为71,显然和赋的初值65525相差巨大,如果在第二次不开启定时器,则读取的值是正确的,请问这是为何?是否定时器0不支持第二次的手工赋初值,必须在中断里面赋呢?

代码如下:

//变量定义部分
unsigned int i;
//main函数部分
TH0=0xFF;
TL0=0xF6;
TR0=1;//开启定时器
i=TL0;
i+=TH0<<8;
printf("1st is %u\n",i);//这里串行输出的值为65529
DelayMs(200);
TR0=0;
TH0=0xFF;
TL0=0xF5;
TR0=1;//停了后不能开?
i=TL0;
i+=TH0<<8;
printf("2ed is %u\n",i);//按照逻辑应该输出65528,但是实际上输出的值为71或者75
while(1);
...全文
131 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xulidong20090 2011-12-19
  • 打赏
  • 举报
回复
unsigned int i;
//main函数部分
TH0=0xFF;
TL0=0xF6;
TR0=1;//开启定时器
i=TL0;
i+=TH0<<8;
printf("1st is %u\n",i);//这里串行输出的值为65529
DelayMs(200);
ET0=0;//这里加这么一句 关闭中断试试看 应该没问题的
TR0=0;
TH0=0xFF;
TL0=0xF5;
TR0=1;//停了后不能开?
i=TL0;
i+=TH0<<8;
printf("2ed is %u\n",i);//按照逻辑应该输出65528,但是实际上输出的值为71或者75
while(1);
codesnail 2011-12-19
  • 打赏
  • 举报
回复
汽车在行驶过程中不能加油,请先停车,再加油,再行驶。。。
aydf1 2011-12-17
  • 打赏
  • 举报
回复
停了之后,可以再开的,没有问题
桐桐 2011-12-17
  • 打赏
  • 举报
回复
不是软件仿真的哦,之前用了TR0=0,然后再设置值,然后再TR0=1开启,读取的TH0和TL0值依然很乱。
palleexu 2011-12-17
  • 打赏
  • 举报
回复
是不是你的应用中有其他中断?
你关了定时器的同时再禁止下所有中断试一下,重新启动定时器时再开启所有中断。
bjtea 2011-12-17
  • 打赏
  • 举报
回复
你使用了硬件仿真器吗?硬件仿真器的定时器也是不准确的,原因在1L说过了。
顺便说一下,计算定时器的间隔,一般可以记录两点的定时器的值,然后,将两者相减。
桐桐 2011-12-17
  • 打赏
  • 举报
回复
你们能不能说点有用的信息啊?就会重复说没有问题没有问题的!我现在就是遇到问题了,你们这样说能解决吗?!
sjiuoab 2011-12-17
  • 打赏
  • 举报
回复
停了之后,可以再开的,没有问题
桐桐 2011-12-17
  • 打赏
  • 举报
回复
简单来说,现在的问题就是,定时器在没有溢出时,无法给他重新赋值。比如现在定时器正在运行,其值为3210,这时我要定时器重新计数,数值回到0,但是不行,请问这个是51单片机的特性决定的吗?是否无法改变?
bjtea 2011-12-17
  • 打赏
  • 举报
回复
停了之后,可以再开的,没有问题。
如果是12M晶振,也就多了不到100微妙,是不是有中断?
或者你是仿真状态下运行?仿真软件自身占了时间.

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧