永发信息网

51单片机 红外通信 while (!Ir_Pin && (TH0&0x80)==0)怎么理解?

答案:2  悬赏:0  手机版
解决时间 2021-11-29 11:26
  • 提问者网友:寂寞撕碎了回忆
  • 2021-11-28 22:05
51单片机 红外通信 while (!Ir_Pin && (TH0&0x80)==0)怎么理解?
最佳答案
  • 五星知识达人网友:酒醒三更
  • 2021-11-28 22:29
定时器T0应该工作在模式1,16位定时器,也就是说,
while (!Ir_Pin && (TH0&0x80)==0);有两种情况会跳出循环:
1.在指定时间内Ir变高,这个指定时间指在TH0,TL0 < 0x7FFF次定时内。
2.当已经经历了TH0,TL0 > 0x8000次定时后,Ir仍然为低,也跳出循环。
所以说这个程序在已知Ir低电平经历的时间满足2.TH0&0x80 这个表达式的值是如何变化的?
3.在!Ir_Pin为1时,也即 Ir 为低电平时,此时TH0若还在0x80之内,那么 (TH0&0x80)的值不是恒为0吗?不还是无法跳出循环吗?追答1.这个问题不是很清楚
2.&是按位与运算符,
TH0 & 0x80是表达式,当TH0 < 0x80时,结果是 0x00 == 0;
当TH0 >= 0x80时,结果是0x80 != 0。
3.在!Ir_Pin为1时,也即 Ir 为低电平时,此时TH0若还在0x80之内,那么 (TH0&0x80)的值是恒为0。但是定时器是开着的,TH0的值是在递增的,终究会>0x80。所以是不会跳不出循环的。追问1.那如果以后遇到类似的取值的话,我应做何种取值?
2.这是不是意味着,即使Ir是低电平了,也要等到TH0的最高位置1后才会跳出循环?那么,此时得到的时间 T = TH0 * 256 + TL0 这个的取值范围是不是最低也要在TH0 = 1000 的基础上?会不会不准确?追答这个时间是不和具体的应用有关系呢?感觉有点像多任务实时操作系统里的timeout,累计计数肯定是准确的,是由单片机内部的时序保证的,这个你放心。
全部回答
  • 1楼网友:风格不统一
  • 2021-11-28 23:22
首先
TH0 = 0;
TL0 = 0;
TR0 = 1;
打开定时器。
TR0 = 0;
关闭定时器。
return (TH0 * 256 + TL0);
返回时间值。
这些应该都不难理解。
就剩下while (!Ir_Pin && (TH0&0x80)==0);了。
就是当!Ir_Pin或(TH0&0x80)==0只要有一者为假,就跳过while,然后读取时间。
!Ir_Pin是什么?
就是接收头输出高电平为假,即低电平结束。
(TH0&0x80)==0是什么?
TH0&0x80就是定时器高位的最高位,如果它为1,就说明定时器快满了,(TH0&0x80)==0即判断定时器是否要满了,如果要满,就退出while,都取时间。否则接收头持续输出低电平或电路故障,程序就会被卡住,无法继续运行。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯