51单片机做的速度计,超简单

2020-01-23 14:45发布

小弟不才,第一次发表主题,欢迎大家拍砖指正,这是用51单片机做的速度计,不要用于商业用途哦;
程序如下;

//速度计,外中断1;定时器0,
//8位计数模式,11.0592,每一秒钟计算一次

#include <reg52.h>     //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
void delay(uint z);

uchar stor[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示
void xuanshi( );
int temp,n,tt;

sbit P10=P1^0;
sbit P11=P1^1;

void main(void)        // 主程序
{
        TMOD=0x02;//定时器0方式2
        TH0=0x47;//赋T0的预置值,溢出1次是0.2毫秒钟
        TL0=0x47;
        ET0=1; //允许定时器0中断  
        TR0=1; //启动定时器0

        IT1=1; //外中断1 ,负跳变产生中断
        EX1=1;        //允许外中断

        EA=1;     //打开总中断

        while(1)  //主程序循环
        {               


   xuanshi();


                   }        }


void xuanshi()
{  
          
         P0=stor[temp/1000];
         P3=0xef;
         delay(1);
         P0=stor[temp%1000/100];
         P3=0xdf;
         delay(1);
     P0=stor[temp%100/10];
         P3=0xbf;
         delay(1);
     P0=stor[temp%10];
          P3=0x7f;
     delay(1);  


}

void int2() interrupt 2  //外中断1计数
{

  n++;       

}



void timer0() interrupt 1  //定时器0中断处理,中断5000次是一秒钟
{


        tt++;
        if(tt==5000)
        {tt=0;temp=n;n=0;}

           }


void delay(unsigned int i)      //延时程序,i是形式参数,i为1时 延时约1MS
{
unsigned int j;
for(;i>0;i--)             //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++)        
{;}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
40条回答
xiaobendan
1楼-- · 2020-01-24 01:34
商业的不是这样用的
中断服务中没有任何的消除抖动的方法,干扰是会有的,跳变的抖动也会有的,如此出来的结果不是乱了套了?
lin1936
2楼-- · 2020-01-24 05:58
回复【5楼】deiwgah
-----------------------------------------------------------------------

其实这还不算是速度计,只能算是计数率,要做成速度计的还得将得到的计数率的值乘以圆周径,现在我把程序再修改一下,见8楼
lin1936
3楼-- · 2020-01-24 06:55
//速度计,外中断1;定时器0,
//8位计数模式,11.0592,每一秒钟计算一次

#include <reg52.h>     //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#define pi 3.1415926  //增加部分π的值
void delay(uint z);

uchar stor[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示
void xuanshi( );
int temp,n,tt;
int R ;//增加部分,半径值

sbit P10=P1^0;
sbit P11=P1^1;

void main(void) // 主程序
{
TMOD=0x02;//定时器0方式2
TH0=0x47;//赋T0的预置值,溢出1次是0.2毫秒钟
TL0=0x47;
ET0=1; //允许定时器0中断   
TR0=1; //启动定时器0

IT1=1; //外中断1 ,负跳变产生中断
EX1=1; //允许外中断

EA=1;     //打开总中断

while(1)  //主程序循环
{


   xuanshi();


            } }


void xuanshi()
{   
   
P0=stor[temp/1000];
P3=0xef;
delay(1);
P0=stor[temp%1000/100];
P3=0xdf;
delay(1);
     P0=stor[temp%100/10];
P3=0xbf;
delay(1);
     P0=stor[temp%10];
  P3=0x7f;
     delay(1);   


}

void int2() interrupt 2  //外中断1计数
{

  n++;

}



void timer0() interrupt 1  //定时器0中断处理,中断5000次是一秒钟
{


tt++;
if(tt==5000)
{tt=0;temp=(n-1)*2*pi*R;n=0;} //已修改n-1的原因是由于霍尔传感器测量两次相当于转了一圈2*pi*R是轮周径

    }


void delay(unsigned int i)      //延时程序,i是形式参数,i为1时 延时约1MS
{
unsigned int j;
for(;i>0;i--)             //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++)         
{;}
}
lin1936
4楼-- · 2020-01-24 10:51
回复【7楼】xiaobendan 仲跻东
-----------------------------------------------------------------------

这是DIY用于自行车等测速,负跳变中断,用霍尔传感器,我做过实验,基本没有抖动,用的霍尔传感器是从散热风扇(直流无刷电机,上面要有位置传感器)上面拆下来的
pxlpxlpxl
5楼-- · 2020-01-24 15:46
 精彩回答 2  元偷偷看……
oufuqiang
6楼-- · 2020-01-24 17:42
这个坛子里已经有比较成熟的方案了。我发那个电动车板的,只要轮胎转动超过一个磁极就能知道速度了。

一周热门 更多>