51单片机开发的自行车里程测速项目,包括程序源码和原理图,详细制作说明!使用霍尔传感器获得脉冲信号,对脉冲信号进行计数。 实现里程,速度测试和显示。 程序源码注释详细

最近心血来潮,捣鼓了一个基于 51 单片机的自行车里程测速项目。这个项目挺有趣的,能实时显示自行车的行驶里程和速度,下面就和大家分享一下详细的制作过程,包含程序源码、原理图还有具体的制作说明。

项目原理

整个项目的核心在于利用霍尔传感器来获取脉冲信号,然后对这些脉冲信号进行计数。霍尔传感器是一种基于霍尔效应的磁传感器,当有磁体靠近它时,它会输出一个脉冲信号。我们把磁体安装在自行车的车轮上,霍尔传感器固定在车架上,这样车轮每转一圈,霍尔传感器就会输出一个脉冲信号。通过对脉冲信号进行计数,再结合车轮的周长,就可以计算出自行车行驶的里程和速度。

硬件准备

  • 51 单片机开发板(我用的是经典的 STC89C52)
  • 霍尔传感器模块
  • LCD1602 液晶显示屏
  • 若干杜邦线

原理图设计

下面是这个项目的简单原理图:

51 单片机 <---> 霍尔传感器模块
           |
           v
       LCD1602 液晶显示屏

连接说明

  • 霍尔传感器模块的信号输出引脚连接到 51 单片机的外部中断引脚(比如 INT0)。
  • LCD1602 的数据引脚和控制引脚分别连接到 51 单片机的相应引脚。

程序源码及分析

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

// 定义 LCD1602 引脚
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;

// 定义霍尔传感器连接引脚
sbit HALL = P3^2;

// 全局变量
uint pulse_count = 0;  // 脉冲计数
uint distance = 0;     // 里程
float speed = 0;       // 速度

// 函数声明
void delay_ms(uint ms);
void lcd_write_command(uchar command);
void lcd_write_data(uchar dat);
void lcd_init();
void display_distance();
void display_speed();

// 外部中断 0 服务函数
void external_int0() interrupt 0 {
    pulse_count++;  // 每检测到一个脉冲,脉冲计数加 1
}

// 主函数
void main() {
    IT0 = 1;  // 设置外部中断 0 为下降沿触发
    EX0 = 1;  // 使能外部中断 0
    EA = 1;   // 全局中断使能

    lcd_init();  // 初始化 LCD1602

    while(1) {
        // 计算里程,假设车轮周长为 2 米
        distance = pulse_count * 2;

        // 计算速度,这里简单假设每 10 秒计算一次速度
        speed = (float)(pulse_count * 2) / 10;

        display_distance();  // 显示里程
        display_speed();     // 显示速度

        delay_ms(1000);  // 延时 1 秒
    }
}

// 延时函数
void delay_ms(uint ms) {
    uint i, j;
    for(i = 0; i < ms; i++) {
        for(j = 0; j < 123; j++);
    }
}

// 向 LCD1602 写入命令
void lcd_write_command(uchar command) {
    RS = 0;
    RW = 0;
    P0 = command;
    EN = 1;
    delay_ms(5);
    EN = 0;
}

// 向 LCD1602 写入数据
void lcd_write_data(uchar dat) {
    RS = 1;
    RW = 0;
    P0 = dat;
    EN = 1;
    delay_ms(5);
    EN = 0;
}

// 初始化 LCD1602
void lcd_init() {
    lcd_write_command(0x38);  // 8 位数据总线,2 行显示,5x7 点阵
    delay_ms(5);
    lcd_write_command(0x0C);  // 显示开,光标关
    delay_ms(5);
    lcd_write_command(0x06);  // 文字不动,地址自动加 1
    delay_ms(5);
    lcd_write_command(0x01);  // 清屏
    delay_ms(5);
}

// 显示里程
void display_distance() {
    uchar i;
    uchar dis_str[10];

    lcd_write_command(0x80);  // 设置显示地址为第一行首地址
    lcd_write_data('D');
    lcd_write_data('i');
    lcd_write_data('s');
    lcd_write_data('t');
    lcd_write_data('a');
    lcd_write_data('n');
    lcd_write_data('c');
    lcd_write_data('e');
    lcd_write_data(':');

    // 将里程数据转换为字符串
    sprintf(dis_str, "%d m", distance);

    // 显示里程字符串
    for(i = 0; dis_str[i] != '\0'; i++) {
        lcd_write_data(dis_str[i]);
    }
}

// 显示速度
void display_speed() {
    uchar i;
    uchar speed_str[10];

    lcd_write_command(0xC0);  // 设置显示地址为第二行首地址
    lcd_write_data('S');
    lcd_write_data('p');
    lcd_write_data('e');
    lcd_write_data('e');
    lcd_write_data('d');
    lcd_write_data(':');

    // 将速度数据转换为字符串
    sprintf(speed_str, "%.2f m/s", speed);

    // 显示速度字符串
    for(i = 0; speed_str[i] != '\0'; i++) {
        lcd_write_data(speed_str[i]);
    }
}

代码分析

  • 外部中断服务函数 externalint0:当霍尔传感器检测到磁体靠近,产生一个下降沿信号时,会触发外部中断 0,进入这个服务函数。在函数内部,pulsecount 变量会加 1,用来记录脉冲的数量。
  • 主函数 main:首先对外部中断 0 进行初始化,设置为下降沿触发并使能。然后初始化 LCD1602 显示屏。在 while(1) 循环中,不断计算里程和速度,并调用相应的显示函数将数据显示在 LCD 上。
  • 延时函数 delay_ms:用于产生指定毫秒数的延时,在很多操作中都需要用到,比如 LCD 操作时的延时。
  • LCD 相关函数lcdwritecommand 用于向 LCD1602 写入命令,lcdwritedata 用于写入数据,lcdinit 用于初始化 LCD1602,displaydistancedisplay_speed 分别用于显示里程和速度。

制作说明

  1. 硬件安装:把磁体安装在自行车的车轮边缘,霍尔传感器固定在车架上,确保车轮转动时磁体能够靠近霍尔传感器。将 51 单片机开发板、霍尔传感器模块和 LCD1602 按照原理图连接好。
  2. 程序烧录:使用编程器将上述程序源码烧录到 51 单片机中。
  3. 测试:转动自行车车轮,观察 LCD1602 上显示的里程和速度是否正常。

通过以上步骤,一个简单的自行车里程测速项目就完成了。这个项目不仅能让我们更好地了解 51 单片机的开发,还能在日常生活中发挥一定的作用。如果你也对单片机开发感兴趣,不妨动手试试这个项目吧!

51单片机开发的自行车里程测速项目,包括程序源码和原理图,详细制作说明!使用霍尔传感器获得脉冲信号,对脉冲信号进行计数。 实现里程,速度测试和显示。 程序源码注释详细

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐