关于霍尔测速的问题

2019-03-24 18:32发布

本人刚学单片机不久,想用霍尔传感器41F(开关型)测下电机速度为以后做准备。我的硬件部分已没问题,现在说说程序的问题。我将信号输出接到单片机P3^5即T1口,用T0作定时器,T1作计数器,在一定时间内计数霍尔元件产生的脉冲,从而得到速度。下面是我的程序:
#include<reg51.h>#define uchar unsigned char
#define uint unsigned int
#define led P1
sbit dula=P2^6;         //U1寄存器
sbit wela=P2^7;        //U2寄存器
uint z=0;            
uint code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
    0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                                                                  
  uint data  chushi=600;                                                                                                                  
  //====================================================
  void init(void)           //定义名为init的初始化子函数
  {                    //init子函数开始,分别赋值
   TMOD=0X51;            //GATE  C/T  M1  M0  GATE  C/T  M1  M0  计数器T1 定时器T                //  0     1   0   1    0     0   0   1
   TH1=0;                //计数器T1初始值
   TL1=0;
   TH0=(65536-50000)/256;    //定时器t0  定时50ms
   TL0=(65536-50000)%256;     
   EA=1;                       // IE=0X00;     //EA  -  ET1  ES  ET1  EX1  ET0  EX0
   ET0=1;                                     // 1  0    0   0    0    0      1   0
   TR1=1;
   TR0=1;
   }
   //=============================================
   void delay(uint k)        //延时程序
   {
            uint  i,j;
           for(i=0;i<k;i++)
            
         for(j=0;j<110;j++);
         
   }

//================================================
  void display(uint numdis)
{
    uint m,n,s,k;
    m=numdis/1000;
    n=numdis%1000/100;
        s=numdis%100/10;
        k=numdis%10;
    dula=1;
        P0=table[m];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(2);

        dula=1;
        P0=table[n];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(2);

              dula=1;
        P0=table;
       dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(2);

        dula=1;
        P0=table[k];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(2);
}                             //数码管显示函数
   //=========================================
   void main(void)                 //主程序开始
   {       led=0xff;
            init();
           while(1)
           {   
                   z=(TH1<<8)+TL1;
               display(z);
        
           }
                             //无限循环语句,等待中断
         }                                                        
//===================================================
void time(void)        interrupt 1 using 0
{        
         
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        chushi--;
        if(chushi<=0)     
     {
            led=~led;  // LED以周期1分钟闪烁,作为指示灯
            TH1=0;
            TL1=0;                 //清零计数器
            chushi=600;         //50ms*600=30s
          }
         
           
}
通过实验,我观察到每次计数到4000左右便清零,我想问下这4000多是不是一分钟计数?还有是不是马达每转一周就产生一个脉冲?另外,我想通过按键来查询上一次最后计数是四千几,或者通过延时来读出准确数值。哪位大神能帮忙解决下,小弟不胜感激! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。