查看: 7852|回复: 1

[提问] 读取TH0,TL0的值的问题

[复制链接]
发表于 2012-8-31 11:45:38 | 显示全部楼层 |阅读模式
关键词: 定时器
我写的一个程序,需要读取TH0,TL0的值,用time=256*TH0+TL0;可正确读取,而用time|=TH0;   time<<=8;   time|=TL0;却不能。具体情况如下。
外部中断0和定时器0初始化:
P3=0;
TMOD=0x09;
TH0=0;
TL0=0;
IT0=1;
EA=1;
EX0=1;
TR0=1;
外部中断0服务函数:
void int0() interrupt 0
{
// time|=TH0;
// time<<=8;
// time|=TL0;
time=256*TH0+TL0;
// time_l=TL0;
// time_h=TH0;
// time|=time_h;
// time<<=8;
// time|=time_l;
TH0=0;
TL0=0;
}
我是测试HC-SR04超声波模块,它的输出脚接在P32,会输出一个脉冲,我就是要计算这脉冲的高电平时间。
设定了定时器0的GATE位为1,当P32的高电平开始时,TH0,TL0开始计数,当高电平结束时,产生负跳变,进入中断服务函数,计算时间。
以上就是程序的思路。
问题在于,如果用time=256*TH0+TL0;计算时间,得到的值符合实际,time的值为几百;而如果用此语句的上面三句,或者下面五句(见上面中断服务函数)来计算时间,得到的值不符合实际,time的值为几万。
请各位前辈指点一下,为何会这样?
发表于 2012-9-4 12:17:40 | 显示全部楼层
用time=256*TH0+TL0;可正确读取,而用time|=TH0;   time<<=8;   time|=TL0;却不能。具体情况如下。


纯粹是C语言的问题

因为time在使用之前不为0
那么你执行time|=TH0;语句就不能覆盖原来的数值
假如 time在使用之前是等于0x3
      TH0=0X50;
你执行time|=TH0;
那么time就等于0x53
但是你实际上是想要time=0x50
那么你就把time原来的数值携带了进来

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表