引用 3 楼 jiqiang01234 的回复:
引用楼主 xmjmengmeng 的回复:
我用STC单片机测量频率(0-26HZ).频率信号由外部中断1—INT1引进,采用下降沿触发方式,由TIMER1测量两个下降沿之间的时间。我写的程序只能测量1—3HZ的,频率再高一点就乱跳
下面是我的代码。主程序应该没什么问题,已经调好久了,就是找不出原因,哪位能帮我看看,不胜感激!!
/*********************************************************************************************
定时器一中断程序
********************************************************************************************/
C/C++ codevoid init_TIMER1()
{
TMOD=0x11;//TMOD=#00010001,定时器,工作方式1(16位定时器/计数器)TH1=0x00;
TL1=0x00;
ET1=1;//定时器1开中断TR1=1;//定时器启动计数}
TIMER1_serv() interrupt3
{if(flg==1)
{TF1=0;
t1_cut++; }//TF1=1时,计数溢出}/*************************************************************************************************************
外部中断1
*************************************************************************************************************/void init_INT1()
{
dely(100);
EA=1;//CPU所有中断开 dely(100);
EX1=1;//INT1中断开 dely(100);
IT1=1;//INT1下降沿触发}void INT1_sevr() interrupt2using1
{if(flg==0)
{ puls_1=TH1*256+TL1;
flg=1;
IE1=0;}elseif(flg==1)
{ puls_2=TH1*256+TL1;//TR1=0;//停止计数//ET1=0;//关定时器一
period=65536*t1_cut+ puls_2+0x01- puls_1;
t1_cut=0;
flg=0;
freq=500000/period;
IE1=0;//外部中断一请求标志位清零 }
}
注意一下红色的这两句,我担心可能已经超出了运算范围,从代码里看不到各变量都是什么类型的。
你真的很有经验O(∩_∩)O,这里确实出了个问题
period,freq都定义为unsigned long型,但把puls_1,puls_2定义成了unsigned int 型了,都改成usigend long就好了。
但是又出现了另一个问题,我在显示子程序里面规定,只要频率大于26HZ,指针都转到最大位置,当我每次把频率调到大于25时,指针就归零了。我如果把INT1_serv里面的程序注释掉,直接给freq赋值,比如说:freq=30;IE1=0;指针就可以正确显示到最大。这说明还是测量的频率不对,这是为什么呢?