51 单片机开发自行车里程测速项目全揭秘
51单片机开发的自行车里程测速项目,包括程序源码和原理图,详细制作说明!使用霍尔传感器获得脉冲信号,对脉冲信号进行计数。实现里程,速度测试和显示。程序源码注释详细最近心血来潮,捣鼓了一个基于 51 单片机的自行车里程测速项目。这个项目挺有趣的,能实时显示自行车的行驶里程和速度,下面就和大家分享一下详细的制作过程,包含程序源码、原理图还有具体的制作说明。
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,displaydistance和display_speed分别用于显示里程和速度。
制作说明
- 硬件安装:把磁体安装在自行车的车轮边缘,霍尔传感器固定在车架上,确保车轮转动时磁体能够靠近霍尔传感器。将 51 单片机开发板、霍尔传感器模块和 LCD1602 按照原理图连接好。
- 程序烧录:使用编程器将上述程序源码烧录到 51 单片机中。
- 测试:转动自行车车轮,观察 LCD1602 上显示的里程和速度是否正常。
通过以上步骤,一个简单的自行车里程测速项目就完成了。这个项目不仅能让我们更好地了解 51 单片机的开发,还能在日常生活中发挥一定的作用。如果你也对单片机开发感兴趣,不妨动手试试这个项目吧!

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



更多推荐



所有评论(0)