基于单片机的自行车里程表设计|附源码

基于单片机的自行车里程表设计

源码:点击下载源码

项目简介

这是一个基于51单片机的自行车里程表设计项目,能够实时显示自行车的行驶速度、累计里程,并提供时间显示、超速报警等功能。该项目适合作为单片机课程设计的学习案例,涵盖了多种常用外设的驱动与应用。

功能特点

  • 实时速度显示:通过检测车轮转动计算当前行驶速度(km/h)
  • 累计里程记录:自动累计行驶里程,支持数据掉电保存
  • 时间日期显示:集成DS1302实时时钟,显示年/月/日/时/分/秒/星期
  • 超速报警:可设置安全速度阈值,超速时蜂鸣器报警
  • 参数设置:支持按键设置车轮半径、安全速度、时间等参数
  • 数据持久化:使用AT24C02 EEPROM存储设置参数和里程数据

系统架构

硬件组成

模块 型号/说明
主控芯片 STC89C52/AT89S52系列单片机
显示模块 LCD1602液晶显示屏
时钟模块 DS1302实时时钟芯片
存储模块 AT24C02 EEPROM存储器
传感器 霍尔传感器/光电传感器(检测车轮转动)
报警模块 蜂鸣器

软件模块

复制代码
源程序/
├── mabiao.c      # 主程序文件
├── Data.h        # 数据定义头文件
├── Ds1302.h      # DS1302时钟驱动
├── AT24C02.h     # EEPROM驱动
└── STARTUP.A51   # 启动文件

核心代码解析

速度与里程计算原理

速度计算基于车轮转动检测:每当车轮转动一圈,传感器产生一个脉冲信号触发外部中断。系统在500ms时间窗口内统计脉冲数量,结合车轮周长计算速度。

c 复制代码
// 速度计算公式
Velocity = count * 2 * 3.14 * RADIUS / 100000 * 2 * 3600 / 40;
// count: 500ms内脉冲数
// RADIUS: 车轮半径(cm)
// 结果单位: km/h

里程累计通过定时器中断每500ms更新一次:

c 复制代码
// 里程累计
Mileage = Mileage + 10 * (Velocity/3.6) / 2;
// Velocity/3.6: 将km/h转换为m/s

DS1302时钟驱动

DS1302是一款低功耗实时时钟芯片,通过三线接口(RST、SCK、SDA)与单片机通信:

c 复制代码
sbit SCK = P1^1;    // 时钟信号
sbit SDA = P1^2;    // 数据线
sbit RST = P1^3;    // 复位/使能信号

// 写入一字节数据
void Ds1302_Write_Byte(unsigned char addr, unsigned char d);

// 读取一字节数据
unsigned char Ds1302_Read_Byte(unsigned char addr);

AT24C02 EEPROM驱动

AT24C02提供2KB的非易失性存储空间,使用I2C协议通信:

c 复制代码
sbit sda = P1^7;    // I2C数据线
sbit scl = P1^6;    // I2C时钟线
sbit WP  = P1^5;    // 写保护引脚

// 写入指定地址
void write_add(uchar address, uchar date);

// 读取指定地址
uchar read_add(uchar address);

存储的数据包括:

  • 地址0x01:车轮半径
  • 地址0x02:安全速度阈值
  • 地址0x03-0x05:里程数据(高/中/低字节)

LCD1602显示驱动

LCD1602是一款常用的16x2字符液晶屏,通过并行接口驱动:

c 复制代码
sbit rs = P1^4;     // 数据/指令选择
sbit en = P1^0;     // 使能信号

// 写指令
void write_1602com(uchar com);

// 写数据
void write_1602dat(uchar dat);

系统还实现了自定义字符功能,用于显示星期一到星期七的中文数字:

c 复制代码
uchar code num[] = {
    0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00, // 一
    0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00, // 二
    ...
};

按键功能说明

按键 功能
K1 进入/切换时间设置模式
K2 加调整(设置参数时)
K3 减调整(设置参数时)
K4 进入/退出自行车参数设置(半径、安全速度)
K2+K3 清零里程(同时按下)

显示界面

正常显示模式

复制代码
第一行:14/09/10 16:34 三
第二行:123.456km 25km/h

参数设置模式

复制代码
第一行:Wheel Radius  35cm
第二行:Safe Speed  30km/h

项目资源

本项目包含完整的开发资源:

  • 源程序:Keil C51工程文件,可直接编译生成HEX文件
  • 原理图:完整的电路原理图(PDF/DOCX格式)
  • PCB设计:Altium Designer工程文件,包含PCB布局和焊接图
  • Proteus仿真:可直接运行的仿真文件,验证系统功能
  • 设计论文:详细的设计文档和论文资料

学习价值

该项目适合作为单片机入门到进阶的学习项目,涵盖以下知识点:

  1. 单片机基础:中断系统、定时器、IO口操作
  2. 外设驱动:LCD1602、DS1302、AT24C02等常用芯片
  3. 通信协议:I2C协议、三线串行通信
  4. 系统设计:模块化程序设计、状态机思想
  5. 实际应用:传感器信号处理、数据计算与显示

适用场景:单片机课程设计、毕业设计、电子制作学习

源码:点击下载源码

相关推荐
Teleger14 小时前
在window上使用c++控制鼠标点击,实现的exe
c++·单片机·计算机外设
源码之家15 小时前
计算机毕业设计:Pyhon健康数据分析系统 Django框架 数据分析 可视化 身体数据分析 大数据(建议收藏)✅
大数据·python·数据挖掘·数据分析·django·lstm·课程设计
黑白园17 小时前
STM32F103ZET6移植-电机2804-驱动板SimpleFOC Mini实现速度开环_位置开环控制(一、硬件介绍及接线)
stm32·单片机·嵌入式硬件
星夜夏空9917 小时前
STM32单片机学习(12)——串口通信相关概念
stm32·单片机·学习
Stream_Silver17 小时前
【 libusb4java实战:跨平台USB设备通信完全指南】
java·笔记·嵌入式硬件·microsoft
黑白园17 小时前
STM32F103ZET6移植-电机2804(星型接法)-驱动板SimpleFOC Mini实现速度开环_位置开环控制(四、功能演示)
stm32·单片机·嵌入式硬件
Jack_022018 小时前
基于51单片机的停车场刷卡进出计费设计
单片机·嵌入式硬件·51单片机
振浩微433射频芯片18 小时前
433射频方案在远距离工业遥控中的应用解析:从TM-03到RM521的成熟之道
网络·单片机·嵌入式硬件·物联网·智能家居
Hello_Embed18 小时前
libmodbus 移植到 STM32H5
笔记·stm32·单片机·嵌入式硬件·嵌入式·ai编程
REDcker18 小时前
嵌入式MCU内存布局详解 Flash SRAM Keil MAP与启动分散加载实践
单片机·嵌入式硬件