专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 单片机

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

发布时间:2010-06-14 16:01:07 文章来源:www.iduyao.cn 采编人员:星星草
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);
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: