基于51单片机的霍尔自行车里程测速仪

硬件方案

        以 51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 数码管实时显示自行车的里程数及速度。利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。
        整体电路主要由51单片机最小系统,霍尔传感器电路,数码管显示电路,lm393比较电路,LED指示灯模块,按键电路;原理图如图:

设计功能

  • 51单片机作为控制核心,驱动显示模块,驱动按键模块等,并利用霍尔传感器与磁铁获取脉冲信号。
  • 4位共阳数码管为速度,距离显示模块,速度单位为 km/h,距离单位是 km。
  • 设有一个按键来切换显示速度和距离。


主程序源码

//====================================主函数=========================================================
void main()
{
    time0_int0_init();//定时器0和外部中断0的初始化
    while(!TR0)    //上电一直未切割时就显示  0.0.0.0 
    {
        init_display();
    }
    while(1)
    {
        if(!change)//按下切换按键显示里程
        {
            delay1m(5);
            if(!change)
            { 
                flag = ~flag;
            }
            while(!change);        
        }
     
    }
}

//==================================定时器0中断函数================================
void time0_interrupt()interrupt 1 
{
    TL0 = (65536 - 5000) % 256;// 12M晶振,5ms定时
    TH0 = (65536 - 5000) / 256;
    display_function();
    time_counter++;
    time_counter8++;
    if(time_counter8 >= 1600)//大于8s没切割,车子视为停下了,速度为:0,但里程还记着
    {
        time_counter8 = 0;
        speed = 0;//速度为 0
        point1 = 0;
        buf1[3] = speed%10;buf1[2] = speed/10%10;
        buf1[1] = speed/100%10;buf1[0] = speed/1000%10;
    }
}
//==================================外部中断0中断函数=========================
void int0_interrupt()interrupt 0
{    
    
    external_counter++;
    if(external_counter ==1 )TR0 = ~TR0;//第一次切割打开定时器0
    if(external_counter == 65535)external_counter = 0;
    time_counter8 = 0; //只要8秒内有切割,车子就任在运行
    
    if(external_counter % 2 == 0)//切割2次 更新下速度
    {                                     //*5是因为中断一次是5MS
         if(flag1==0){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}
        else if(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(time_counter * 5);}//速度:单位为 m/h ,*1000的目的是不出现浮点数
        
        if((speed >= 100)&&(speed < 1000))     //100 ---- 1000       3位整数
        {
            point1 = 1;buf1[3] = speed%10;buf1[2] = speed/10%10;
            buf1[1] = speed/100%10;buf1[0] = 0;}
        else if((speed >= 1000)&&(speed < 10000))   //1000 ---- 10000        4位整数
        {
            point1 = 1;speed = (uint)speed;
            buf1[3] = speed%10;buf1[2] = speed/10%10;
            buf1[1] = speed/100%10;buf1[0] = speed/1000%10;}
        else if((speed >= 10000)&&(speed < 100000))      //10000 ----- 100000      5位整数
        {
            point1 = 2;
            buf1[3] = speed/10%10;buf1[2] = speed/100%10;
            buf1[1] = speed/1000%10;buf1[0] = speed/10000%10;}
        else if((speed >= 100000)&&(speed < 1000000))  //100000 ------ 1000000    6位整数
        {
            point1 = 3;
            buf1[3] = speed/100%10;buf1[2] = speed/1000%10;
            buf1[1] = speed/10000%10;buf1[0] = speed/100000%10;} 
        time_counter = 0;
    }
    if(external_counter % 8 == 0)//每切割8次 更新下里程
    {
         s = (ulong)external_counter * zhouchang;  //里程:单位为   cm
        if((s >= 1000)&&(s < 10000))
        {
            point2 = 1;                                                   //  0.012    001212
            buf2[3] = s/100%10;buf2[2] = s/1000%10;
            buf2[1] = 0;buf2[0] = 0;}//   4位整数
        else if((s >= 10000)&&(s < 100000))
        {
            point2 = 1;
            buf2[3] = s/100%10;buf2[2] = s/1000%10;
            buf2[1] = s/10000%10;buf2[0] = 0;}//     5位整数       0.123     012345
        else if((s >= 100000)&&(s < 1000000))
        {
            point2 = 1;
            buf2[3] = s/100%10;buf2[2] = s/1000%10;
            buf2[1] = s/10000%10;buf2[0] = s/100000%10;} //    6位整数     1.234    1234 56
        else if((s >= 1000000)&&(s < 10000000))
        {
            point2 = 2;
            buf2[3] = s/1000%10;buf2[2] = s/10000%10;
            buf2[1] = s/100000%10;buf2[0] = s/1000000%10;}//     7位整数      1234 567
        else if((s >= 10000000)&&(s < 100000000))
        {
            point2 = 3;
            buf2[3] = s/10000%10;buf2[2] = s/100000%10;
            buf2[1] = s/1000000%10;buf2[0] = s/10000000%10;} //     8位整数         1234 5678
    }
}

资料链接:https://pan.baidu.com/s/1KYMELeBD3SB86bnx_GpLzQ?pwd=srsu 
提取码:srsu

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值