当前位置: 代码迷 >> 单片机 >> 89c52的定时器0在开启后无法手工赋初值吗?解决思路
  详细解决方案

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

热度:292   发布时间:2016-04-28 16:34:52.0
89c52的定时器0在开启后无法手工赋初值吗?
问题描述:
因为需要用定时器来计数(非计数器),流程就是:对定时器赋初值→开启定时器→读取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);


------解决方案--------------------
停了之后,可以再开的,没有问题。
如果是12M晶振,也就多了不到100微妙,是不是有中断?
或者你是仿真状态下运行?仿真软件自身占了时间.

------解决方案--------------------
是不是你的应用中有其他中断?
你关了定时器的同时再禁止下所有中断试一下,重新启动定时器时再开启所有中断。
------解决方案--------------------
汽车在行驶过程中不能加油,请先停车,再加油,再行驶。。。
------解决方案--------------------
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;[color=#FF0000][/color]//这里加这么一句 关闭中断试试看 应该没问题的
TR0=0;
TH0=0xFF;
TL0=0xF5;
TR0=1;//停了后不能开?
i=TL0;
i+=TH0<<8;
printf("2ed is %u\n",i);//按照逻辑应该输出65528,但是实际上输出的值为71或者75
while(1);