测转速程序,请教高手

06050341   2008-6-10 12:52 楼主
请教,我做了一个测转速的程序,可是由于本人刚学不常时间有好多问题还不是很明白,请教高手指点!
我的思路是测一个脉冲的宽度,然后用time0测出时间,再倒成转速…… 可是它不显示!请教高手指点问题在哪里?

/***************************************************************/
/*                                                             */
/*                      转速表                                       */
/*                                                             */
/***************************************************************/
#pragma DEBUG CODE
#include

sbit CS1 = P3^7;
sbit CS2 = P3^3;
sbit CS3 = P3^2;
sbit pin_SpeedSenser = P3^5; //速度接在P3^5上

#define TIME_CYLC 300 //12M晶振,定时器10ms 中断一次 我们3秒计算一次转速
                      // 3000ms/10ms = 300
#define K 1       //校准系数

unsigned char code seven_seg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71};
                              // 0    1     2    3    4    5    6    7    8    9    F  
unsigned char data Disbuf[3]={0,0,0};// 显示缓冲区
unsigned int Tcounter = 0;   //时间计数器

bit Flag_Fresh = 0;  // 刷新标志
bit Flag_count = 0;  //计算转速标志
bit Flag_Err = 0;    //超量程标志

void Display();        //在数码管上显示一个三位数
void CountSpeed();     //计算转速,并把结果放入数码管缓冲区
void init_timer0();    //初始化定时器T0
void init_timer1();    //初始化定时器T1
void period();         //计算一个脉冲的周期

/**************************** 延时函数 ***********************************/
void Delay()
{
  unsigned char i,j;
    for(i=0;i<50;i++)
           for(j=0;j<50;j++);
}
/**************************** 定时器T0中断 *******************************/
void it_timer0() interrupt 1
{
  TF0 = 0;       // 定时器T0 用于数码管的动态刷新

  TH0 = 0xC0;
  TL0 = 0x00;
  Flag_Fresh = 1;
}
/**************************** 计数器T1中断 *********************************/
/*void it_timer1() interrupt 3
{
   TF1 = 0;      
   Flag_Err = 1;
     
}
/*************************** 主函数 ****************************************/
void main(void)
{
   init_timer0();
   init_timer1();

  while(1)
     {

     if(Flag_Fresh)
        {
          Flag_Fresh = 0;
          Display();    // 定时刷新数码管显示
        };    // 定时刷新数码管显示
     period();

     if(Flag_count)
        {
          Flag_count = 0;
          CountSpeed(); //计算转速,并把结果放入数码管缓冲区  

          TH0=TL0 = 0x00;
   
         }
     if(Flag_Err)        //超量程处理
        {            
         Disbuf[0] = 0x71;
         Disbuf[1] = 0x71;
         Disbuf[2] = 0x71;
         while(1)
           {
            Display();//不再测速 等待复位i
           }
         }

      }
}


/***********************在数码管上显示一个三位数**************************/
void Display()
{
  unsigned int i;
  for(i=0;i<3;i++)
         {
          switch(i)
           {
                    case 0: CS1=0;CS2=1;CS3=1;break;
                    case 1: CS1=1;CS2=0;CS3=1;break;
                    case 2: CS1=1;CS2=1;CS3=0;
           }
          P1=seven_seg[Disbuf];
          Delay();
       }

}

/******************计算转速,并把结果放入数码管缓冲区*************************/
void CountSpeed()
{
  unsigned int period;
  unsigned int speed ;

  period = TH0*256 + TL0;

  speed = (K/period)*(1E6);//K是时间系数
  
  Disbuf[0] = speed/100;
  Disbuf[1] = (speed-Disbuf[0]*100)/10;
  Disbuf[2] = speed-Disbuf[0]*100-Disbuf[1]*10;
}
/***************************** 初始化定时器T0 *******************************/
void init_timer0()
{
//  TMOD &= 0xD8;         
//  TMOD |= 0xF0;              /* GATE0=0; C/T0#=0; M10=0; M00=1; */
         
  TMOD |= 0x01;
  TH0 = 0x00;
  TL0 = 0x00;  
  ET0=1;
  TR0=1;
  EA=1;
}

/************************ 初始化定时器T1 **********************************/
void init_timer1()
{
  TMOD=0x90;               /* GATE0=0; C/T0#=1; M10=0; M00=1; */

  TH1 = 0x00;
  TL1 = 0x00;  
  ET1=1;
  TR1=0;              
  EA=1;  
}

/************************ 初始化定时器T1 **********************************/
void period(void)
  {
                //定时器/计数器1为方式1,GATE=1
   TL1=0x00;
   TH1=0x00;
   while (pin_SpeedSenser==1);        //等待低脉冲的到来
   TR1=1;                  //GATE=1,TR1=1,当P3_7(INT1)=1开始计数
   while (pin_SpeedSenser==0);        //等待正脉冲的到来
   while (pin_SpeedSenser==1);
   TR1=0;
   Flag_count = 1;   
   }


回复评论 (2)

1、满足香农原理
2、其实你可以读取电平值,然后异或累加就可以实现测速

你这个方法不是很好
点赞  2008-6-13 14:55
LZ你这个方法很笨

在单位时间内厕脉冲数就好了
点赞  2008-6-13 19:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复