各位高手,看看这51程序,为啥要乘上500000?
发布网友
发布时间:2022-05-04 23:18
我来回答
共3个回答
热心网友
时间:2022-06-27 02:20
并非“51的指令周期的缘故”,你要看清楚你自己的程序,
while(input==0); //检测输入电平信号
while(input==1); //这里信号已经完成了一个信号周期,但你没管它
TR0=1; // 高电平结束后,开启定定时器
while(input==0);
while(input==1); //这里是第二个信号周期,你才去做计数
TR0=0; //下一个高电平结束后,关断定时器
这里你虽然是检测了一个信号周期没有错,但你是每过两个信号周期才检测一次信号,比如说如果你输入的是一个周期1s的信号,实际上你相当于在检测一个周期2s的信号,所以在你用(TH0*256+TL0)*0.000001计算到周期之后还要除2才能得到正确的周期(TH0*256+TL0)*0.000001/2,那么频率就是1/(TH0*256+TL0)*0.000001/2=500000/(TH0*256+TL0)追问你好,你说的这点我也注意到了,程序是在下降沿开始的时候开启定时器,在高电平结束的时候关断定时器。这样计数器的值就是一整个周期所对应的数值啊。将数值换算成时间,得到的周期就是(TH0*256+TL0)*0.000001(单位s),频率就是1/(TH0*256+TL0)*0.000001,不该再除以2啊
热心网友
时间:2022-06-27 02:21
频率 F=1/T;
你算出的(TH0*256+TL0)*1000000是周期多少秒,程序中是500000除以周期,1/(TH0*256+TL0)的单位是Mhz,换算为HZ是1/(TH0*256+TL0)*10000000,但是因为51的指令周期的缘故就是1000000/2,所以就成500000了。明白了吗?希望帮到你追问非常感谢,前部分分析的很透彻。但你说的“51的指令周期的缘故”,这个缘故怎么导致需要除以2了?难道指令周期会影响计数器数值吗?敬请明示!
追答不是做了个加法和除法吗?我忘了51的加法指令周期是多少,你查下
热心网友
时间:2022-06-27 02:21
方波要注意占空比,也就是说按高低各占一半来看。就是一半了。追问看来您是高手,但程序中定时器数值对应的确实是一个周期啊。
追答您的单片机中断只能检测到低电平的那一段,也就是半个周期