请教频率检测的问题

[复制链接]
2197|6
 楼主| 51yao 发表于 2008-6-9 09:52 | 显示全部楼层 |阅读模式
各位高手帮个忙,看看这程序,我想实现一个低频率检测的功能,利用周期测量法。但是测出来的周期比预期的要小很多,不知道是哪里出错了?假如我输入一个100HZ的方波,但测出其周期不是10000us,而是180us,差这么多。
awey 发表于 2008-6-9 11:34 | 显示全部楼层

谁知道你的程序是怎么写的?

U2是多余的
 楼主| 51yao 发表于 2008-6-9 11:40 | 显示全部楼层

回楼上

现在是INT1为高时开始计数,为低时进入中断停止计数,并取计数值<br />#include&ltreg52.h&gt<br />#define&nbsp;uint&nbsp;unsigned&nbsp;char<br />sbit&nbsp;P1_0=P2^0;<br />sbit&nbsp;LED=P1^1;<br />sbit&nbsp;int1=P3^3;<br />uint&nbsp;count;<br />double&nbsp;period;<br />bit&nbsp;rflag=0;<br />void&nbsp;control(void)<br />{<br />&nbsp;&nbsp;//&nbsp;LED=0;<br />&nbsp;&nbsp;TMOD=0x90;&nbsp;&nbsp;&nbsp;&nbsp;//定时器1方式1<br />&nbsp;&nbsp;IT1=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下降沿触发<br />&nbsp;&nbsp;TH1=0;TL1=0;&nbsp;&nbsp;//<br />&nbsp;&nbsp;EX1=1;<br />&nbsp;&nbsp;P1_0=0;<br />&nbsp;&nbsp;LED=0;<br />&nbsp;&nbsp;P1_0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//触发器清零<br />&nbsp;&nbsp;TR1=1;<br />&nbsp;&nbsp;ET1=1;EA=1;&nbsp;&nbsp;//启动T/C1开中断<br />}<br />void&nbsp;int_0(void)&nbsp;interrupt&nbsp;2&nbsp;using&nbsp;1<br />{<br />&nbsp;&nbsp;EA=0;TR1=0;<br />&nbsp;&nbsp;count=TL1+TH1*256;&nbsp;&nbsp;&nbsp;&nbsp;//取计数值<br />&nbsp;&nbsp;rflag=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设标志<br />&nbsp;&nbsp;EX1=0;<br />&nbsp;&nbsp;EA=1;<br /><br />}<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;control();<br />&nbsp;&nbsp;while(rflag==0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待一周期<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;period=(double)count/11.0592*12;//period为实际的周期<br />&nbsp;&nbsp;if(count&gt=8000)&nbsp;P1=0xff;<br />&nbsp;&nbsp;else&nbsp;P1=0x00;<br />&nbsp;&nbsp;while(1){EA=0;}<br />&nbsp;&nbsp;<br />}
fei 发表于 2008-6-9 11:48 | 显示全部楼层

我用过可以的啊。采用下降沿触发的话,中断就TR=!TR。

  
 楼主| 51yao 发表于 2008-6-9 11:53 | 显示全部楼层

回楼上

可以将你的图和程序让我参考一下吗?
 楼主| 51yao 发表于 2008-6-10 13:44 | 显示全部楼层

实际烧到板上来就差得很远

大家好,程序经修改,在PROTEUS仿真的时候测量的数据挺准确的,如70KHZ时COUNT值为14,但实际烧到板上来就差得很远,而且无法测出是哪个值?这是为什么?<br />//没触发器<br />#include&ltreg52.h&gt<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />sbit&nbsp;P1_0=P3^4;<br />sbit&nbsp;LED=P1^1;<br />sbit&nbsp;int1=P3^3;<br />sbit&nbsp;LED1=P1^0;<br />sbit&nbsp;LED2=P1^1;<br />sbit&nbsp;LED3=P1^2;<br />uint&nbsp;count;<br />uint&nbsp;i;<br />double&nbsp;period;<br />bit&nbsp;rflag=0;<br />void&nbsp;control(void)<br />{<br />&nbsp;&nbsp;TMOD=0x10;&nbsp;&nbsp;&nbsp;&nbsp;//定时器1方式1,不受GATE影响<br />&nbsp;&nbsp;IT1=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下降沿触发<br />&nbsp;&nbsp;TH1=0;TL1=0;&nbsp;&nbsp;//<br />&nbsp;&nbsp;P1_0=0;<br />&nbsp;&nbsp;P1_0=1;<br />&nbsp;&nbsp;EX1=1;<br />&nbsp;&nbsp;ET1=1;&nbsp;&nbsp;//启动T/C1开中断<br />}<br />void&nbsp;int_1(void)&nbsp;interrupt&nbsp;2&nbsp;using&nbsp;1<br />{<br />&nbsp;&nbsp;if(i==0)<br />&nbsp;&nbsp;{TR1=1;i++;}//启动定时器计数<br />&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;{EA=0;TR1=0;<br />&nbsp;&nbsp;&nbsp;count=TL1+TH1*256;&nbsp;&nbsp;&nbsp;&nbsp;//取计数值<br />&nbsp;&nbsp;&nbsp;//count=TH1;<br />&nbsp;&nbsp;&nbsp;//count=count&lt&lt8;<br />&nbsp;&nbsp;&nbsp;rflag=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设标志<br />&nbsp;&nbsp;&nbsp;EX1=0;}<br />}<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;control();<br />&nbsp;&nbsp;P2=0xf0;<br />&nbsp;&nbsp;P1=0xf0;<br />&nbsp;&nbsp;EA=1;<br />&nbsp;&nbsp;//TH1=8;<br />&nbsp;&nbsp;//count=TH1;<br />&nbsp;&nbsp;//count=count&lt&lt8;<br />&nbsp;&nbsp;//TH1=2;TL1=3;<br />&nbsp;&nbsp;//count=TH1*256+TL1;<br />&nbsp;&nbsp;while(rflag==0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待一周期&nbsp;<br />&nbsp;&nbsp;period=(double)count/11.0592*12/2;//period为实际的周期<br />&nbsp;&nbsp;//if(count&gt=(3645))&nbsp;P1=0xff;&nbsp;&nbsp;//500HZ:不对<br />&nbsp;&nbsp;//if(count&lt=(3649))&nbsp;&nbsp;P2=0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(count&gt=14)&nbsp;LED1=1;//&nbsp;70KHZ,p1.0<br />&nbsp;&nbsp;&nbsp;&nbsp;if(count&lt=15)&nbsp;LED2=1;//p1.1<br />&nbsp;&nbsp;else&nbsp;LED3=1;//p1.2<br />&nbsp;&nbsp;while(1){EA=0;}<br />&nbsp;&nbsp;<br />}
sjl2006 发表于 2008-6-17 11:04 | 显示全部楼层

re楼主:定时器溢出考虑了吗?

在每次定时器溢出中断中把一个寄存器加一,把该寄存器+TH+TL作为三个字节整体考虑,脉冲时间用三字节相减。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

148

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部